前端导出excel之使用exceljs + file-saver导出表格到excel

最近在使用exceljs导出表格数据时遇到问题,这里分享下,避免大家踩坑。

第一贴个exceljs中文文档地址:https://github.com/exceljs/exceljs/blob/master/README_zh.md

。。。我一开始看的英文文档,看得脑阔疼,过了好久才发现居然还有个中文文档?好吧,我鼠标滚太快了,直接看的正文,根本没注意这行。。。

前端导出excel之使用exceljs + file-saver导出表格到excel

前端导出excel之使用exceljs + file-saver导出表格到excel

先贴个最简单的导出表格例子

<!-- 纯前端导出excel案例 -->
<template>
  <div class="wrap">
    <div>
      <el-button type="primary" @click="exportExcel">导出excel</el-button>
    </div>
    <div style="width:500px;margin: 20px auto;">
      <el-table
        border
        :data="tableData"
        style="width: 100%">

        <template v-for="(item,index) in tableHeader">
          <el-table-column
            :key="index"
            v-bind="item">
          </el-table-column>
        </template>

      </el-table>
    </div>

  </div>
</template>
<script>
  import ExcelJS from  exceljs 
  import FileSaver from  file-saver 
  export default {
    name:  exceljs-demo ,
    data(){
      return {
        tableHeader: [
          {
            prop:  date ,
            label:  日期 
          },
          {
            prop:  name ,
            label:  姓名 
          },
          {
            prop:  address ,
            label:  地址 
          }
        ],
        tableData: [{
          date:  2016-05-02 ,
          name:  王小虎 ,
          address:  上海市普陀区金沙江路 1518 弄 
        }, {
          date:  2016-05-04 ,
          name:  王小虎 ,
          address:  上海市普陀区金沙江路 1517 弄 
        }, {
          date:  2016-05-01 ,
          name:  王小虎 ,
          address:  上海市普陀区金沙江路 1519 弄 
        }, {
          date:  2016-05-03 ,
          name:  王小虎 ,
          address:  上海市普陀区金沙江路 1516 弄 
        }]
      }
    },
    methods: {
      // 是否为空
      $isNull(val){
        return val === null || val === void 0 || val ===    || (val).toString() ===  NaN 
      },
      async exportExcel(){
        const workbook = new ExcelJS.Workbook();
        workbook.creator =  Me ;
        workbook.lastModifiedBy =  Her ;
        workbook.created = new Date(1985, 8, 30);
        workbook.modified = new Date();
        workbook.lastPrinted = new Date(2016, 9, 27);

        // 创建带有红色标签颜色的工作表
        const sheet = workbook.addWorksheet( My Sheet , {properties: {tabColor: {argb:  FFC0000 }}});

        // 生成columns
        let columns = []
        this.tableHeader.map(item => {
          columns.push({
            name: item.label,
//            width: 30 // 这里设置宽度不起作用,详情请看table 下 列属性,里面没有width 属性
          })
        })

        // 生成rows
        let rows = []
        this.tableData.map(item => {
          let arr = []
          this.tableHeader.map(sub => {
            arr.push(!this.$isNull(item[sub.prop]) ? item[sub.prop] :   )
          })
          rows.push(arr)
        })

        sheet.addTable({
          name:  MyTestTable ,
          ref:  C3 , // 表格左上角的位置
          headerRow: true,
          totalsRow: false,
          style: {
            theme:  TableStyleLight1 ,
//            showRowStripes: true,
          },
          columns: columns,
          rows: rows,
        })

        // workbook.xlsx.writeFile( test.xlsx )
        workbook.xlsx.writeBuffer().then(buffer => {
          FileSaver.saveAs(new Blob([buffer], {type:  application/octet-stream }), `test.xlsx`);
        })
      }
    }
  }
</script>
<style scoped>
</style>

版本如下:

前端导出excel之使用exceljs + file-saver导出表格到excel

页面效果如下:

前端导出excel之使用exceljs + file-saver导出表格到excel

导出效果如下:

前端导出excel之使用exceljs + file-saver导出表格到excel

问题1:为什么这里还要使用file-saver,官方不是提供了 writeFile 方法吗?

官网截图:

前端导出excel之使用exceljs + file-saver导出表格到excel

然后我也这样用了:

前端导出excel之使用exceljs + file-saver导出表格到excel

结果浏览器报错了:

前端导出excel之使用exceljs + file-saver导出表格到excel

最后发现workbook.xlsx.writeFile(filename)是在node端用的:

前端导出excel之使用exceljs + file-saver导出表格到excel

app.js代码如下,可以自己试下:

let excel = require("exceljs");
let workbook = new excel.Workbook();
workbook.creator =  Me ;
workbook.lastModifiedBy =  Her ;
workbook.created = new Date(1985, 8, 30);
workbook.modified = new Date();
workbook.lastPrinted = new Date(2016, 9, 27);

let sheet1 = workbook.addWorksheet( Sheet1 );
let reColumns=[
  {header: FirstName ,key: firstname },
  {header: LastName ,key: lastname },
  {header: Other Name ,key: othername }
];
sheet1.columns = reColumns;
workbook.xlsx.writeFile("./test.xlsx").then(function() {
  console.log("xlsx file is written.");
});

问题2:导出的表格如何更改列宽?

前端导出excel之使用exceljs + file-saver导出表格到excel

第一这里设置width是没效果的

前端导出excel之使用exceljs + file-saver导出表格到excel

官网表格列属性介绍:

前端导出excel之使用exceljs + file-saver导出表格到excel

解决办法:使用getColumn给每列设置宽度

前端导出excel之使用exceljs + file-saver导出表格到excel

前端导出excel之使用exceljs + file-saver导出表格到excel

问题3:优化,把导出的表格样式修改下,将表头居中,并设置边框。

官网截图:

前端导出excel之使用exceljs + file-saver导出表格到excel

代码如下,替换之前添加的那三行设置宽度的代码:

        // 表格列宽设置
        sheet.getColumn( C ).width = 15
        sheet.getColumn( D ).width = 15
        sheet.getColumn( E ).width = 30

        // 表头 居中并设置边框
        let h1 = sheet.getCell( C3 )
        let h2 = sheet.getCell( D3 )
        let h3 = sheet.getCell( E3 )

        let arr = [h1, h2, h3]
        arr.map(item => {
          // 居中 
          item.alignment = {vertical:  middle , horizontal:  center }
          // 边框
          item.border = {
            top: {style:  thin },
            left: {style:  thin },
            bottom: {style:  thin },
            right: {style:  thin }
          }
        })

效果图如下:

前端导出excel之使用exceljs + file-saver导出表格到excel

上面的方式有点low,如果表头过多或者我还需要对表格其他单元格设置样式,就得需要对上面的代码进行封装了, 这个在下一篇贴封装后的代码。

问题4:表格主题样式有哪些?

前端导出excel之使用exceljs + file-saver导出表格到excel

官网没有样式效果,小伙伴们可以自己试下。

更多exceljs的使用请查阅官网:
https://www.npmjs.com/package/exceljs

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...