You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将XLSX文件转换为PDF?寻求适配该场景的技术方案

XLSX转PDF实现方案(SheetJS + pdfMake)

核心流程分为三步:读取XLSX文件数据 → 将数据转换为pdfMake兼容格式 → 生成PDF文件。

1. 安装依赖

先安装两个核心工具库:

  • xlsx:用于解析XLSX文件,提取结构化数据
  • pdfmake:用于将处理后的数据生成PDF文档

执行安装命令:

npm install xlsx pdfmake

2. 读取XLSX数据

使用xlsx库读取文件,将工作表内容转换为数组格式。以下是Node.js环境示例(前端浏览器环境可通过FileReader读取用户上传文件后处理):

const XLSX = require('xlsx');
const fs = require('fs');

// 读取本地XLSX文件
const workbook = XLSX.readFile('source.xlsx');
// 获取第一个工作表(可指定具体工作表名称,比如workbook.Sheets['Sheet2'])
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
// 将工作表转换为二维数组(第一行为表头)
const rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });

3. 转换数据适配pdfMake格式

pdfMake的表格需要明确的header和body结构,我们需要把原始数据做对应转换:

// 提取表头(数组第一行)
const tableHeader = rawData[0];
// 提取表格内容(从第二行开始)
const tableBody = rawData.slice(1);

// 可选:处理特殊格式单元格(比如日期、数字格式化)
tableBody.forEach(row => {
  row.forEach((cell, index) => {
    // 判断是否为日期格式的单元格并转换为可读字符串
    if (typeof cell === 'number' && XLSX.SSF.isDate(cell)) {
      row[index] = new Date(XLSX.SSF.parse_date_code(cell)).toLocaleDateString();
    }
  });
});

4. 生成PDF文件

配置pdfMake的文档定义,设置表格样式后生成PDF:

const pdfMake = require('pdfmake/build/pdfmake');
const pdfFonts = require('pdfmake/build/vfs_fonts');
pdfMake.vfs = pdfFonts.pdfMake.vfs;

// 定义PDF文档结构
const docDefinition = {
  content: [
    {
      table: {
        headerRows: 1,
        widths: ['*', '*', '*', '*'], // 按列数设置宽度,*表示自动分配空间
        body: [tableHeader, ...tableBody]
      },
      layout: 'lightHorizontalLines' // 可选表格样式,比如'noBorders'、'headerLineOnly'
    }
  ]
};

// Node.js环境:生成PDF并保存到本地
pdfMake.createPdf(docDefinition).getBuffer((buffer) => {
  fs.writeFileSync('result.pdf', buffer);
  console.log('PDF生成完成');
});

// 前端浏览器环境:直接下载PDF
// pdfMake.createPdf(docDefinition).download('result.pdf');

额外注意事项

  • 合并单元格处理:如果XLSX中有合并单元格,xlsx库会在对应位置留空值,需要解析工作表的!merges属性,给pdfMake表格配置rowSpan或colSpan属性。
  • 样式自定义:可以给表头或单元格添加样式,比如设置表头背景色:
    // 替换原表头定义,添加样式
    const styledHeader = tableHeader.map(cell => ({
      text: cell,
      fillColor: '#f0f0f0',
      bold: true,
      alignment: 'center'
    }));
    // 然后在docDefinition的table.body中使用[styledHeader, ...tableBody]
    
  • 大文件处理:如果是超大XLSX文件,建议分批读取工作表数据,避免内存占用过高。

内容的提问来源于stack exchange,提问作者Jonathan Guaynora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:15:38