excelJs库导出excel卡顿?

背景:

需求: 导出的excel表指定列可编辑,其它列不可编辑。

相关实现代码如下:

// 保护整个工作表
    sheet1.protect('yourpassword', {
      selectLockedCells: true,
      selectUnlockedCells: true,
    });
    //解锁可编辑列
    const unlockColumns = [6,7,8,9,12]
    unlockColumns.forEach((columnIndex) => {
    sheet1.getColumn(columnIndex).eachCell((cell,rowNumer) =>  {
      if( rowNumer !== 1 ) {// 跳过标题行
        cell.protection = { locked: false }
      }
     }) 
    })

结果: 功能可以满足,但是加上这段代码之后,导出excel表的速度明显变慢,有明显的卡顿现象。请问下有什么方法可以提升导出excel表的速度吗?

阅读 1.2k
1 个回答
  1. 批量操作
    尽量减少逐个单元格操作,尝试批量处理单元格。
  2. 使用模板
    预先创建一个模板文件,里面已经设置好保护和解锁的列,然后将数据写入模板文件中。
  3. 优化代码结构
    改进你的代码结构,使其更高效地处理大数据量。

    const ExcelJS = require('exceljs');
    
    async function exportExcel(data) {
      const workbook = new ExcelJS.Workbook();
      const sheet = workbook.addWorksheet('Sheet1');
    
      // 添加数据
      data.forEach((row, index) => {
     sheet.addRow(row);
      });
    
      // 保护整个工作表
      sheet.protect('yourpassword', {
     selectLockedCells: true,
     selectUnlockedCells: true,
      });
    
      // 解锁指定列
      const unlockColumns = [6, 7, 8, 9, 12];
    
      // 批量解锁单元格
      unlockColumns.forEach((columnIndex) => {
     sheet.getColumn(columnIndex).eachCell((cell, rowNumber) => {
       if (rowNumber !== 1) { // 跳过标题行
         cell.protection = { locked: false };
       }
     });
      });
    
      // 导出 Excel 文件
      await workbook.xlsx.writeFile('output.xlsx');
    }
    
    // 示例数据
    const data = [
      ['列1', '列2', '列3', '列4', '列5', '列6', '列7', '列8', '列9', '列10', '列11', '列12'],
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      // 更多数据...
    ];
    
    // 调用导出函数
    exportExcel(data);
    

此示例通过批量操作来解锁指定列的单元格,从而提高导出效率。

const ExcelJS = require('exceljs');

async function exportExcel(data) {
  const workbook = new ExcelJS.Workbook();
  const sheet = workbook.addWorksheet('Sheet1');

  // 添加数据
  data.forEach((row) => {
    sheet.addRow(row);
  });

  // 保护整个工作表
  sheet.protect('yourpassword', {
    selectLockedCells: true,
    selectUnlockedCells: true,
  });

  // 批量解锁指定列的单元格
  const unlockColumns = [6, 7, 8, 9, 12];
  sheet.columns.forEach((col, colNumber) => {
    if (unlockColumns.includes(colNumber + 1)) {
      col.eachCell((cell, rowNumber) => {
        if (rowNumber !== 1) { // 跳过标题行
          cell.protection = { locked: false };
        }
      });
    }
  });

  // 导出Excel文件
  await workbook.xlsx.writeFile('output.xlsx');
}

// 示例数据
const data = [
  ['Header1', 'Header2', 'Header3', 'Header4', 'Header5', 'Header6'],
  ['Row1-Col1', 'Row1-Col2', 'Row1-Col3', 'Row1-Col4', 'Row1-Col5', 'Row1-Col6'],
  // 更多数据...
];

// 导出Excel
exportExcel(data);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题