React xlsx(工具库) 处理表头合并

23 篇文章 0 订阅
22 篇文章 1 订阅

前端导出excel表格
引入xlsx插件,不然应该是运行不起来的(xlsx无 样式)
样式使用 xlsx-js-style 或 xlsx-style

npm i xlsx
xlsx中文文档

插件2 exceljs
npm i exceljs
exceljs中文文档

导出

例子

在这里插入图片描述

import { ExportExcel } from './exportExcel/index';

  const columns=[
  {
    title: 'id',
    dataIndex: 'item1',
  },
  {
    title: '序号',
    dataIndex: 'item2',
  },
  {
    title: '合并列1-2',
    dataIndex: 'a1',
    children: [
      {
        title: '合并列1',
        dataIndex: 'data1',
      },
      {
        title: '合并列2',
        dataIndex: 'data2',
      },
    ],
  }
  ]
  //下方 '' 值为要合并项,主体值('合并列1-2')放前面,或放上面('id')
  //将表头拆为两行
  //若要加一个表头(xxxx表格),则为三行 titleArr.splice(0, 0, ['xxxx表格','','']);
  const titleArr=[
  ['id','序号','合并列1-2',''],
  ['','','合并列1','合并列2']];
 
// 合并
// s 意为 start ,即开始的单元格
// r 是 row ,表示行号,从 0 计起
// c 是 col ,表示列号,从 0 计起 
// e 意为 end,结束
const merges=[
{s:{c:0,r:0},e:{c:0,r:1}}, //合并第一列 第1行至第2行
{s:{c:0,r:2},e:{c:0,r:3}},// 合并第一行  第3个至第4个
]
  
let dataSource=[
{item1:'0',item2:'1',data1:'2',data2:'3'},
{item1:'0',item2:'1',data1:'2',data2:'3'}]

<Button
  type="primary"
  ghost
  onClick={() =>
    ExportExcel(
      columns,
      dataSource,
      `sheet页名自定义`,
      `fileName 文件名称自定义`,
      'xls',
      titleArr,
      merges
    )
  }
>
  导出
</Button>

ExportExcel函数封装

import XLSX from 'xlsx';
/**
 * zy
 * @param {*} label 表头-必填-例[{ title: '单位',dataIndex: 'item6',},]
 * @param {*} data 数据-必填-例[['0001','2017001','天'],['0002','2017002','干']],
 * @param {*} sheetName sheet页名
 * @param {*} fileName 文件名称
 * @param {*} fileType 文件类型-暂只使用xlsx,xls
 * @param {*} titleArr 表头-必填-例 [['编码','编号','备注']],默认二维数组[[]]
 * @param {*} merges 合并-选填-{s:{c:0,r:0},e:{c:2,r:0}}, //合并第一行 第1个至第3个
 */

export const ExportExcel= (
  label,
  data,
  sheetName,
  fileName,
  fileType,
  titleArr = [[]],
  merges = []
) => {
  sheetName = sheetName || 'sheet1';
  fileName = fileName || '导出表';
  fileType = fileType || 'xls';
  //组织数据
  let dataArr = [];
  let dataIndexArr = [];
  label.forEach((item) => {
  //根据自身实际情况处理 children
    if (item?.children && item.children.length) {
      item.children.forEach((item2) => {
        dataIndexArr.push(item2.dataIndex);
      });
    } else {
      dataIndexArr.push(item.dataIndex);
    }
  });
  data.forEach((item) => {
    let itemArr = [];
    dataIndexArr.forEach((x) => {
      itemArr.push(item[x]);
    });
    dataArr.push(itemArr);
  });
  //可以看成一个整体,表头和报表数据都是excel数据,每一行都是一个数组,
  // 表头在excel顶部 所以表头放最前面 splice(0,0,[])
  dataArr.splice(0, 0, ...titleArr);
  //创建新文件
  var newFile = XLSX.utils.book_new();
  //新sheet
  var newFileSheet = XLSX.utils.aoa_to_sheet(dataArr);
  //合并
  newFileSheet['!merges'] = merges;
  //sheet添加到文件
  XLSX.utils.book_append_sheet(newFile, newFileSheet, sheetName);
  // 导出 Excel
  XLSX.writeFile(newFile, `${fileName}.xls`);
};

总结

  1. XLSX.utils.book_new()创建新文件
  2. XLSX.utils.aoa_to_sheet 新sheet表
  3. merges数组表示对行和列进行合并,c表示column(列),r表示row(行),s表示start(开始),e表示end(结束),索引从0开始
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design Pro + React 可以使用 xlsx 和 FileSaver 来实现导出多级表头表格的功能。 首先,需要安装 xlsx 和 FileSaver : ```bash npm install xlsx file-saver --save ``` 然后,在代码中引入这两个: ```javascript import XLSX from 'xlsx'; import FileSaver from 'file-saver'; ``` 接着,在需要导出表格的组件中,创建一个函数来生成 Excel 文件。下面是一个生成多级表头表格的示例函数: ```javascript export function exportExcel(data, fileName) { const worksheet = XLSX.utils.json_to_sheet(data); // 设置多级表头 worksheet['!cols'] = [ { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, ]; worksheet['!merges'] = [ { s: { r: 0, c: 0 }, e: { r: 1, c: 0 } }, { s: { r: 0, c: 1 }, e: { r: 1, c: 1 } }, { s: { r: 0, c: 2 }, e: { r: 0, c: 4 } }, { s: { r: 0, c: 5 }, e: { r: 1, c: 5 } }, { s: { r: 0, c: 6 }, e: { r: 0, c: 8 } }, { s: { r: 0, c: 9 }, e: { r: 1, c: 9 } }, { s: { r: 0, c: 10 }, e: { r: 1, c: 10 } }, ]; // 生成 Excel 文件 const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); FileSaver.saveAs(blob, `${fileName}.xlsx`); } ``` 在这个函数中,我们首先将数据转换成一个 worksheet 对象。接着,我们设置多级表头,这里使用了 `!cols` 和 `!merges` 属性来设置列宽和合并单元格。最后,我们将 worksheet 对象添加到一个新的 workbook 对象中,并将其写入Excel文件。 最后,我们可以在组件的 render 方法中使用这个函数来导出表格: ```javascript <button onClick={() => exportExcel(data, 'table')}>导出表格</button> ``` 这样,用户点击这个按钮就可以将表格导出为 Excel 文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值