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

8 篇文章 0 订阅
4 篇文章 0 订阅

如果想查看 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++) {
    // 插入图片到Excel
    const 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++) {
            // 插入图片到Excel
            const 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;

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 NestJS 导入和导出 Excel 文件可以使用 `exceljs` 库来实现。以下是一个简单的示例: 首先,确保已经安装了 `exceljs` 这个库: ``` npm install exceljs ``` 然后,创建一个导出 Excel 的函数: ```typescript import { Injectable } from '@nestjs/common'; import * as ExcelJS from 'exceljs'; import { Response } from 'express'; @Injectable() export class ExcelService { async exportToExcel(data: any[], res: Response, filename: string) { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet 1'); // 将数据写入工作表 worksheet.addRows(data); // 设置响应头,告诉浏览器下载文件 res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', `attachment; filename=${filename}.xlsx`); // 将工作簿数据写入响应流 await workbook.xlsx.write(res); // 结束响应 res.end(); } } ``` 在你的控制器使用 `ExcelService` 导出 Excel 文件: ```typescript import { Controller, Get, Res } from '@nestjs/common'; import { ExcelService } from './excel.service'; @Controller('excel') export class ExcelController { constructor(private readonly excelService: ExcelService) {} @Get('export') async exportToExcel(@Res() res) { const data = [ ['Name', 'Age'], ['John Doe', 30], ['Jane Smith', 25], // 更多数据行... ]; await this.excelService.exportToExcel(data, res, 'data'); } } ``` 在这个例子,我们创建了一个 `ExcelService` 来处理 Excel 相关的操作。在 `exportToExcel` 方法,我们使用 `exceljs` 创建一个工作簿,将数据写入工作表,并将工作簿数据写入响应流实现导出 Excel 文件的功能。 在控制器,我们通过 `@Get('export')` 装饰器创建了一个 GET 路由,当用户访问 `/excel/export` 时,会触发 `exportToExcel` 方法导出 Excel 文件。 注意:以上示例是基于 NestJS 的示例,你需要在自己的项目相应地进行配置和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snows_l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值