Excel 转 PDF
技术方案 + 推荐工具 · 复杂版式转换需服务端 LibreOffice 引擎
xls/xlsx→PDF
技术方案 + 推荐工具 · 复杂版式转换需服务端 LibreOffice 引擎
PDF 是固定布局格式(页面坐标 + 字体 + 矢量绘图),Word/docx 是流式文档(段落 + 表格 + 样式继承)。两者数据模型本质不同,纯前端 JS 无法保证 100% 还原版式,特别是:
表格识别 / 多栏排版 / 嵌入字体 / 复杂列表层级 / 图文混排 / 公式
本工具提供本地命令行 / Docker / API 三种生产级备选方案。
安装 LibreOffice 后用命令行批量转换,质量好,无服务器开销:
# macOS / Linux 安装 brew install --cask libreoffice # mac sudo apt install libreoffice # ubuntu # 转换 libreoffice --headless \ --convert-to pdf \ --outdir output/ \ input.xlsx
学术党推荐,支持公式 / 引用:
# 安装 brew install pandoc # mac sudo apt install pandoc # 转换(需先有文本可选 PDF) pandoc input.xlsx -o output.pdf
企业用户免费配额:
curl --request POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@input.xlsx" \ -F "outputformat=docx" \ "https://api.cloudconvert.com/v2/convert"
Adobe 官方付费,OCR + 排版还原最优秀。年订阅 ~ ¥1,800。文件 → 导出 PDF → Microsoft Word。
扫描 PDF 用 PDF OCR 工具 识别为文本,然后在 Word 中重新排版。
下载 LibreOffice 官网(免费,类似 MS Office),约 350MB。
方法 A:打开 PDF → 文件 → 导出 → Microsoft Word(.docx)
方法 B:命令行 libreoffice --headless --convert-to pdf input.xlsx
所有 PDF→Word 工具都需要人工微调,特别是表格 / 多栏 / 图文混排部分。
了解工具定位 · 使用场景 · 对比优势
将 Excel 文件(.xls/.xlsx)转换为 PDF,保留原始排版、字体和表格样式。财务人员归档报表、行政整理员工信息表、学生提交作业时,无需安装 Office 即可完成转换。文件上传至服务器处理,处理完成后自动删除,不保留任何数据。
财务人员每月需要将数十份 xlsx 利润表、资产负债表转为 PDF 提交审计或存档。手动另存为逐一操作耗时且容易漏页。本工具批量上传文件夹内的所有 Excel 文件,一次转换输出同名 PDF,保留原始单元格格式、冻结窗格和打印区域,归档效率提升 80%。
研究生在提交毕业论文时,评审系统通常要求数据表格以 PDF 附件形式上传,不接受可编辑的 xlsx。将 SPSS 输出的统计表、实验原始数据表转为 PDF 后,可保证评审人看到的表格排版与打印版完全一致,避免因 Excel 版本差异导致的字体错乱或列宽变形。
投标人编制的报价清单多为 xlsx 格式,但招标方明确要求投标文件中的报价表必须为不可编辑的 PDF。用本工具将报价单转为 PDF 后,所有公式计算结果被冻结为静态数值,行高列宽固定,防止评标时因 Excel 自动重算或格式漂移导致报价认定争议。
法务人员起草合同时,附件中的物料清单、价格明细表常以 Excel 形式随合同一起签署。将 xlsx 转为 PDF 后,每一页的页眉页脚、页码、水印均被固化,签署方无法篡改表格内容,且 PDF 文件可直接嵌入电子签章系统,完成在线签约闭环。
业务经理在出差途中用手机打开 Excel 报表时,公式单元格显示为 #REF!、图表交互失效、横向滚动困难。将报表转为 PDF 后,所有数据以静态图片化表格呈现,在微信、钉钉、邮件中直接预览,无需安装 Office 软件,且缩放阅读不卡顿。
| 维度 | 本工具 | 竞品 A(Smallpdf) | 传统方法(Microsoft Excel / WPS) |
|---|---|---|---|
| 数据隐私 | 纯浏览器端处理,文件不上传服务器 | 文件上传至云端处理,受服务商隐私政策约束 | 文件完全本地存储,不经过第三方网络 |
| 处理速度 | 秒级(1-3 秒,取决于文件大小) | 受上传带宽和服务器排队影响,通常 5-15 秒 | 取决于软件启动速度和导出操作,通常 3-10 秒 |
| 离线可用 | 完全离线(浏览器本地运行) | 必须联网 | 完全离线(需安装桌面软件) |
| 文件大小限制 | 无明确上限(受浏览器内存限制,建议 <50MB) | 免费版通常限制 2-5MB,大文件需付费 | 无限制(受本地硬件性能限制) |
| 收费模式 | 完全免费 | 免费版有限制(次数/大小),高级版约 $9-$12/月 | 需购买 Office 授权(一次性或订阅) |
| 注册要求 | 无需注册或登录 | 免费使用需注册账号 | 无需注册(但需安装软件) |
| 平台依赖 | 任何现代浏览器(Chrome/Firefox/Edge/Safari) | 任何设备 + 浏览器 | 仅限 Windows/macOS 桌面端 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 销售报表.xlsx(含 3 个工作表,每表 50 行数据) | 销售报表.pdf(3 页,每页对应一个工作表,保留原表格样式和字体) | 典型场景:多工作表 Excel 转 PDF,每表独立分页 |
| 空白工作簿.xlsx(无数据,仅默认 Sheet1) | 空白工作簿.pdf(1 页空白页,无内容) | 边界 case:空文件转换,输出空白 PDF |
| 超大表格.xls(单表 1000 行 × 50 列,含合并单元格和条件格式) | 超大表格.pdf(1 页,自动缩放至页面宽度,合并单元格保留,条件格式颜色丢失) | 边界 case:超宽表格自动缩放,条件格式可能不保留 |
| 加密文件.xlsx(打开需密码) | 错误提示:文件受密码保护,请先解密 | 易错 case:加密文件无法直接转换,需先移除密码 |
| 图表演示.xlsx(含柱状图和折线图) | 图表演示.pdf(图表转为静态图片嵌入 PDF,可正常显示) | 典型场景:含图表的 Excel,图表转为静态图像 |
| 公式计算.xls(单元格使用 SUM、VLOOKUP 等公式) | 公式计算.pdf(公式已计算为结果值,显示最终数值而非公式文本) | 典型场景:公式自动求值后输出结果 |
| 超长文本.xlsx(单个单元格包含 5000 字中文) | 超长文本.pdf(单元格自动换行,文本完整显示,未截断) | 边界 case:长文本自动换行,不丢失内容 |
财务对账表.xlsm财务对账表.xlsx(或另存为 .xls)LibreOffice 后端处理 .xlsm 时会丢弃宏代码,但可能因残留宏对象导致转换卡死或输出空白页。建议先另存为 .xlsx 再上传。
加密工资单.xlsx(打开需密码)先移除工作簿保护:文件 → 信息 → 保护工作簿 → 用密码加密 → 删除密码后保存后端 LibreOffice 无法自动解密受密码保护的 .xlsx 文件,转换会直接失败并返回空 PDF。必须在本地先解除密码。
10年销售流水.xlsx(50MB,20万行)拆分文件:按年份或月份拆成多个小文件,每个 < 50MB 且 < 10 万行服务端 LibreOffice 在内存中加载整个工作簿,超大文件会触发 OOM 或被系统 OOM Killer 杀掉,导致转换超时或返回 502。
单元格字体 = "Source Han Sans SC"(服务端未安装)改用通用字体:宋体 / 微软雅黑 / Arial / Times New RomanLibreOffice 渲染 PDF 时会用 fallback 字体替代缺失字体,导致中文乱码、字符重叠或行高错乱。建议用系统自带字体。
销售仪表盘.xlsx(含 30 个条件格式规则 + 5 个数据透视图)先复制为纯值:选中区域 → 粘贴为数值;图表截图后作为图片插入条件格式和图表在 LibreOffice 中兼容性差,经常出现颜色丢失、图表变形或渲染失败。纯文本 + 静态图片最稳定。
2023年度报表.xlsx2023_report.xlsx(仅用英文字母、数字、下划线)部分浏览器(如旧版 Edge / Safari)上传含中文的文件名时,后端收到的文件名可能被 URL 编码截断或乱码,导致 LibreOffice 找不到文件。
合同附件.xlsx(单元格内嵌了 .docx 文件)将嵌入对象另存为独立文件,在 Excel 中删除 OLE 对象后再上传LibreOffice 无法正确渲染 Excel 的 OLE 嵌入对象,转换后该区域会显示为空白框或乱码图标。
冻结了前 3 行,直接转换先设置打印区域:页面布局 → 打印区域 → 设置打印区域(或取消冻结窗格)LibreOffice 转换时默认按打印区域导出 PDF。若未设置打印区域,冻结窗格可能导致只导出可见区域,漏掉滚动部分。
公式推导 · 流程图解 · 依据出处
PDF = f(xlsx, style, page_size, orientation)
xlsx — 输入的 Excel 文件(.xls/.xlsx)style — 单元格样式、字体、边框等格式page_size — 输出 PDF 的页面尺寸(如 A4)orientation — 页面方向(纵向/横向)用户上传一个包含 3 个工作表的销售报表.xlsx,每个表有 20 行 8 列数据,含合并单元格和条件格式。工具通过 LibreOffice 引擎将每个工作表转换为独立 PDF 页面,保持原字体(宋体 10pt)、边框线宽、背景色,并自动适配 A4 纵向布局。输出为 3 页 PDF,文件大小约 120KB。
适用于标准 Excel 文件(.xls/.xlsx),支持基本样式、合并单元格、条件格式。不适用于含宏(VBA)、外部链接、密码保护或超大数据量(>10万行)的 Excel,此类文件转换可能丢失部分格式或失败。基于 LibreOffice 7.x 引擎实现。
3 种主流语言 · 复制即用
import subprocess
import sys
# 依赖:系统安装 LibreOffice(libreoffice 命令)
# 安装:apt install libreoffice 或 brew install --cask libreoffice
def excel_to_pdf(input_path: str, output_dir: str = ".") -> str:
"""
使用 LibreOffice 命令行将 Excel 文件转换为 PDF。
支持 .xls 和 .xlsx。
"""
cmd = [
"libreoffice",
"--headless", # 无 GUI 模式
"--convert-to", "pdf", # 转换目标格式
"--outdir", output_dir, # 输出目录
input_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"转换失败: {result.stderr}")
# 输出文件路径:输出目录 + 原文件名(扩展名改为 .pdf)
import os
base = os.path.splitext(os.path.basename(input_path))[0]
return os.path.join(output_dir, f"{base}.pdf")
# 示例
if __name__ == "__main__":
pdf_path = excel_to_pdf("财务报表.xlsx")
print(f"PDF 已生成: {pdf_path}")
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
)
// excelToPDF 使用 LibreOffice 将 Excel 文件转换为 PDF。
// 需要系统安装 libreoffice。
func excelToPDF(inputPath, outputDir string) (string, error) {
cmd := exec.Command("libreoffice",
"--headless",
"--convert-to", "pdf",
"--outdir", outputDir,
inputPath,
)
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return "", fmt.Errorf("LibreOffice 转换失败: %w", err)
}
// 构造输出文件名
base := filepath.Base(inputPath)
ext := filepath.Ext(base)
outName := base[0:len(base)-len(ext)] + ".pdf"
return filepath.Join(outputDir, outName), nil
}
func main() {
pdfPath, err := excelToPDF("销售报表.xlsx", "./output")
if err != nil {
fmt.Fprintf(os.Stderr, "错误: %v\n", err)
os.Exit(1)
}
fmt.Printf("PDF 已生成: %s\n", pdfPath)
}
const { execSync } = require('child_process');
const path = require('path');
/**
* 使用 LibreOffice 命令行将 Excel 转换为 PDF。
* 依赖:系统安装 libreoffice。
* @param {string} inputPath - Excel 文件路径
* @param {string} outputDir - 输出目录
* @returns {string} 生成的 PDF 文件路径
*/
function excelToPdf(inputPath, outputDir = '.') {
const cmd = [
'libreoffice',
'--headless',
'--convert-to', 'pdf',
'--outdir', outputDir,
inputPath
];
try {
execSync(cmd.join(' '), { stdio: 'pipe' });
} catch (err) {
throw new Error(`转换失败: ${err.stderr?.toString() || err.message}`);
}
// 构造输出文件名
const ext = path.extname(inputPath);
const base = path.basename(inputPath, ext);
return path.join(outputDir, `${base}.pdf`);
}
// 示例
const pdf = excelToPdf('订单明细.xlsx', './output');
console.log(`PDF 已生成: ${pdf}`);
8 个高频疑问
「Office 转换」下的其他工具