当前位置: 首页 > news >正文

node 实现导出, 在导出excel中包含图片(附件)

如果想查看 node mySql 实现数据的导入导出,以及导入批量插入的sql语句,连接如下

node mySql 实现数据的导入导出,以及导入批量插入的sql语句-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/snows_l/article/details/139998373

一、效果如图:

二、实现方法

利用里 exceljs 插件的 addImage 方法进行插入, 关键代码如下:

const workbook = new Excel.Workbook();
const worksheet = workbook.addWorksheet('收入明细');
// 设置表头
// worksheet.addRow(['标题', '月份', '收入金额', '备注', '收入截图']);
let baseTableTitle = [{ header: '标题', key: 'title', width: 20 },{ header: '月份', key: 'date', width: 12 },{ header: '收入金额(元)', key: 'money', width: 16 },{ header: '就职于', key: 'source', width: 12 },{ header: '备注', key: 'remark', width: 24 }
];
if (includePic == 'true') {baseTableTitle.push({ header: '收入截图', key: 'pic', width: 16 });
}
worksheet.columns = baseTableTitle;// 循环写入数据
data.forEach(async (item, index) => {const rowData = worksheet.addRow([item.title, item.date, item.money, item.sourceStr, item.remark]);// 指定行高rowData.height = 50;
});// 插入图片
if (includePic == 'true') {for (let i = 0; i < data.length; i++) {// 插入图片到Excelconst imageId = workbook.addImage({filename: '../public' + data[i].pic, // 图片路径 不能出现中文名字extension: 'jpeg'});// E代表第5列,i+2代表第i+2行,F${i+2}:F${i+2}代表第i+2行第6列worksheet.addImage(imageId, `F${i + 2}:F${i + 2}`);}
}// buffer 返回给前端即可
const buffer = await workbook.xlsx.writeBuffer();

三、完整代码

/** @Description: ------------ fileDescription -----------* @Author: snows_l snows_l@163.com* @Date: 2024-04-15 14:29:31* @LastEditors: snows_l snows_l@163.com* @LastEditTime: 2024-06-24 22:34:26* @FilePath: /Website/Server/src/router/wages.js*/
const express = require('express');
const db = require('../../utils/connDB');
const router = express.Router();
const Excel = require('exceljs');// 导出
router.get('/wages/export', async (req, res) => {let { eDate, sDate, source, includePic } = req.query;let sql = `SELECT * FROM wages`;if (eDate && sDate) {sql += ` WHERE date >= '${sDate}-01' AND date <= '${eDate}-28'`;}if (source) {sql += ` ${eDate && sDate ? 'AND' : 'WHERE'}  source = '${source}'`;}sql += ` ${(eDate && sDate) || source ? 'and' : 'where'} del_flag = ? ORDER BY date DESC`;const params = [0];try {db.queryAsync(sql, params).then(ress => {const data = ress.results;dictSql = `select* from sys_dict where dictType = 'wages_source' and pid <> 0 order by sort ASC;`;db.queryAsync(dictSql).then(async dictRes => {const dictData = dictRes.results;// 处理就职于字典data.forEach(item => {item.sourceStr = dictData.find(dict => dict.value === item.source).label;});/*** 使用 XLSX 库导出excel文件 支持普通的xlsx格式*/// 将数据转换为工作表// const ws = XLSX.utils.json_to_sheet(data);// // 创建工作簿并添加工作表// const wb = XLSX.utils.book_new();// XLSX.utils.book_append_sheet(wb, ws, '收入');// //生成Excel文件的二进制数据// const excelBuffer = XLSX.write(wb, {//   type: 'buffer',//   bookType: 'xlsx'// });// const realName = encodeURI('收入报表.xlsx', 'GBK').toString('iso8859-1');// // 设置响应头// res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');// res.setHeader('Content-Disposition', 'attachment; filename=' + realName);// // 发送Excel文件// res.send(excelBuffer);/*** 使用 exceljs 库导出excel文件*/// 下载图片并保存到临时文件// const downloadImage = async (url, filePath) => {//   const response = await axios.get(url, { responseType: 'arraybuffer' });//   fs.writeFileSync(filePath, response.data);// };const workbook = new Excel.Workbook();const worksheet = workbook.addWorksheet('收入明细');// 设置表头// worksheet.addRow(['标题', '月份', '收入金额', '备注', '收入截图']);let baseTableTitle = [{ header: '标题', key: 'title', width: 20 },{ header: '月份', key: 'date', width: 12 },{ header: '收入金额(元)', key: 'money', width: 16 },{ header: '就职于', key: 'source', width: 12 },{ header: '备注', key: 'remark', width: 24 }];if (includePic == 'true') {baseTableTitle.push({ header: '收入截图', key: 'pic', width: 16 });}worksheet.columns = baseTableTitle;// 循环写入数据data.forEach(async (item, index) => {const rowData = worksheet.addRow([item.title, item.date, item.money, item.sourceStr, item.remark]);// 指定行高rowData.height = 50;});// 插入图片if (includePic == 'true') {for (let i = 0; i < data.length; i++) {// 插入图片到Excelconst imageId = workbook.addImage({filename: '../public' + data[i].pic, // 图片路径 不能出现中文名字extension: 'jpeg'});// E代表第5列,i+2代表第i+2行,F${i+2}:F${i+2}代表第i+2行第6列worksheet.addImage(imageId, `F${i + 2}:F${i + 2}`);}}const buffer = await workbook.xlsx.writeBuffer();// 处理中文文件名const realName = encodeURI('收入报表.xlsx', 'GBK').toString('iso8859-1');// 设置响应头res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');res.setHeader('Content-Disposition', 'attachment; filename=' + realName);// 发送Excel文件res.send(buffer);});});} catch (error) {return res.send({code: 500,data: null,msg: '导出失败'});}
});module.exports = router;

相关文章:

node 实现导出, 在导出excel中包含图片(附件)

如果想查看 node mySql 实现数据的导入导出&#xff0c;以及导入批量插入的sql语句&#xff0c;连接如下 node mySql 实现数据的导入导出&#xff0c;以及导入批量插入的sql语句-CSDN博客https://blog.csdn.net/snows_l/article/details/139998373 一、效果如图&#xff1a; 二…...

【ai】trition:tritonclient yolov4:ubuntu18.04部署python client成功

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行 client代码远程部署在ubuntu18.0…...

oracle 主从库中,从库APPLIED为YES ,但是主库任然为NO

主库 从库 从库已经APPLIED但是主库为APPLIED&#xff0c; 主数据库和备用数据库之间的ARCH-RFS心跳Ping负责更新主数据库上v$archived_log的APPLICED列。 在主数据库上有一个指定的心跳ARCn进程来执行此Ping。如果此进程开始挂起&#xff0c;它将不再与远程RFS进程通信&#…...

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…...

全球无界,语言无阻——魔众帮助中心(多语言)系统全新升级!

&#x1f389;亲爱的用户们&#xff0c;你们好&#xff01;今天&#xff0c;我要向大家隆重介绍一个颠覆传统&#xff0c;助力全球用户的利器——魔众帮助中心(多语言)系统的全新升级版本&#xff01;&#x1f31f; &#x1f310;在这个日益全球化的时代&#xff0c;魔众帮助中…...

SpringCloud集成OpenFeign

一、简介 OpenFeign客户端是一个web声明式http远程调用工具&#xff0c;直接可以根据服务名称去注册中心拿到指定的服务IP集合&#xff0c;提供了接口和注解方式进行调用&#xff0c;内嵌集成了Ribbon本地负载均衡器。 二、SpringCloud集成OpenFeign 版本说明&#xff1a; S…...

Vue - 第3天

文章目录 一、Vue生命周期二、Vue生命周期钩子三、工程化开发和脚手架1. 开发Vue的两种方式2. 脚手架Vue CLI基本介绍&#xff1a;好处&#xff1a;使用步骤&#xff1a; 四、项目目录介绍和运行流程1. 项目目录介绍2. 运行流程 五、组件化开发六、根组件 App.vue1. 根组件介绍…...

21.智能指针(上)

目录 一、概念二、Box\<T\>2.1 概念与应用场景2.2 简单应用2.3 递归类型的创建 三、通过Deref trait将智能指针当作常规引用处理3.1 常规引用3.2 像引用一样使用Box\<T\>3.3 自定义智能指针3.4 函数和方法的隐式解引用强制转换3.5 解引用强制转换与可变性交互 四、…...

Jenkins+gitee流水线部署springboot项目

目录 前言 一、软件版本/仓库 二、准备工作 2.1 安装jdk 11 2.2 安装maven3.9.7 2.3 安装docker 2.4 docker部署jenkins容器 三、jenkins入门使用 3.1 新手入门 3.2 jenkins设置环境变量JDK、MAVEN、全局变量 3.2.1 jenkins页面 3.2.2 jenkins容器内部终端 3.2.3 全…...

python--os.walk()函数使用(超详细)

在Python 3.7中&#xff0c;os.walk()函数的用法与早期版本&#xff08;包括Python 3.4及之后&#xff09;保持一致。os.walk()是一个用于遍历目录树的生成器函数&#xff0c;它生成给定目录中的文件名。这个函数没有直接的参数&#xff08;除了你要遍历的目录路径&#xff0c;…...

基础名词概念

了解以下基础名词概念/定义&#xff1a; IP地址、子网掩码、网关、DNS、DHCP、MAC地址、网络拓扑、路由器、交换机、VPN、端口、TCP、UDP、HTTP、HTTPS、OSI模型、ARP、NAT、VLAN、FTP、SMTP、IMAP、SSL、ICMP、链路聚合、TRUNK、直连路由、静态路由、动态路由、IPV6 端口&am…...

ArkTS开发系列之Web组件的学习(2.9)

上篇回顾&#xff1a;ArkTS开发系列之事件&#xff08;2.8.2手势事件&#xff09; 本篇内容&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 一、知识储备 Web组件就是用来展示网页的一个组件。具有页面加载、页面交互以及页面调试功能 1. 加载网络…...

postman接口工具的详细使用教程

Postman 是一种功能强大的 API 测试工具&#xff0c;可以帮助开发人员和测试人员轻松地发送 HTTP 请求并分析响应。以下是对 Postman 接口测试工具的详细介绍&#xff1a; 安装与设置 安装步骤 访问 Postman 官网&#xff0c;点击右上角的“Download”按钮。 选择你的操作系统…...

C语言经典例题-17

1.最小公倍数 正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数&#xff0c;设计一个算法&#xff0c;求输入A和B的最小公倍数。 输入描述&#xff1a;输入两个正整数A和B。 输出描述&#xff1a;输出A和B的最小公倍数。 输入&#xff1a;5 7 输出&#xff1a…...

鸿蒙学习(-)

.ets文件结构 //页面入口 Entry //组件 Component struct test{//页面结构build(){//容器 **一个页面只能有一个根容器&#xff0c;父容器要有大小设置**}1、Column 组件 沿垂直方向布局的组件&#xff0c;可以包含子组件 接口 Column({space}) space的参数为string | numbe…...

【TB作品】MSP430G2553,单片机,口袋板, 烘箱温度控制器

题3 烘箱温度控制器 设计一个基于MSP430的温度控制器&#xff0c;满足如下技术指标&#xff1a; &#xff08;1&#xff09;1KW 电炉加热&#xff0c;最度温度为110℃ &#xff08;2&#xff09;恒温箱温度可设定&#xff0c;温度控制误差≦2℃ &#xff08;3&#xff09;实时显…...

PCM、WAV,立体声,单声道,正弦波等音频素材

1&#xff09;PCM、WAV音频素材&#xff0c;分享给将要学习或者正在学习audio开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 常用的Audio PCM WAV不同采样率&#xff0c;不同采样深度&#…...

基于深度学习的图像去雾

基于深度学习的图像去雾 图像去雾是指从有雾的图像中恢复清晰图像的过程。传统的图像去雾方法&#xff08;如暗原色先验、图像分层法等&#xff09;在某些情况下表现良好&#xff0c;但在复杂场景下效果有限。深度学习方法利用大量的数据和强大的模型能力&#xff0c;在图像去…...

中国电子学会青少年编程等级考试真题下载

全国青少年软件编程等级考试真题下载&#xff0c;有答案解析 1. 图形化Scratch一级下载 链接&#xff1a;https://pan.baidu.com/s/1C9DR9-hT1RUY3417Yc8RZQ?pwdg8ac 提取码&#xff1a;g8ac 2.图形化Scratch二级下载 链接&#xff1a;https://pan.baidu.com/s/1HI7GaI4ii…...

PostMan动态设置全局变量

1. 前言 在开发过程中调试接口&#xff0c;一般都会使用PostMan。 其中有几个变量可能是好几个接口共用的&#xff0c;就会出现频繁手动复制(ctrlc)、粘贴(ctrlv)的情况。 这个过程得非常留意&#xff0c;生怕复制错了&#xff0c;或删减了某些东西&#xff0c;导致接口报错。…...

基于Slack与AI的IDE智能助手:架构设计与实战部署

1. 项目概述&#xff1a;当你的IDE拥有了“光标智能体” 如果你是一名开发者&#xff0c;每天在IDE&#xff08;集成开发环境&#xff09;里敲代码的时间超过8小时&#xff0c;那你一定对这样的场景不陌生&#xff1a;光标在代码行间跳跃&#xff0c;你正试图理解一个复杂的函…...

Minecraft服务器技能数据自动化管理:mcpskills-cli命令行工具实战指南

1. 项目概述与核心价值 最近在折腾一些Minecraft服务器的自动化管理&#xff0c;发现很多重复性的技能配置、权限同步工作特别耗时。手动去游戏里敲指令&#xff0c;或者对着配置文件一条条改&#xff0c;效率低还容易出错。就在这个当口&#xff0c;我发现了 alibiinformatio…...

BallonsTranslator:3分钟搞定漫画翻译的终极AI辅助工具

BallonsTranslator&#xff1a;3分钟搞定漫画翻译的终极AI辅助工具 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地址: https…...

从EGO-Planner到集群协同:分布式轨迹优化在无人机编队中的应用

1. 项目概述&#xff1a;从单机到集群的自主飞行进化如果你玩过无人机&#xff0c;或者关注过机器人领域&#xff0c;大概会知道让一台机器在空中自主规划路径、避开障碍物已经是个不小的挑战。那么&#xff0c;想象一下&#xff0c;让一群无人机像鸟群一样&#xff0c;在复杂、…...

当深度学习赋能异步电机矢量控制:从模型优化到性能跃迁

1. 异步电机矢量控制的传统挑战 我第一次接触异步电机矢量控制是在2015年做工业机器人项目时。当时为了调试一个简单的速度环&#xff0c;整整花了两周时间反复调整PI参数。这种经历让我深刻体会到传统控制方法的局限性——就像用螺丝刀修理精密手表&#xff0c;虽然最终能调好…...

信号净化实战:从基础平滑到智能去噪

1. 信号净化入门&#xff1a;为什么我们需要处理噪声&#xff1f; 第一次接触传感器数据时&#xff0c;我被现实狠狠上了一课——实验室里漂亮的平滑曲线在真实场景中根本不存在。记得去年处理工厂振动传感器数据时&#xff0c;原始信号看起来就像心电图叠加了摇滚乐节奏。这种…...

如何3分钟精准定位Windows热键冲突:Hotkey Detective深度技术解析

如何3分钟精准定位Windows热键冲突&#xff1a;Hotkey Detective深度技术解析 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

Obsidian数据迁移终极指南:如何将10+平台笔记一键导入知识库

Obsidian数据迁移终极指南&#xff1a;如何将10平台笔记一键导入知识库 【免费下载链接】obsidian-importer Obsidian Importer lets you import notes from other apps and file formats into your Obsidian vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i…...

AI计算工作量化模型:跨硬件效能评估与能效优化

1. AI工作量化模型的核心价值与应用场景在当今AI技术快速渗透到各行各业的背景下&#xff0c;如何准确衡量AI系统的计算效率和工作量成为一个关键问题。传统上&#xff0c;我们使用FLOPs&#xff08;每秒浮点运算次数&#xff09;等指标来评估计算性能&#xff0c;但这些指标存…...

从零搭建静态博客:Hugo + GitHub Pages 全流程实战指南

1. 项目概述&#xff1a;一个静态博客的诞生与进化 如果你在GitHub上搜索过个人博客的源码&#xff0c;大概率会见过类似 username/username.github.io 这样的仓库名。 Yucco-K/yucco-k.github.io 就是这样一个典型的、以GitHub Pages为宿主的个人静态博客项目。乍一看&am…...