elementUI table 表头合并,使用前端导出表格出现错行

本文介绍了一种在前端导出Excel时避免因隐藏单元格导致错行的方法。通过在导出前精确移除特定的隐藏单元格,确保了导出的表格格式正确,解决了合并表头后导出的Excel表格出现多余单元格的问题。

在之前我有写过一篇合并表头的文章,但是在前端导出表格的时候出现了问题。
合并表头文章链接:elementUI table 表头合并
在使用前端导出的方法时导出的Excel表格出现了多余的单元格导致表格出现了错行的问题,具体问题如下图所示:
前端表格错行
如上图所示“年累计”下面的俩个空单元格应该是“部门”下的俩个单元格,我在代码里只是做了隐藏,虽然页面中表格是正常显示的,但是导出时隐藏的单元格就被导出了,这样就出现了多余单元格导致错行,现在我只能使用比较笨的办法来移除被隐藏的单元格,代码如下:

dois({
        row,
        column,
        rowIndex,
        columnIndex
      }) {
        if (rowIndex === 0) {
          if (columnIndex === 0) {
            if (document.getElementsByClassName(column.id).length !== 0) {
              var _c = document.getElementsByClassName(column.id)
              document.getElementsByClassName(column.id)[0].setAttribute("rowSpan", 3) //合并单元格
            }
            return column
          }
        }
        if (rowIndex === 1) {
          if (columnIndex === 0 || (columnIndex === 1)) {
            let child = document.getElementsByClassName(column.id)[0];
            if (child !== undefined) {
              var pa = child.parentNode
              var c = pa.parentNode
              var g = c.parentNode
              if (g.className === "el-table__header") { 
                child.parentNode.removeChild(child) //移除表头中的指定单元格
              }
            }
            return column
          }
        }

      },

效果图:
修改代码后导出的Excel

### Vue2 中使用 xlsx 插件导出带有 ElementUI 多级表头表格数据实现方法 在 Vue2 项目中,若需要使用 `xlsx` 插件导出带有 ElementUI 多级表头表格数据,可以通过前端处理多级表头和数据的方式完成。以下是具体的实现方法: #### 1. 安装依赖 首先需要安装以下依赖: ```bash npm install xlsx file-saver --save ``` - `xlsx`:用于生成 Excel 文件。 - `file-saver`:用于保存生成的文件。 #### 2. 创建导出方法 创建一个工具函数,用于处理多级表头和数据,并生成 Excel 文件。 ```javascript import XLSX from 'xlsx'; import { saveAs } from 'file-saver'; export function exportExcel(data, columns, fileName) { // 构建多级表头 const header = []; const mergeCells = []; // 合并单元格信息 let colIndex = 0; // 遍历多级表头列定义 columns.forEach(col => { if (Array.isArray(col.children)) { // 如果是多级表头 col.children.forEach(subCol => { header.push({ name: subCol.label, key: subCol.property }); }); mergeCells.push({ s: { r: 0, c: colIndex }, e: { r: 0, c: colIndex + col.children.length - 1 } }); colIndex += col.children.length; } else { // 单级表头 header.push({ name: col.label, key: col.property }); colIndex++; } }); // 构建工作表数据 const worksheetData = [header.map(h => h.name)]; // 第一表头 data.forEach(row => { const rowData = header.map(h => row[h.key]); worksheetData.push(rowData); }); // 添加合并单元格 const wsOptions = { '!merges': mergeCells }; const ws = XLSX.utils.aoa_to_sheet(worksheetData, wsOptions); // 构建工作簿 const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // 导出文件 const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); saveAs(new Blob([wbout], { type: 'application/octet-stream' }), `${fileName}.xlsx`); } ``` #### 3. 在组件中调用导出方法 在 Vue 组件中引入上述工具函数,并绑定按钮事件以触发导出功能。 ```javascript <template> <div> <el-button @click="handleExport">导出</el-button> <el-table :data="tableData" border style="width: 100%"> <el-table-column label="基本信息" colspan="2"> <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="age" label="年龄" width="180"></el-table-column> </el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> </template> <script> import { exportExcel } from '@/utils/exportExcel.js'; export default { data() { return { tableData: [ { name: '张三', age: 25, address: '北京市' }, { name: '李四', age: 30, address: '上海市' }, ], }; }, methods: { handleExport() { const columns = [ { label: '基本信息', children: [ { label: '姓名', property: 'name' }, { label: '年龄', property: 'age' }, ], }, { label: '地址', property: 'address' }, ]; exportExcel(this.tableData, columns, '多级表头示例'); }, }, }; </script> ``` #### 4. 注意事项 - **多级表头定义**:通过 `children` 属性定义子表头,父表头的 `label` 作为合并单元格的标题[^3]。 - **数据格式**:确保表格数据与表头定义一致,避免因字段匹配导致导出失败。 - **性能问题**:如果数据量较大(如上万条),建议将导出逻辑交由后端处理,以减少前端压力[^3]。 --- ### 示例效果 上述代码将生成一个包含多级表头的 Excel 文件,其中“基本信息”为一级表头,“姓名”和“年龄”为二级表头--- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值