前端使用xlsx库导出带有样式的excel文件

目录
  • 需求分析
  • 常用的库
    • ExcleJS
  • 具体实现
  • 结果展示
  • 整个函数展示
  • 最后

需求分析

最近遇到一个需求:前端导出excel文件,其中有部分数据用户不能操作,部分列数据可以筛选,并且存在前一列的数据值会影响后一列数据值的输入范围的情况。

需要导出的前端表格如上图所示,其中:

  • Group、Type、Region可筛选
  • 红色框内的数据用户不可操作,绿色框内用户可以操作
  • 当Type的值为BOOL时,Region的有效输入为:["Holding Register","Input Register"],否则为:["Coil","Discrete Input"]
  • Address的输入范围为:[0,65535]

项目使用的是React + AntD

常用的库

在这个需求出来之前,前端导入导出excel文件时我使用的是xlsx这个库。但是,如果想要修改excel表格样式的话,是需要使用收费的专业版本。带着开源第一,绝不花钱的基本原则,本人就找到了ExcleJS这个库。

ExcleJS

ExcleJS不仅完全开源,还配备着中文文档这可真的是用着放心也开心!

具体实现

安装:

npm install exceljs
npm install file-saver

创建workbook,添加名为Demo的sheet,设置默认行高为20,设置列(表头);

添加行信息(allData前端页面表格中的数据);

最后给表头添加颜色。

    // 创建工作簿
    const workbook = new ExcelJs.Workbook();
    // 添加sheet
    const worksheet = workbook.addWorksheet('Demo');
    // 设置 sheet 的默认行高
    worksheet.properties.defaultRowHeight = 20;
    // 设置列
    worksheet.columns = [
      { header: 'Index', key: 'index', width: 10 },
      { header: 'Name', key: 'name', width: 25 },
      { header: 'Type', key: 'group', width: 25, outlineLevel: 1 },
      { header: 'Group', key: 'type', width: 25, outlineLevel: 1 },
      { header: 'Region', key: 'modbusRegion', width: 25, outlineLevel: 1 },
      { header: 'Address', key: 'modbusAddress', width: 25, outlineLevel: 1 },
    ];
    // 添加行
    worksheet.addRows(allData);
    // 给表头添加背景色
    let headerRow = worksheet.getRow(1);
    headerRow.eachCell((cell) => {
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: {argb: 'dde0e7'},
      }
    })
  • 将自动筛选器设置为从 A2 到 F1 (Group、Type、Region)
    // 将自动筛选器设置为从 A2 到 F1
    worksheet.autoFilter = {
      from: 'C1',
      to: 'E1',
    }
  • 锁定整个excel表格,可筛选但不能选中锁定的单元格
    // 锁定工资表
    await worksheet.protect('the-password',
                             {
                              autoFilter:true,
                              selectLockedCells:false,
                              });
  • 通过循环判断,哪些单元格可以被用户操作,并且判断该单元格的输入限制是什么
   const allData = [...this.state.dataSource]
   let length = allData.length
   for(let i = 0 ;i < length; i++){
      // Region的输入范围
      let coilArr = ['"Coil,Discrete Input"']
      let registerArr = ['"Holding Register,Input Register"']
      let listArr = []
      if(allData[i].type === 'BOOL'){
        listArr = coilArr
      }
      else{
        listArr = registerArr
      }
      // 可编辑的单元格在E、F中
      worksheet.getCell(`E${i+2}`).protection = {
        locked: false,
      };
      // Region的输入校验
      worksheet.getCell(`E${i+2}`).dataValidation = {
        type: 'list',
        allowBlank: true,
        formulae: listArr,
        showErrorMessage: true,
        errorTitle: '非法输入',
        error: '取值范围为:'+listArr
      };
      worksheet.getCell(`F${i+2}`).protection = {
        locked: false,
      };
      // Address的输入校验
      worksheet.getCell(`F${i+2}`).dataValidation = {
        type: 'whole',
        operator: 'between',
        allowBlank: true,
        showErrorMessage: true,
        formulae: [0,65535],
        errorTitle: '非法输入',
        error: '取值范围为:[0,65535]'
      };
    }

以上的代码中,worksheet.getCell(E${i+2}).dataValidation是进行单元格数据验证的函数,具体的使用可参考官方文档

  • 导出名为"xlsx-demo.xlsx"的excel文件
    // 导出excel
    this.saveWorkbook(workbook, 'xlsx-demo.xlsx');

结果展示

  • Group、Type、Region可筛选()

  • 红色框内的数据,用户不可操作,蓝色框内用户可以操作()

  • 当Type的值为BOOL时,Region的有效输入为:["Holding Register","Input Register"],否则为:["Coil","Discrete Input"]()

用户输入错误给出错误提醒,并且不保存错误数据。

  • Address的输入范围为:[0,65535]()

用户输入错误给出错误提醒,并且不保存错误数据。

整个函数展示

  // 导出xls
  exportXLS = async () =>{
    const allData = [...this.state.dataSource]
    let length = allData.length
    // 创建工作簿
    const workbook = new ExcelJs.Workbook();
    // 添加sheet
    const worksheet = workbook.addWorksheet('demo');
    // 设置 sheet 的默认行高
    worksheet.properties.defaultRowHeight = 20;
    // 设置列
    worksheet.columns = [
      { header: 'Index', key: 'index', width: 10 },
      { header: 'Name', key: 'name', width: 25 },
      { header: 'Group', key: 'group', width: 25, outlineLevel: 1 },
      { header: 'Type', key: 'type', width: 25, outlineLevel: 1 },
      { header: 'Region', key: 'modbusRegion', width: 25, outlineLevel: 1 },
      { header: 'Address', key: 'modbusAddress', width: 25, outlineLevel: 1 },
    ];
    // 添加行
    worksheet.addRows(allData);
    // 给表头添加背景色
    let headerRow = worksheet.getRow(1);
    // 通过 cell 设置背景色,更精准
    headerRow.eachCell((cell) => {
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: {argb: 'dde0e7'},
      }
    })
    // 将自动筛选器设置为从 C1 到 F1
    worksheet.autoFilter = {
      from: 'C1',
      to: 'E1',
    }
    // 锁定工资表
    await worksheet.protect('the-password',
                             {
                              autoFilter:true,
                              selectLockedCells:false,
                              });
    // 判断哪些单元格可以被用户操作,并且判断该单元格的输入限制是什么
    for(let i = 0 ;i < length; i++){
      // 根据不同类型选择筛选的框
      let coilArr = ['"Coil,Discrete Input"']
      let registerArr = ['"Holding Register,Input Register"']
      let listArr = []
      if(allData[i].type === 'BOOL'){
        listArr = coilArr
      }
      else{
        listArr = registerArr
      }
      // 可编辑的单元格在E、F中
      worksheet.getCell(`E${i+2}`).protection = {
        locked: false,
      };
      worksheet.getCell(`E${i+2}`).dataValidation = {
        type: 'list',
        allowBlank: true,
        formulae: listArr,
        showErrorMessage: true,
        errorTitle: '非法输入',
        error: '取值范围为:'+listArr
      };
      worksheet.getCell(`F${i+2}`).protection = {
        locked: false,
      };
      worksheet.getCell(`F${i+2}`).dataValidation = {
        type: 'whole',
        operator: 'between',
        allowBlank: true,
        showErrorMessage: true,
        formulae: [0,65535],
        errorTitle: '非法输入',
        error: '取值范围为:[0,65535]'
      };
    }
    // 导出excel
    this.saveWorkbook(workbook, 'xlsx-demo.xlsx');
  }

最后

ExcelJS 功能很强大,如合并单元格、合并行和列、修改单元格的样式、设置页眉页脚、操作视图、添加公式、使用富文本等功能都是可以实现的。

官方文档十分详细,大家有需求的话直接看官方文档

以上就是前端使用xlsx库导出带有样式的excel文件的详细内容,更多关于前端xlsx库导出excel的资料请关注我们其它相关文章!

(0)

相关推荐

  • javascript 实现纯前端将数据导出excel两种方式

    目录 前言 方法一 方法二 前言 修改之前项目代码的时候,发现前人导出excel是用纯javascript实现的.并没有调用后台接口. 之前从来没这么用过,记录一下.以备不时之需. 方法一 将table标签,包括tr.td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html, 代码如下: <html> <head>     <p style="font-size: 20p

  • JavaScript实现excel文件导入导出

    目录 一.需求场景描述 1.此时前端上传解析excel文件可能更合适 2.此时前端下载excel文件可能优雅一些 二.实现思路分析 1.导入excel文件实现思路分析 2.导出excel文件实现思路分析 三.关键代码 1. exportExcel.js 导出excel文件 2. importExcel.js 导入excel文件 四.使用示例 1.使用示例一:上传解析excel 2.使用示例二:下载excel文件 一.需求场景描述 文件的导入导出是非常常见的需求功能,excel文件的导入导出更为常

  • JS实现将数据导出到Excel的方法详解

    修改之前项目代码的时候,发现前人导出excel是用纯javascript实现的.并没有调用后台接口. 之前从来没这么用过,记录一下.以备不时之需. 方法一: 将table标签,包括tr.td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下: <html> <head>     <p style="font-size: 20px;color: red;&quo

  • React.js前端导出Excel的方式

    目录 前言 实现方式 csv 与 Excel 的区别 react-csv xlsx cdn 方式 在 react 中使用 json 转 excel 结语 前言 前段时间,项目上有个需求需要将数据报表导出为 excel 的需求,这本来是后端的工作,前端只需要一个 a 标签,就可以下载文件,但不巧的是,正好遇到后端请假,而且项目比较着急,那么前端是否可以实现呢? 实现方式 经过一顿搜索后,发现有这么几个 npm 库 react-csv 根据给定的数据生成 CSV 文件,数据可以是二维数组.对象数组或

  • JavaScript实现导入导出excel的示例代码

    目录 Excel导入 html代码 js代码 Excel导出 html代码 js代码 Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick={() => { upFile(); }} > 导入 </button> <input id="upFile" type="file" style={{

  • Java easyexcel使用教程之导出篇

    目录 EasyExcel简介 1.导入Maven依赖 2.新建Student.java类 3.generateStudentUtil.java类,随机生成Student对象 4.BaseTest.java 4.导出Excel报表 5.把姓名格式化:1显示男,0显示女 6.把体重保留2位小数 7.过滤字段不生成excel 8.冻结列, 冻结姓名列 总结 EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Exc

  • 前端使用xlsx库导出带有样式的excel文件

    目录 需求分析 常用的库 ExcleJS 具体实现 结果展示 整个函数展示 最后 需求分析 最近遇到一个需求:前端导出excel文件,其中有部分数据用户不能操作,部分列数据可以筛选,并且存在前一列的数据值会影响后一列数据值的输入范围的情况. 需要导出的前端表格如上图所示,其中: Group.Type.Region可筛选 红色框内的数据用户不可操作,绿色框内用户可以操作 当Type的值为BOOL时,Region的有效输入为:["Holding Register","Input

  • Vue 前端导出后端返回的excel文件方式

    目录 前端导出后端返回的excel文件 处理文件的下载(后端Excel导出) 后端文件流 通过 Blob 下载 拼接 URL 下载 前端导出后端返回的excel文件 在网上搜索了一番之后,决定采用Blob方式,这也是大家推荐的一种的方式,特此做下记录. 页面: 先筛选,向后端请求接口返回excel文件,代码如下: const apiUrl = this.Global.httpUrl + '/laima/export/new/exportTackOutOrder' console.log(this

  • C#导出GridView数据到Excel文件类实例

    本文实例讲述了C#导出GridView数据到Excel文件类.分享给大家供大家参考.具体如下: 这段C#代码自定义了一个封装类,用于将GridView数据导出到Excel文件 using System; using System.Web; using System.Web.UI; using System.IO; using System.Web.UI.WebControls; namespace DotNet.Utilities { public class ExportExcel { pro

  • 详解pandas库pd.read_excel操作读取excel文件参数整理与实例

    除了使用xlrd库或者xlwt库进行对excel表格的操作读与写,而且pandas库同样支持excel的操作:且pandas操作更加简介方便. 首先是pd.read_excel的参数:函数为: pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None, arse_cols=None,date_parser=None,na_values=None,thousands=None, convert_fl

  • PHP导出带样式的Excel示例代码

    前言 在大家工作中做导出的时候,需要导出自定义的表格或嫌弃导出的Excel格式太难看了.这时候就需要设置颜色.字号大小.加粗.合并单元格等等.这篇文章通过实例告诉大家怎么做,下面来一起看看. 先来看看效果图: 实例代码 PHP代码: /** * 导出文件 * @return string */ public function export() { $file_name = "成绩单-".date("Y-m-d H:i:s",time()); $file_suffix

  • PHP实现导出带样式的Excel

    工作中做导出的时候,需要导出自定义的表格或嫌弃导出的Excel格式太难看了. 需要设置颜色.字号大小.加粗.合并单元格等等. 效果图: PHP代码: /** * 导出文件 * @return string */ public function export() { $file_name = "成绩单-".date("Y-m-d H:i:s",time()); $file_suffix = "xls"; header("Content-T

  • asp生成带有样式的word文件方法

    复制代码 代码如下: < % Set fso=Server.CreateObject("Scripting.FileSystemObject") str="<html><title>asp生成word文件举例</title><body><span style='color:#ff0000;font-size:36px; font-weight:bold;'>欢迎光临www.jb51.net(我们)</sp

  • Python中使用第三方库xlutils来追加写入Excel文件示例

    目前还没有更好的方法来追写Excel,lorinnn在网上搜索到以及之后用到的方法就是使用第三方库xlutils来实现了这个功能,主体思想就是先复制一份Sheet然后再次基础上追加并保存到一份新的Excel文档中去. 使用xlutils 代码实现如下: # -*- coding: utf-8 -*- ''' Created on 2012-12-17 @author: walfred @module: XLRDPkg.write_append @description: ''' import o

  • PHP导出MySQL数据到Excel文件(fputcsv)

    这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. 复制代码 代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名 header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="user.csv"'); header('Cache-Control: max-age=0'); // 从数据库中获取

  • Spring Boot Excel文件导出下载实现代码

    Spring Boot Excel 文件导出 目标: 实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出. 实现: 1.抽象类 BaseExcelView 继承 webmvc 的  AbstractXlsxStreamingView 抽象类, AbstractXlsxStreamingView 是webmvc继承了最顶层View接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 SXSSFWorkbook 解决了内存问题,

随机推荐