【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

news2024/11/26 22:44:54

官网:

1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage

2、xlsx SheetJS 中文网

一、使用第三方插件

1、安装

npm install xlsx-js-style

2、引入

import xlsx from 'xlsx-js-style'

xlsx插件是基础的导出,不可以修改样式,直接xlsx-style插件式修改样式的,所以这里直接用二者合体插件即可

二、页面使用

1、数据源

[
  {"rectifyPresideName": "朱佳佳","accepUser": "张红艳","rectifyCompleteTime": "2024-09-27 10:17:43","checkTableType": "重点时段及节假日前排查","rectifyTerm": "2024-09-27 23:59:59","rectifyDeptName": "炭黑厂炭黑车间","rectifyPlan": "建立使用记录","faultName": "岗位急救箱无使用记录","createDate": "2024年09月27日"},
  {"rectifyPresideName": "崔国梁","accepUser": "崔国梁","rectifyCompleteTime": "2024-09-26 17:13:05","checkTableType": "重点时段及节假日前排查","rectifyTerm": "2024-09-26 23:59:59","rectifyDeptName": "焦化厂第三干熄焦车间","rectifyPlan": "更换或检查修复","faultName": "疏散指示灯不亮","createDate": "2024年09月26日"},
  {"rectifyPresideName": "贾成成","accepUser": "贾成成","rectifyCompleteTime": "2024-09-26 17:23:12","checkTableType": "重点时段及节假日前排查","rectifyTerm": "2024-09-26 23:59:59","rectifyDeptName": "甲醇厂公辅车间","rectifyPlan": "安排岗位人员更换消防抢","faultName": "消防水枪损坏","createDate": "2024年09月26日"},
  {"rectifyPresideName": "王小娟","accepUser": "李学红","rectifyCompleteTime": "2024-09-25 16:50:45","checkTableType": "重点时段及节假日前排查","rectifyTerm": "2024-09-25 23:59:59","rectifyDeptName": "苯精制厂","rectifyPlan": "安装阀门","faultName": "萃取塔回流罐液位计排污阀为单阀","createDate": "2024年09月24日"}
]

2、将数据源转成需要的二维数组

const data = res.data.data.map((ele, i) => ({
          xuhao: i + 1,
          faultName: ele.faultName,
          createDate: ele.createDate,
          checkTableType: ele.checkTableType,
          rectifyPlan: ele.rectifyPlan,
          rectifyDeptName: ele.rectifyDeptName,
          rectifyPresideName: ele.rectifyPresideName,
          rectifyTerm: ele.rectifyTerm,
          rectifyCompleteTime: ele.rectifyCompleteTime,
          accepUser: ele.accepUser,
}))
const body = data.map((x) => [x.xuhao,x.faultName,x.createDate,x.checkTableType,x.rectifyPlan,x.rectifyDeptName,x.rectifyPresideName,x.rectifyTerm,x.rectifyCompleteTime,x.accepUser,])

// 转换后的二维数据
[
  [1,"岗位急救箱无使用记录","2024年09月27日","重点时段及节假日前排查","建立使用记录","炭黑厂炭黑车间","朱佳佳","2024-09-27 23:59:59","2024-09-27 10:17:43","张红艳"],
  [2,"疏散指示灯不亮","2024年09月26日","重点时段及节假日前排查","更换或检查修复","焦化厂第三干熄焦车间","崔国梁","2024-09-26 23:59:59","2024-09-26 17:13:05","崔国梁"],
  [3,"消防水枪损坏","2024年09月26日","重点时段及节假日前排查","安排岗位人员更换消防抢","甲醇厂公辅车间","贾成成","2024-09-26 23:59:59","2024-09-26 17:23:12","贾成成"],
  [4,"萃取塔回流罐液位计排污阀为单阀","2024年09月24日","重点时段及节假日前排查","安装阀门","苯精制厂","王小娟","2024-09-25 23:59:59","2024-09-25 16:50:45","李学红"]
]

3、定义表头

// 定义Excel表头
 const header = [
   ['隐患排查治理台账'],
   ['序号','问题点','检查时间','检查类别','整改措施','责任单位','责任人','整改时间','','验收人',],
   ['', '', '', '', '', '', '', '计划完成时间', '实际完成时间', ''],]

4、将定义好的表头添加到 body 中

body.unshift(...header) 

5、创建虚拟的 workbook

const workbook = xlsx.utils.book_new()

6、aoa_to_sheet 将二维数组转成 sheet

先写到这儿,明天再写,下班,886~

继续-----------

const sheet = xlsx.utils.aoa_to_sheet(body)
// aoa_to_sheet  	是将【一个二维数组】转化成 sheet
// json_to_sheet 	是将【由对象组成的数组】转化成sheet
// table_to_sheet  	是将【table的dom】直接转成sheet

7、!merges 单元格合并

①【根据实际情况合并,我这只是处理了表头】

 const merges = [
          { s: { r: 0, c: 0 }, e: { r: 0, c: 9 } },// 第0行第0列开始 —— 第0列到第9列结束(按数组的index方式计算,excel表第一列就是0开始计算)
          { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
          { s: { r: 1, c: 1 }, e: { r: 2, c: 1 } },
          { s: { r: 1, c: 2 }, e: { r: 2, c: 2 } },
          { s: { r: 1, c: 3 }, e: { r: 2, c: 3 } },
          { s: { r: 1, c: 4 }, e: { r: 2, c: 4 } },
          { s: { r: 1, c: 5 }, e: { r: 2, c: 5 } },
          { s: { r: 1, c: 6 }, e: { r: 2, c: 6 } },
          { s: { r: 1, c: 7 }, e: { r: 1, c: 8 } },
          { s: { r: 1, c: 9 }, e: { r: 2, c: 9 } },
        ]

s:是开始的意思   r代表第几行  c代表第几列
e:是结束的意思   r代表第几行  c代表第几列

sheet['!merges'] = merges; // 添加到sheet中

②【这里处理单元格内容,后端对数据进行了排序,本项目需求就是合并三个,那我就要动态将数据一样的进行合并单元格】

 // 合并单元格的函数
    function addMerges(startRow, endRow, col) {
      if (startRow < endRow) {
         merges.push({
           s: { r: startRow, c: col },
           e: { r: endRow, c: col },
         })
       }
    }
// 动态合并相同内容的单元格的函数
   function mergeDynamicCells(colIndex) {
     let startRow = 3 // 这是单元格内容起始行
        for (let i = 4; i < body.length; i++) {
            if (body[i][colIndex] !== body[startRow][colIndex]) {
              addMerges(startRow, i - 1, colIndex) // 合并相同内容的单元格
              startRow = i // 更新起始行
       }
   }
    addMerges(startRow, body.length - 1, colIndex) // 合并最后一段相同内容
 }
// 只对第2列和第5列进行动态合并
   mergeDynamicCells(2) // 合并 2 列
   mergeDynamicCells(3) // 合并 3 列
   mergeDynamicCells(5) // 合并 5 列

 8、!cols 设置列宽

const cols = [
          { wch: 10 },
          { wch: 30 },
          { wch: 25 },
          { wch: 30 },
          { wch: 30 },
          { wch: 25 },
          { wch: 15 },
          { wch: 25 },
          { wch: 25 },
          { wch: 15 },
 ]
sheet['!cols'] = cols; // 添加到sheet中

9、!rows 设置行高

 const rows = [{ hpx: 30 }, { hpx: 30 }, { hpx: 30 }]
 sheet['!rows'] = rows // 行高添加到sheet中

10、样式添加-内容垂直居中

   let range = xlsx.utils.decode_range(sheet['!ref']);  
   let headerStyle = {  
        font: { sz: 14, name: '宋体', bold: true },  
        alignment: { vertical: 'center', horizontal: 'center' }  
    };  
   let defaultStyle = {  
        font: { sz: 11, name: '宋体' },  
        alignment: { wrapText: 1, vertical: 'center', horizontal: 'center' }  
        // wrapText: 1-------自动换行
    };  
    for (var row = range.s.r; row <= range.e.r; ++row) {  
        for (let col = range.s.c; col <= range.e.c; ++col) {  
            let cellAddress = xlsx.utils.encode_cell({ r: row, c: col });  
            let cell = sheet[cellAddress];  
            if (cell) {  
                if (!cell.s) cell.s = {};  
                // 处理表头  
                if (cell.v === '隐患排查治理台账') {  
                    cell.s = headerStyle;  
                } else {  
                    cell.s = defaultStyle;  
                }  
            }  
        }  
    }  

11、向workbook中添加sheet

 xlsx.utils.book_append_sheet(workbook, sheet, this.compname || 'Sheet')

12、导出

 xlsx.writeFile(workbook, (this.compname || 'Data') + '.xlsx', {type: 'binary',}) 

三、完整代码

expeortexcel(ids) {
 exportCheckTableFault(ids).then((res) => {
   const data = res.data.data.map((ele, i) => ({
          xuhao: i + 1,
          faultName: ele.faultName,
          createDate: ele.createDate,
          checkTableType: ele.checkTableType,
          rectifyPlan: ele.rectifyPlan,
          rectifyDeptName: ele.rectifyDeptName,
          rectifyPresideName: ele.rectifyPresideName,
          rectifyTerm: ele.rectifyTerm,
          rectifyCompleteTime: ele.rectifyCompleteTime,
          accepUser: ele.accepUser,
        }))
        const body = data.map((x) => [
          x.xuhao,
          x.faultName,
          x.createDate,
          x.checkTableType,
          x.rectifyPlan,
          x.rectifyDeptName,
          x.rectifyPresideName,
          x.rectifyTerm,
          x.rectifyCompleteTime,
          x.accepUser,
        ])
        // 定义Excel表头
        const header = [
          ['隐患排查治理台账'],
          [
            '序号',
            '问题点',
            '检查时间',
            '检查类别',
            '整改措施',
            '责任单位',
            '责任人',
            '整改时间',
            '',
            '验收人',
          ],
          ['', '', '', '', '', '', '', '计划完成时间', '实际完成时间', ''],
        ]
 body.unshift(...header) // 将定义好的表头添加到 body 中
 const sheet = xlsx.utils.aoa_to_sheet(body) // aoa_to_sheet 将二维数组转成 sheet
 // 合并单元格的函数
        const merges = [
          { s: { r: 0, c: 0 }, e: { r: 0, c: 9 } },
          { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
          { s: { r: 1, c: 1 }, e: { r: 2, c: 1 } },
          { s: { r: 1, c: 2 }, e: { r: 2, c: 2 } },
          { s: { r: 1, c: 3 }, e: { r: 2, c: 3 } },
          { s: { r: 1, c: 4 }, e: { r: 2, c: 4 } },
          { s: { r: 1, c: 5 }, e: { r: 2, c: 5 } },
          { s: { r: 1, c: 6 }, e: { r: 2, c: 6 } },
          { s: { r: 1, c: 7 }, e: { r: 1, c: 8 } },
          { s: { r: 1, c: 9 }, e: { r: 2, c: 9 } },
        ]
       function addMerges(startRow, endRow, col) {
          if (startRow < endRow) {
            merges.push({
              s: { r: startRow, c: col },
              e: { r: endRow, c: col },
            })
          }
        }
        // 动态合并相同内容的单元格的函数
        function mergeDynamicCells(colIndex) {
          let startRow = 3 // 数据部分从第4行开始
          for (let i = 4; i < body.length; i++) {
            if (body[i][colIndex] !== body[startRow][colIndex]) {
              addMerges(startRow, i - 1, colIndex) // 合并相同内容的单元格
              startRow = i // 更新起始行
            }
          }
          addMerges(startRow, body.length - 1, colIndex) // 合并最后一段相同内容
        }
        // 只对第2列和第5列进行动态合并
        mergeDynamicCells(2) // 合并 2 列
        mergeDynamicCells(3) // 合并 3 列
        mergeDynamicCells(5) // 合并 5 列
        sheet['!merges'] = merges // 将合并信息添加到 sheet 中
        const cols = [
          { wch: 10 },
          { wch: 30 },
          { wch: 25 },
          { wch: 30 },
          { wch: 30 },
          { wch: 25 },
          { wch: 15 },
          { wch: 25 },
          { wch: 25 },
          { wch: 15 },
        ]
        sheet['!cols'] = cols // 设置列宽
        const rows = [{ hpx: 30 }, { hpx: 30 }, { hpx: 30 }]
        sheet['!rows'] = rows // 设置行高
        // 合并居中表格内容
        var range = xlsx.utils.decode_range(sheet['!ref'])
        for (var R = range.s.r; R <= range.e.r; ++R) {
          for (var C = range.s.c; C <= range.e.c; ++C) {
            var cell_ref = xlsx.utils.encode_cell({ r: R, c: C })
            var cell = sheet[cell_ref]
            if (cell) {
              if (!cell.s) cell.s = {}
              if (cell.v == '隐患排查治理台账') {
                cell.s = {
                  font: {
                    sz: 14,
                    name: '宋体',
                    bold: true,
                  },
                  alignment: {
                    vertical: 'center', // 垂直居中
                    horizontal: 'center', // 水平居中
                  },
                }
              } else {
                cell.s = {
                  font: {
                    sz: 11,
                    name: '宋体',
                  },
                  alignment: {
                    wrapText: 1, //自动换行
                    vertical: 'center', // 垂直居中
                    horizontal: 'center', // 水平居中
                  },
                }
              }
            }
          }
        }
        const workbook = xlsx.utils.book_new()
xlsx.utils.book_append_sheet(workbook, sheet, this.compname || 'Sheet') // 向workbook中添加sheet
xlsx.writeFile(workbook, (this.compname || 'Data') + '.xlsx', {type: 'binary',}) // 导出 workbook})},

借鉴:前端使用xlsx-js-style导出Excel文件并修饰单元格样式-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty通信过程中编解码技术

Netty通信过程中编解码技术 粘包/拆包问题为什么有拆包/粘包MTU最大传输单元和MSS最大分段大小滑动窗口TCP报文如何确保数据包按次序到达且不丢数据Nagle算法 拆包/粘包解决方案 Netty实现自定义通信协议通信协议设计Netty如何实现自定义通信协议 粘包/拆包问题 如何获取一个完…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…

全新子比主题7.9.2开心版 子比主题最新版源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程&#xff0c;视频都是语音讲解&#xff0c;…

计算机通信与网络实验笔记

1.LINUX通过版本号判断是否为稳定版本 2.计网基础 &#xff08;CD&#xff09;&#xff0c;默认二层以太网交换机。 &#xff08;10&#xff09;物理层是均分&#xff08;除以&#xff09;&#xff0c;数据链路层及以上是不除的。 3.传输介质&#xff1a; &#xff08;1&…

ssm医院交互系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

网络参考模型总结

物理层&#xff1a; 电信号&#xff0c;有中继器、集线器等设备。 数据链路层&#xff1a;帧&#xff0c;有网桥、交换机等设备&#xff0c;通过mac地址。 网络层&#xff1a;包&#xff0c;有路由器等设备&#xff0c;通过IP地址。 传输层&#xff1a;段&#xff0c;有网…

windows安装cuda与cudnn

目录 cuda安装 前期准备 查看电脑支持的cuda版 方式一 方式二 安装与配置 官网下载安装包 安装 安装检验 环境变量检查&#xff08;可选&#xff09; 卸载 cudnn安装 安装包下载 配置 环境变量配置 安装检验 ​编辑 cuda安装 前期准备 查看电脑支持的cuda版 方…

AtCoder ABC375 A-D题解

省流&#xff1a;史上最难 C 且 C>D。 比赛链接:ABC375 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,ans;string S;cin>>N>>S;for(int i0;i<(N-2);i){if(S[i]# && S[i2]# && S[i1].)ans;}cout…

探索光耦:一文读懂光耦的结构与原理

光耦&#xff0c;全称为光电耦合器&#xff0c;是一种将电信号转换为光信号&#xff0c;再由光信号转换回电信号的器件。它巧妙地穿梭于电信号与光信号之间&#xff0c;实现信号的无缝转换与电气隔离。 光耦的结构与原理 光耦通常由发光二极管&#xff08;LED&#xff09;和光…

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

day4:用户-用户组

一&#xff0c;用户和用户组的概述 用户与用户组的概述与作用 用户&#xff08;User&#xff09;&#xff1a; 用户是操作系统中的基本单位&#xff0c;每个用户都有自己的唯一标识&#xff08;UID&#xff09;。用户可以登录系统并执行各种操作&#xff0c;但受到权限的限制。…

mysql主从复制及故障修复

一、主MySQL数据库的配置 分别在三台主机&#xff08;chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据&#xff0c;其中chen2/10.110作为主MySQL服务器&#xff0c;其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇&#xff1a;mysql数据…

Linux笔记之文件查找和搜索命令which,find,locate,whereis总结

Linux笔记之文件查找和搜索命令which,find,locate,whereis总结 code review! 文章目录 Linux笔记之文件查找和搜索命令which,find,locate,whereis总结1.对比2.whereis 和 which 命令区别3.locate 和 find 命令区别 1.对比 命令功能说明备注which常用于查找可直接执行的命令。…

大模型涌现判定

什么是大模型&#xff1f; 大模型&#xff1a;是“规模足够大&#xff0c;训练足够充分&#xff0c;出现了涌现”的深度学习系统&#xff1b; 大模型技术的革命性&#xff1a;延申了人的器官的功能&#xff0c;带来了生产效率量级提升&#xff0c;展现了AGI的可行路径&#x…

C语言 | 第十七章 | 家庭收支软件-2 读写文件

P 161 项目-CRM(3)-主菜单 2023/3/23 一、显示主菜单 功能说明&#xff1a;用户打开软件&#xff0c;可以看到主菜单&#xff0c;输入5退出软件 思路分析&#xff1a;在customerManage.c中&#xff0c;编写一个函数mainMenu,显示菜单&#xff0c; 在main函数中调&#xff0c…

计算机组成原理(笔记7高速缓冲存储器Cache,计算机组成原理的重难点全、直接、组相连)

为什么要设立高速缓冲存储器 &#xff08;Cache&#xff09;&#xff1f; Cache是介于CPU和主存之间的小容量存储器&#xff0c;存取速度比主存快。它能高速地向CPU提供指令和数据&#xff0c;加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。…

unity静态批处理

unity静态批处理 静态批处理要求和兼容性渲染管线兼容性 使用静态批处理在构建时进行静态批处理在构建时执行静态批处理的步骤&#xff1a; 在运行时进行静态批处理性能影响 静态批处理 静态批处理是一种绘制调用批处理方法&#xff0c;它将不移动的网格组合在一起&#xff0c…

【HarmonyOS NEXT】权限申请及应用设置页跳转

关键词&#xff1a;鸿蒙、程序访问控制、定位、应用详情页、startability、want 在app开发过程中&#xff0c;常进行系统权限的申请以提供设备访问或个性化功能&#xff08;如扫一扫、城市定位、剪贴板等&#xff09;&#xff0c;从而保障应用功能的完整性&#xff0c;那么本期…

mov 转 mp4

1. 下载 ffmpeg 下载链接 Tags GyanD/codexffmpeg GitHub 下载 windos 精简版 解压 &#xff08;里面的mov文件和mp4文件是我后面自己加的&#xff09; 2. 转换 转换命令 ffmpeg -i 5.mov -c:v libx264 -c:a aac 5.mp4 其中 5.mov 是源文件路径 5.mp4是目标路径 使用lib…