因公司需求改动, 但是因为到的地方比较多,所以单独写一个单工作表导出,实际可用多工作表的代码部分


interface IHeader {k: string;v: string;
}
export interface IParams<D extends any> {header: IHeader[];data: D[];sheetName: string;
}/**** 导出 excel(带水印) 公共方法* @param header v 为头,k 为对应 data 数据的 name* 例:const header = [{k: 'region',v: '所属区域',}]* @param data 要导出的数据例:const data = [{region:'广州'},{region:'深圳'}]* @param filename 导出的 excel 文件名称* @param sheetName 指定第一个工作表的名称* @param staff 水印名称* @param params 导出多个工作表* 格式为:* [{header:[],data:[],sheetName:''}]* @returns*/
export const createWsSheet = <T, D>(header: IHeader[],data: T[],filename: string,sheetName = 'sheet1',params: IParams<D>[] = [],staff: string = '水印名称',
): void => {Message.loading('正在导出...');if (!((header && data) && (header.length && data.length))) {Message.error('导出失败');return;}// 创建工作簿const workbook = new ExcelJS.Workbook();// 获取水印const base64 = setWatermark(staff);const imageId1 = workbook.addImage({ base64, extension: 'png' });// 创建带有红色标签颜色的工作表const worksheet = workbook.addWorksheet(sheetName, { properties: { tabColor: { argb: 'FFC0000' } } });// 生成 columnsconst columns = header.map((col: IHeader): { name: string } => ({ name: col.v }));// 生成 rowsconst rows = data.map((row: T): T[] => {return header.map(itm => isNull(row[itm.k]) ? row[itm.k] : '');});// 添加背景图片worksheet.addBackgroundImage(imageId1);// 添加数据worksheet.addTable({name: filename,ref: 'A1',// 表格左上角位置columns,rows});// 多工作表if (params && params.length) {params.forEach((el: IParams<D>) => {if (!((el.header && el.data) && (el.header.length && el.data.length))) {Message.error('导出失败');return;}const worksheetM = workbook.addWorksheet(el.sheetName, { properties: { tabColor: { argb: 'FFC0000' } } });// 生成 columnsconst columnsM = el.header.map((col: IHeader): { name: string } => ({ name: col.v }));// 生成 rowsconst rowsM = el.data.map((row: D): D[] => {return el.header.map(itm => isNull(row[itm.k]) ? row[itm.k] : '');});// 添加背景图片worksheetM.addBackgroundImage(imageId1);// 添加数据worksheetM.addTable({name: el.sheetName,ref: 'A1',// 表格左上角位置columns: columnsM,rows: rowsM});})}workbook.xlsx.writeBuffer().then((res) => {saveAs(new Blob([res], { type: 'application/octet-stream' }), filename)});Message.success('导出成功');
};
/*** 判断该数据是否为空* @param data 要判断的数据* @returns 布尔值:true/false*/
const isNull = (data: any): boolean => {return (data ?? '') !== '';
}/*** 绘画水印* @param str 要做出水印的文字* @returns Base64*/
const setWatermark = (str: string): string => {let id = '1.23452384164.123412416';if (document.getElementById(id) !== null) {document.body.removeChild(document.getElementById(id) as any);}// 创建一个画布let can = document.createElement('canvas');// 设置画布的长宽can.width = 500;can.height = 420;let cans = can.getContext('2d') as any;// 旋转角度cans.rotate(-25 * Math.PI / 180);// 设置字体大小cans.font = "800 40px Microsoft JhengHei";// 设置填充绘画的颜色、渐变或者模式cans.fillStyle = "rgba(130, 142, 162, 0.2)";// 设置文本内容的当前对齐方式cans.textAlign = 'center';// 设置在绘制文本时使用的当前文本基线cans.textBaseline = 'Middle';cans.fillText(str, 180, 350);const dataURL = can.toDataURL('image/png');return dataURL;
}

js 通过 exceljs 和 canvas 实现导出带水印的 excel 表相关推荐

  1. XLSX实现导出带样式的Excel表格的坑

    XLSX导出带样式的Excel表格失败 导入XLSX xlsx-style的使用 项目的要求,需要导出一个结果到Excel表格中,因为所以,没有用Java的方式去实现,而选择了Vue前端直接导出的方式 ...

  2. 导出带图片的Excel报表

    导出带图片的Excel报表 先引用 Microsoft.Office.Tools.Excel.v4.0.Utilities.dll程序集,然后在后台页面引用using Excel = Microsof ...

  3. Java导出带格式的Excel数据到Word表格

    在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用Spi ...

  4. 如何通过Java导出带格式的 Excel 数据到 Word 表格

    在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...

  5. WPS.JS宏应用案例01:创建带超链接的工作表目录

    HI,大家好,我是星光. 之前给大家分享了如何使用函数或VBA创建带超链接的工作表目录,今天再给大家分享一下,如何使用WPS的JS宏实现同样的目的. 复制运行以下代码,即可在当前工作表的A列创建如上图 ...

  6. SpringBoot+MySql+LayUI实现数据导出的功能(Excel表)

    前端代码: <div class="comment_add_or_last" style="background-color: #01AAED">& ...

  7. python按某列拆分excel表格_python带格式拆分excel表单,copy库完美搞定

    python拆分excel表单,生成单独的excel文件,网上这方面的文章很多.但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲.本文通过调用copy库,完美实现带格式拆分表单 ...

  8. python拆分excel 样式不变_python带格式拆分excel表单,copy库完美搞定

    python拆分excel表单,生成单独的excel文件,网上这方面的文章很多.但大多只讲主功能如何实现,让拆分后的表保持和原表单一致的格式,则鲜有人讲.本文通过调用copy库,完美实现带格式拆分表单 ...

  9. mysql8.0导出带数据的库表_MySQL8.0数据库导出与备份

    方法一:可视化工具Navicat操作 1-1.转存sql文件 1-2.另存为sql文件        2-1.新建数据库 2-2.先双击打开刚才创建好的数据库,然后右击,如果右击的选项为灰色则是没有打 ...

最新文章

  1. Leangoo领歌敏捷项目管理工具新增测试管理功能
  2. 多浏览器 div 半透明
  3. 正则表达式二 :贪婪与非贪婪
  4. 视觉与听觉相结合的深度跨域情绪识别
  5. Javascript学习之函数(function)
  6. Linux:I/O多路转接之select(有图有代码有真相!!!)
  7. ORACLE因为字符集不同,进行中文条件查询,查询结果为空
  8. Windows下JetBrains CLion的pthread使用配置
  9. SQL Server datetime数据类型设计与优化误区
  10. i710700黑苹果_[Hackintosh]解决黑苹果无法使用Siri、iMessage等服务
  11. 在Virtualbox虚拟机中安装MSDOS(简易教程)
  12. 【python爬虫】求人不如求己,自己动手写一个CSDN博客备份小工具?
  13. matlab julia分形图,Mandelbrot集和Julia集的分形图之matlab实现
  14. 10以内转大写汉字java_1.输入一个0-10之间的阿拉伯数字,将其转换成中文大写数...
  15. TPM、TCM分别是什么?
  16. android代码编写,如何正确编写Android代码
  17. squirrelmail(小松鼠web邮件系统)
  18. HTML5交互性是什么意思,HTML5的结构和语义(5):交互
  19. 没有美术基础学游戏建模怎么样?
  20. Linux内核驱动模块如何添加math.h

热门文章

  1. 苹果应用审核及相关问题解决方法
  2. List 接口中扩充的 10 个方法详解
  3. linux中 在文件中写入一句话怎么写_Linux一句话命令
  4. 关于控件注册和使用许可问题的解决办法
  5. 京东2023年Q1财报预测:短期增速承压,收入和净利润预测被下调
  6. 题目 2281: 次数差
  7. 洛谷 P3387(缩点后+处理 )
  8. 加油------加油
  9. 萝卜开会直播NO.2 | 换一个十年,感受不一样的世界
  10. 基于用户的音乐推荐平台