加载中...

在Vue中,将数据导出成excel,合并单元格

在Vue中,将数据导出成excel,合并单元格

前段时间接到一个做报表的项目,需要将数据导出成excel表格,表格模板中有很多表格是需要合并的,之前没有这方面的经验,也为难了好久,后来终于发现一个好用的js插件,完全能够实现我需要的功能,一块分享给大家;

SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式。本文全部都是以xlsx格式为例。

官方github:https://github.com/SheetJS/js-xlsx

demo在线演示地址:http://demo.haoji.me/2017/02/08-js-xlsx/

官网演示地址:https://oss.sheetjs.com/sheetjs/

 

下面说说具体怎么使用的

在Vue项目中使用npm安装

npm install xlsx

之后在需要使用的组件内引用,当然也可以全局引入

import XLSX from ''xlsx''

利用官方提供的工具类实现下载功能

官方已经提供好了现成的工具类给我们使用,主要包括:

  • aoa_to_sheet: 这个工具类最强大也最实用了,将一个二维数组转成sheet,会自动处理number、string、boolean、date等类型数据;
  • table_to_sheet: 将一个table dom直接转成sheet,会自动识别colspanrowspan并将其转成对应的单元格合并;
  • json_to_sheet: 将一个由对象组成的数组转成sheet;

aoa_to_sheet示例:

  1. // 需要导出的数据
  2. var aoa = [
  3. [''姓名'', ''性别'', ''年龄'', ''注册时间''],
  4. [''张三'', ''男'', 18, new Date()],
  5. [''李四'', ''女'', 22, new Date()]
  6. ];
  7. // 导出的表格名称
  8. const filename =''导出表格.xlsx''
  9. // Excel第一个sheet的名称
  10. const ws_name = ''Sheet1''
  11. const wb = XLSX.utils.book_new()
  12. const ws = XLSX.utils.aoa_to_sheet(aoa);
  13. XLSX.utils.book_append_sheet(wb, ws, ws_name) // 将数据添加到工作薄
  14. XLSX.writeFile(wb, filename) // 导出Excel

table_to_sheet就更简单了,直接XLSX.utils.table_to_sheet($(''table'')[0])即可;

处理单元格合并

假设我们要生成如下格式的excel文件,其中A1-C1进行单元格合并:

New Image

实现代码如下: 

  1. var aoa = [
  2. [''主要信息'', null, null, ''其它信息''], // 特别注意合并的地方后面预留2个null
  3. [''姓名'', ''性别'', ''年龄'', ''注册时间''],
  4. [''张三'', ''男'', 18, new Date()],
  5. [''李四'', ''女'', 22, new Date()]
  6. ];
  7. var sheet = XLSX.utils.aoa_to_sheet(aoa);
  8. sheet[''!merges''] = [
  9. // 设置A1-C1的单元格合并
  10. {s: {r: 0, c: 0}, e: {r: 0, c: 2}}
  11. ];
  12. const filename=''导出合并单元格的表格.xlsx''
  13. // Excel第一个sheet的名称
  14. const ws_name = ''Sheet1''
  15. const wb = XLSX.utils.book_new()
  16. const ws = XLSX.utils.aoa_to_sheet(aoa)
  17. ws[''!merges''] = mergeArr
  18. XLSX.utils.book_append_sheet(wb, ws, ws_name) // 将数据添加到工作薄
  19. XLSX.writeFile(wb, filename) // 导出Excel

 需要注意的地方就是被合并的单元格要用null预留出位置,否则后面的内容(本例中是第四列其它信息)会被覆盖。

设置样式(居中,文字大小颜色,背景色...)

安装xlsx-style

好像只有npm安装,github我没找到地址

npm install xlsx-style

之后就可以直接使用了

  1. const aoa = [
  2. [''主要信息'', null, null, ''其它信息''], // 特别注意合并的地方后面预留2个null
  3. [''姓名'', ''性别'', ''年龄'', ''注册时间''],
  4. [''张三'', ''男'', 18, new Date()],
  5. [''李四'', ''女'', 22, new Date()]
  6. ];
  7. const ws_name = ''Sheet1''
  8. const wb = XLSX.utils.book_new()
  9. const ws = XLSX.utils.aoa_to_sheet(aoa)
  10. ws[''!merges''] = [
  11. // 设置A1-C1的单元格合并
  12. {s: {r: 0, c: 0}, e: {r: 0, c: 2}}
  13. ];
  14. //这个就是修改格式的代码
  15. ws["A5"].s = {
  16. font: {
  17. sz: 13,
  18. bold: true,
  19. color: {
  20. rgb: "FFFFAA00"
  21. }
  22. },
  23. alignment: {
  24. horizontal: "center",
  25. vertical: "center",
  26. wrap_text: true
  27. }
  28. };
  29. //控制单元格宽度
  30. ws["!cols"] = [{
  31. wpx: 70
  32. }, {
  33. wpx: 70
  34. }, {
  35. wpx: 70
  36. }, {
  37. wpx: 70
  38. }, {
  39. wpx: 150
  40. }, {
  41. wpx: 120
  42. }]; //单元格列宽
  43. const filename=''导出单元格带样式的表格.xlsx''
  44. // Excel第一个sheet的名称
  45. ws[''!merges''] = mergeArr
  46. XLSX.utils.book_append_sheet(wb, ws, ws_name) // 将数据添加到工作薄
  47. XLSX.writeFile(wb, filename) // 导出Excel

注意,设置单元格列宽要从第一行开始设置

我暂时也只探索到这里,后面如果有更加复杂的需求,可以继续深入探索