大玮 發表於 2019-8-24 10:52:00

javascript导出csv文件(excel)

<p>这里贴出JavaScript导出csv文件(excel)的代码。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 导出excel
* @param {Object} title      标题列key-val
* @param {Object} data         值列key-val
* @param {Object} fileName   文件名称
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> JSONToExcelConvertor(title, data, fileName) {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> CSV = ''<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; title.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
            row </span>+= title.title + ','<span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    row </span>= row.slice(0, -1<span style="color: rgba(0, 0, 0, 1)">);
    CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; data.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> j = 0; j &lt; title.length; j++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
                row </span>+= '"' + (data.field] ? data.field] : "") + '"\t,'<span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      row.slice(</span>0, row.length - 1<span style="color: rgba(0, 0, 0, 1)">);
      CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CSV == ''<span style="color: rgba(0, 0, 0, 1)">) {
      alert(</span>"Invalid data"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">var</span> fileName =<span style="color: rgba(0, 0, 0, 1)"> fileName;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> uri = 'data:text/csv;charset=utf-8,\ufeff' +<span style="color: rgba(0, 0, 0, 1)"> encodeURI(CSV);
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> link = document.createElement("a"<span style="color: rgba(0, 0, 0, 1)">);
    link.href </span>=<span style="color: rgba(0, 0, 0, 1)"> uri;

    link.style </span>= "visibility:hidden"<span style="color: rgba(0, 0, 0, 1)">;
    link.download </span>= fileName + ".csv"<span style="color: rgba(0, 0, 0, 1)">;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}</span></pre>
</div>
<p>上面的写法,如果excel中的数据太多,就会导致无法导出的结果,原因是浏览器对URL的长度有限制,因此要使用Blob对象和window.URL.createObjectURL()方法做一下改造。</p>
<p>window.URL.createObjectURL()方法可以直接生成blob:开头的链接,该链接产生于浏览器端,不会占用服务器资源。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 导出excel
* @param {Object} title      标题列key-val
* @param {Object} data         值列key-val
* @param {Object} fileName   文件名称
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> JSONToExcelConvertor(title, data, fileName) {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> CSV = ''<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; title.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
            row </span>+= title.title + ','<span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    row </span>= row.slice(0, -1<span style="color: rgba(0, 0, 0, 1)">);
    CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; data.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> j = 0; j &lt; title.length; j++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
                row </span>+= '"' + (data.field] ? data.field] : "") + '"\t,'<span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      row.slice(</span>0, row.length - 1<span style="color: rgba(0, 0, 0, 1)">);
      CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CSV == ''<span style="color: rgba(0, 0, 0, 1)">) {
      alert(</span>"Invalid data"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">var</span> fileName =<span style="color: rgba(0, 0, 0, 1)"> fileName;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> uri = <span style="color: rgba(0, 0, 255, 1)">new</span> Blob(['\ufeff' + CSV], {type:"text/csv"<span style="color: rgba(0, 0, 0, 1)">});
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> link = document.createElement("a"<span style="color: rgba(0, 0, 0, 1)">);
    link.href </span>=<span style="color: rgba(0, 0, 0, 1)"> URL.createObjectURL(uri);

    link.style </span>= "visibility:hidden"<span style="color: rgba(0, 0, 0, 1)">;
    link.download </span>= fileName + ".csv"<span style="color: rgba(0, 0, 0, 1)">;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}</span></pre>
</div>
<p>然而,虽然window.URL.createObjectURL()方法在IE10、 IE11以及Microsoft Edge中能生成的blob:链接,但是却不能把它加到一个&lt;a&gt;节点上,也不能直接在浏览器地址栏打开访问,否则会得到【SCRIPT5:拒绝访问。】错误。甚至,IE9根本不支持调用window.URL.createObjectURL()方法创建Blob URLs。</p>
<p>Microsoft Internet Explorer / Microsoft Edge和高大上的Google Chrome / Mozilla Firefox对于window.URL.createObjectURL()方法创建Blob链接最直观的区别在于得到的blob:链接形式不一样,分别在微软浏览器和标准浏览器中运行new Blob()代码,会得到两种Blob链接形式,第一种为chrome和firefox生成的带有当前域名的标准blob:链接形式,第二种为Microsoft IE和Microsoft Edge生成的不带域名的blob:链接。那么我们就可以通过window.URL.createObjectURL(new Blob()) . indexOf(location.host) &lt; 0表达式来检测是否是IE或早期生成Object URL不带域名的Edge,如果表达式返回true则是IE或Edge旧版本。</p>
<p>事实上,Blob URL不被支持是出于IE浏览器对安全性的考虑(IE浏览器真安全啊,牛逼),然后它自己提供了一套API用来创建或下载Blob文件:msSaveOrOpenBlob。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 导出excel
* @param {Object} title      标题列key-val
* @param {Object} data         值列key-val
* @param {Object} fileName   文件名称
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> JSONToExcelConvertor(title, data, fileName) {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> CSV = ''<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; title.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
            row </span>+= title.title + ','<span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    row </span>= row.slice(0, -1<span style="color: rgba(0, 0, 0, 1)">);
    CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; data.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> row = ""<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> j = 0; j &lt; title.length; j++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(title.title){
                row </span>+= '"' + (data.field] ? data.field] : "") + '"\t,'<span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      row.slice(</span>0, row.length - 1<span style="color: rgba(0, 0, 0, 1)">);
      CSV </span>+= row + '\r\n'<span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CSV == ''<span style="color: rgba(0, 0, 0, 1)">) {
      alert(</span>"Invalid data"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">var</span> fileName =<span style="color: rgba(0, 0, 0, 1)"> fileName;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> uri = <span style="color: rgba(0, 0, 255, 1)">new</span> Blob(['\ufeff' + CSV], {type:"text/csv"<span style="color: rgba(0, 0, 0, 1)">});

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (window.navigator &amp;&amp; window.navigator.msSaveOrOpenBlob) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for IE</span>
<span style="color: rgba(0, 0, 0, 1)">      window.navigator.msSaveOrOpenBlob(CSV, fileName + ".csv");
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span> { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for Non-IE(chrome、firefox etc.)</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> link = document.createElement("a"<span style="color: rgba(0, 0, 0, 1)">);
      link.href </span>=<span style="color: rgba(0, 0, 0, 1)"> URL.createObjectURL(uri);

      link.style </span>= "visibility:hidden"<span style="color: rgba(0, 0, 0, 1)">;
      link.download </span>= fileName + ".csv"<span style="color: rgba(0, 0, 0, 1)">;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    }
}</span></pre>
</div>
<p>因此就得出上面最终的代码。</p>
<p>&nbsp;</p>
<p>"就算临别也要通电话。"</p>

</div>
<div id="MySignature" role="contentinfo">
    你要去做一个大人,不要回头,不要难过。<br><br>
来源:https://www.cnblogs.com/yanggb/p/11387661.html
頁: [1]
查看完整版本: javascript导出csv文件(excel)