JS-页面数据下载为Excel并在Excel中插入图片+在图片中进行绘制
npm install exceljs --save import * as ExcelJS from “exceljs”;
两个方法
function exportExcel() { // 定义数据 let data = [ ['1', '2', '3', '4', '5', '6', '7' ], ['1-1', '1-2', '1-3', '1-4', '1-5', '1-6', '1-7'], ['2-1', '2-2', '2-3', '2-4', '2-5', '2-6', '2-7'] ]; // 创建Excel工作簿 const workbook:any = new ExcelJS.Workbook(); // 创建工作表 const worksheet = workbook.addWorksheet("sheet1"); // sheet名 // 设置列宽 worksheet.columns = [ { width: 20 }, { width: 40 }, { width: 20 }, { width: 20 }, { width: 20 }, { width: 20 }, { width: 30 } ]; // 设置数据行 for (let i = 0; i < data.length; i++) { const row = worksheet.addRow(data[i]); // 设置行高 row.height = 30; // 设置样式 row.alignment = { vertical: "middle", horizontal: "center" }; } // 将图片转换为base64 图片地址 = './img/img.png' 类似这样 const base64Image = await urlToBase64('这里是图片地址'); // 插入图片 const signImage = workbook.addImage({ base64: base64Image, extension: "png", }); // 这里是设置图片位置 worksheet.addImage(signImage, `G${data.length}:G${data.length}`); // 将Excel文件写入文件或导出 // 下面这个是官网提供的方案但是会报错,经过多方查找我发现用下面这个方法即可 // workbook.xlsx.writeFile('MyExcel.xlsx'); workbook.xlsx.writeBuffer() .then((buffer: any) => FileSaver.saveAs(new Blob([buffer]), `${Date.now()}.xlsx`)) .catch((err: any) => console.log('Error writing excel export', err)); }
urlToBase64方法
function urlToBase64(url: any) { return new Promise((resolve, reject) => { let canvas:any = document.createElement('canvas'); let ctx = canvas.getContext('2d'); let img = new Image(); // 设置这里是防止 toDataURL时 跨域报错 img.setAttribute('crossOrigin', 'anonymous'); // 防止缓存 img.src = url + '&time=' + new Date().valueOf(); img.onload = function() { canvas.height = img.height; canvas.width = img.width; // 这里就是我们实现在图片上绘制图形的地方 ctx.moveTo(100, 100); ctx.lineTo(100, 200); ctx.lineTo(200, 200); ctx.strokeStyle = "#f00"; ctx.lineWidth = 10; ctx.stroke(); ctx.beginPath(); ctx.drawImage(img, 0, 0); let dataURL = canvas.toDataURL('image/png'); resolve(dataURL); canvas = null; } }); }
执行exportExcel() 函数后的效果,下面这个是生成的图片,可以看出已经在图片上实现了绘制
这个是下载的效果
如果我写到这里就结束了,我想大部分看了这篇文章的朋友都会骂我,这也是我搜了大量文章后的感想,大量的同志们写博文,都太随意了 主打一个自己能看懂,这里其实有多个大坑
1、就是定义数据时的 data ,很多文章直接就在函数中 this.data 用这个变量,我简直了,鬼知道里面是什么格式,我还得看官网一通查,怕一上来就挨骂,我就直接写出来了
2、workbook.xlsx.writeFile这个官网方法会报错,不能使用
3、我想各位复制完代码后会发现 FileSaver.saveAs 是个啥玩意,这也是我在查第二个问题时遇到的最恶心的一点,这是个什么玩意,直接就用了 也没说哪来的,自己写的还是引用的,于是又折腾了半天,哎,所以希望大家以后写博文还是善良一些,多想想别人怎么用,最好就是复制粘贴然后直接就能跑出结果,否则就别写
说了这么多我还是赶紧放出答案吧
FileSaver.saveAs 哪来的呢
npm install file-saver --save import * as FileSaver from ‘file-saver’;
多方踩坑,这样下载excel,插入图片,在图片中绘制,就算完成了,实属不易,还望点赞,多谢!
最后附加一个 workbook.addImage 的多个方法,本文中使用的base64是因为需要添加绘制,其实还有两个可选择,大家可以根据实际情况,自行选取
// add image to workbook by filename const imageId1 = workbook.addImage({ filename: 'path/to/image.jpg', extension: 'jpeg', }); // add image to workbook by buffer const imageId2 = workbook.addImage({ buffer: fs.readFileSync('path/to.image.png'), extension: 'png', });
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44384273/article/details/132618937
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2020-06-04 js小功能