前后端导出/下载excel方法

一、通过后端处理导出

1.) 后端响应头设置

前端若想下载一个根据查询参数生成的excel报表文件,需要后端设置请求内容的类型,具体设置如下:

    response.reset();
    response.setContentType("application/vnd.ms-excel;charset=utf-8"); // 表明是excel类型
    //response.setContentType("application/octet-stream");  // 或设成通用二进制流类型
    response.setHeader("Content-Disposition", "attachment;filename=test.xls"));  // 将请求的内容存为一个名为test的文件
2.) 前端相应的代码

正常情况下,用以下两种方法均可:

window.open('/url/download?param=xxx')
window.location = '/url/download?param=xxx'   // 不加href,是因为有些浏览器有兼容问题

但如果window.open是在一个ajax回调里执行,浏览器会被安全拦截,解决方案:

$.ajax({
    ....
    success: function() {
        var win = window.open()
        win.location = '/url/download?param=xxx'
    }
})

或直接用window.location

$.ajax({
    ....
    success: function() {
        window.location = '/url/download?param=xxx'
    }
})

二、前端直接将json数据处理成excel文件

具体完整代码如下:

<button onclick='tableToExcel()'>json导出xls文件</button>
<script>
  function tableToExcel() {
      var jsonData = [{
          name: '路人甲',
          phone: '123456',
          email: '123@123456.com'
      }, {
          name: '炮灰乙',
          phone: '123456',
          email: '123@123456.com'
      }]

      //列标题
      var table = '<tr><td>姓名</td><td>电话</td><td>邮箱</td></tr>'

      //循环遍历,每行加入tr标签,每个单元格加td标签
      jsonData.forEach(function(item) {
          table += '<tr>';
          for (let key in item) {
              //增加\t为了不让表格显示科学计数法或者其他格式
              table += `<td>${item[key] + '\t'}</td>`
          }
          table += '</tr>';
      })

      //Worksheet名
      var worksheet = 'Sheet1'
      //下载的表格模板数据
      var template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" 
                            xmlns:x="urn:schemas-microsoft-com:office:excel" 
                            xmlns="http://www.w3.org/TR/REC-html40">
                        <head>
                          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                          <!--[if gte mso 9]>
                          <xml>
                            <x:ExcelWorkbook>
                              <x:ExcelWorksheets>
                                <x:ExcelWorksheet>
                                  <x:Name>${worksheet}</x:Name>
                                  <x:WorksheetOptions>
                                    <x:DisplayGridlines/>
                                  </x:WorksheetOptions>
                                </x:ExcelWorksheet>
                              </x:ExcelWorksheets>
                            </x:ExcelWorkbook>
                          </xml>
                          <![endif]-->
                        </head>
                        <body>
                          <table>${table}</table>
                        </body>
                      </html>`
      // 下载模板
      window.location.href = 'data:application/vnd.ms-excel;base64,' + base64(template)
  }
  //输出base64编码
  function base64(s) { return window.btoa(unescape(encodeURIComponent(s))) }
</script>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前后端导出Excel文件有两种实现方式。 第一种是在前端直接将页面上的DOM元素打印到Excel文件。这种方式适用于所有数据在当前页面展示的情况。可以使用Vue自带的方法,将页面上的DOM元素转换成Excel表格,并保存为Excel文件。具体实现代码如下: ``` export function exportDomToXlsx(dom, name) { const table_book = XLSX.utils.table_to_book(dom, { raw: true }) const table_write = XLSX.write(table_book, { bookType: 'xlsx', bookSST: true, type: 'array' }) try { FileSaver.saveAs( new Blob([table_write], { type: 'application/octet-stream' }), name + '.xlsx' ) } catch (e) { console.log(e, table_write) } } ``` 这个方法会将指定的DOM元素转换成Excel文件,并以给定的文件名保存。 第二种方式是在某些场景下,比如要导出的数据列表是分页的,或者需要导出的数据需要从后端获取的情况下,需要通过调用后端接口来实现导出。这种方式需要前后端分离,前端调用后端接口来获取导出的数据并生成Excel文件。 综上所述,前后端导出Excel文件的实现方式有两种,根据具体场景选择合适的方式来实现导出功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [前后端分离场景下导出excel方法如何产品化?](https://blog.csdn.net/qq_42887496/article/details/123117949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值