首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

前端使用xlsx模板导出表格

编程知识
2024年09月04日 16:18

前言

前端导出表格有很多种方案,但是表格样式一旦复杂了,那么就得用代码写excel的样式,还是比较麻烦的。每次样式不一样,就得重新写,这时使用表格模板的优势就体现出来了,想导出不同样式的表格直接修改表格模板即可。

方案

我找了两种方案:
1、使用xlsx-template,利用模板语法在xlsx中占位填充后编辑导出。
2、使用exceljs,读取模板后,利用行列坐标定位编辑后导出。
两种我都尝试过,第一种方案类似我这篇文章(https://xiblogs.top/?id=27) 中使用的docxtemplater,只不过是docx换成了xlsx,但xlsx-template在浏览器端的兼容不如docxtemplater那么好,你得处理fs、path之类的问题,当然也有老哥(https://www.jianshu.com/p/85c844d96cfb) 通过改项目配置的方式解决了。还是比较麻烦的而且老项目不一定适用,所以我使用了第二种方案。

步骤

1、安装exceljs与file-saver

npm i exceljs
npm i file-saver

2、xlsx模板放在项目的public目录下。


3、使用fetch的方式读取public下的xlsx模板。

let response = await fetch('./static/xlsx/t1.xlsx'); //读取文件

4、将读取的数据转换为buffer再使用exceljs的workbook.xlsx.load加载数据。

let data = await response.arrayBuffer(); //转为二进制
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.load(data); //读取buffer
const worksheet = workbook.getWorksheet(1); //读取第一张表

5、利用exceljs的worksheet.getCell()给指定单元格赋值,getCell参数为行列,如修改第一行第一列数据为test。

worksheet.getCell('1A').value = 'test'

6、使用exceljs的writeBuffer()读取表格为buffer后再使用file-saver的saveAs下载。

await workbook.xlsx.writeBuffer().then(async (buffer) => {
	let blob = new Blob([buffer], { type: 'application/octet-stream' });
	await saveAs(blob, 'exportExcel.xlsx');
	this.loading = false;
});

完整方法如下:

async exportExcel() {
      this.loading = true;
      let response = await fetch('./static/xlsx/t1.xlsx'); //读取文件
      let data = await response.arrayBuffer(); //转为二进制
      const workbook = new ExcelJS.Workbook();
      await workbook.xlsx.load(data); //读取buffer
      const worksheet = workbook.getWorksheet(1); //读取第一张表
      let cols = []; //竖列//A~Z
      for (let i = 65; i < 91; i++) {
        cols.push(String.fromCharCode(i));
      }
      let row = []; //横行1~116
      for (let i = 1; i < 117; i++) {
        row.push(i);
      }
      //坐标定位更新数据
      row.forEach(async (r) => {
        cols.forEach(async (c) => {
          if (r >= 9 && r <= 15 && c >= 'B' && c <= 'R') {
            worksheet.getCell(`${c}${r}`).value = `${c}${r}`;
          }
          if (r >= 17 && r <= 30 && c >= 'B' && c <= 'X') {
            worksheet.getCell(`${c}${r}`).value = `${c}${r}`;
          }
        });
      });
      worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {
        // console.log(rowNumber, row.values);
      });
      //下载
      await workbook.xlsx.writeBuffer().then(async (buffer) => {
        let blob = new Blob([buffer], { type: 'application/octet-stream' });
        await saveAs(blob, 'exportExcel.xlsx');
        this.loading = false;
      });
}

最后下载导出的表格如下:

结语

使用过程中需要注意读取数据时的异步处理。
原文链接:https://xiblogs.top/?id=71

From:https://www.cnblogs.com/xi12/p/18396941
本文地址: http://www.shuzixingkong.net/article/1731
0评论
提交 加载更多评论
其他文章 移动端Android跟ios兼容性问题,反人类!!!
一、查询参数编码问题 我们在日常开发中,有时候会遇到拼接参数特别多的情况,那么就会导致一行代码特别长。那么为了美观呢,有的同学会进行换行处理,如下代码: 可以看到我红色框出来的地方就是经过了手动的回车导致产生的回车换行符。这么做乍一看也挺正常是吧,但其实对于JavaScript来说,这是会被保留的。
移动端Android跟ios兼容性问题,反人类!!! 移动端Android跟ios兼容性问题,反人类!!! 移动端Android跟ios兼容性问题,反人类!!!
牛逼!Vue3.5的useTemplateRef让ref操作DOM更加丝滑
前言 vue3中想要访问DOM和子组件可以使用ref进行模版引用,但是这个ref有一些让人迷惑的地方。比如定义的ref变量到底是一个响应式数据还是DOM元素?还有template中ref属性的值明明是一个字符串,比如ref=&quot;inputEl&quot;,怎么就和script中同名的inpu
牛逼!Vue3.5的useTemplateRef让ref操作DOM更加丝滑
AI时代的信仰是什么
信仰是人们内心深处的信念,是推动人类前进的驱动力。AI从几十年前的缓慢探索,到如今的飞速发展,是什么信仰在驱动这一切呢?
AI时代的信仰是什么 AI时代的信仰是什么 AI时代的信仰是什么
神奇的C语言输出12天圣诞节歌词代码
12天圣诞节程序怎样运行?1988 年,一个令人印象深刻且令人敬畏的 C 代码,代号为 xmas.c,在国际混淆 C 代码竞赛中获胜。该程序甚至比其输出的“压缩”类型还要小,代表了文本压缩标准的全新方式。评委们认为,这个程序像是随意敲击键盘所得到的。但该程序神奇地打印出12天圣诞节的歌词,仅仅几句话
如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件
最近发现服务器上某个web站点老是CPU很高,该站点部署在IIS上,我IIS上有多个站点,每个站点一个进程池,每个进程池取名都是根据站点来取的,所以很容易看出哪个站点吃掉的CPU,该站点已运行十几年,是基于.net 4.8 framework 编写的web站点(十几年的老项目重构的话就不用提,新项目
如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件 如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件 如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件
Centos7.9安装Docker和Docker compose
什么是docker环境 Docker环境是指在计算机中安装和配置了Docker引擎的运行环境。Docker是一种容器化平台,它提供了一种轻量级的虚拟化技术,能够将应用程序及其依赖项打包成一个独立的容器,以实现快速部署、可移植性和易于管理的优势。(Docker环境提供了一种方便、可移植和隔离的方式来管
C# WebSocket高并发通信阻塞问题
项目上遇到使用WebSocket超时问题,具体情况是这样的,OTA升级过程中,解压zip文件会有解压进度事件,将解压进度通过进程通信传给另一进程,通信提示超时异常 小伙伴堂园发现大文件使用Zip解压,解压进度事件间隔竟然是1ms,简直超大频率啊 但是,解压事件超频也不应该通信异常啊,于是我通过1ms
C# WebSocket高并发通信阻塞问题 C# WebSocket高并发通信阻塞问题 C# WebSocket高并发通信阻塞问题
一个开源、跨平台的.NET UI框架 - Avalonia UI
前言 今天大姚给大家分享一个开源、免费(MIT License)、跨平台的.NET UI框架:Avalonia UI。 Avalonia是一个成熟稳定的平台,用于构建桌面、嵌入式、移动的和Web应用程序。一个代码库,无限可能!!! 项目介绍 Avalonia是一个强大的框架,使开发人员能够使用.NE
一个开源、跨平台的.NET UI框架 - Avalonia UI 一个开源、跨平台的.NET UI框架 - Avalonia UI 一个开源、跨平台的.NET UI框架 - Avalonia UI