如何将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
相关产品推荐
相关产品推荐

