马彼得季博达叶旦腾 發表於 2019-12-10 21:45:00

React实现导出功能

<div>1、React导出excel功能</div>
<div>
<div class="cnblogs_code">
<pre>&lt;Button colors="primary" onClick={_this.export}&gt;<span style="color: rgba(0, 0, 0, 1)">
   导出
</span>&lt;/Button&gt;
export=()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
      let searchObj </span>=<span style="color: rgba(0, 0, 0, 1)"> {searchMap:{}};
      let {searchMap} </span>= searchObj;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询条件</span>
      let downUrl = `api/export`
<span style="color: rgba(0, 0, 0, 1)">      exportFile(downUrl,{searchMap})
}</span></pre>
</div>
</div>
<div>1&gt; 使用Blob对象,从服务器接收到的文件流创建了一个blob对象,并使用该blob创建一个指向类型数组的URL,将该url作为a标签的链接目标,</div>
<div>然后去触发a标签的点击事件从而实现表格下载导出函数代码如下</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> exportFile(url, data) {
    axios({
      method: </span>'post'<span style="color: rgba(0, 0, 0, 1)">,
      url: url,
      data: data,
      responseType: </span>'blob'<span style="color: rgba(0, 0, 0, 1)">
    }).then((res) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const content </span>=<span style="color: rgba(0, 0, 0, 1)"> res.data;
      const blob </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Blob();
      const fileName </span>= "导出数据.xls"<span style="color: rgba(0, 0, 0, 1)">;
      const selfURL </span>= window;
      let elink </span>= document.createElement('a'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ('download' <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> elink) {
            elink.download </span>=<span style="color: rgba(0, 0, 0, 1)"> fileName;
            elink.style.display </span>= 'none'<span style="color: rgba(0, 0, 0, 1)">;
            elink.href </span>= selfURL['createObjectURL'<span style="color: rgba(0, 0, 0, 1)">](blob);
            document.body.appendChild(elink);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 触发链接</span>
<span style="color: rgba(0, 0, 0, 1)">            elink.click();
            selfURL.revokeObjectURL(elink.href);
            document.body.removeChild(elink)
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            navigator.msSaveBlob(blob, fileName);
      }
    })
}</span></pre>
</div>
<p>&nbsp;2&gt; 使用form表单,采用GET方法,参数通过input值传给后台,接收后台返回的文件流直接下载,这里注意后台接收不能用注解requestBody,而是用注解requestParam,而且url过长,不友好</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">exportFile(url, data) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">data是post请求需要的参数,url是请求url地址</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> form = document.createElement("form"<span style="color: rgba(0, 0, 0, 1)">);
      form.style.display </span>= "none"<span style="color: rgba(0, 0, 0, 1)">;
      form.action </span>=<span style="color: rgba(0, 0, 0, 1)"> url;
      form.method </span>= "get"<span style="color: rgba(0, 0, 0, 1)">;
      document.body.appendChild(form);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 动态创建input并给value赋值</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> data) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> input = document.createElement("input"<span style="color: rgba(0, 0, 0, 1)">);
      input.type </span>= "hidden"<span style="color: rgba(0, 0, 0, 1)">;
      input.name </span>=<span style="color: rgba(0, 0, 0, 1)"> key;
      input.value </span>=<span style="color: rgba(0, 0, 0, 1)"> params;
      form.appendChild(input);
      }

      form.submit();
      form.remove();
}</span></pre>
</div>
<p>&nbsp;</p>
</div><br><br>
来源:https://www.cnblogs.com/zhangyaolan/p/11918234.html
頁: [1]
查看完整版本: React实现导出功能