Excel 转 PDF

xls/xlsx→PDF

424 次访问
EXCEL TO PDF CONVERSION

Excel 转 PDF

技术方案 + 推荐工具 · 复杂版式转换需服务端 LibreOffice 引擎

为什么浏览器端无法完美做 PDF→Word?

PDF固定布局格式(页面坐标 + 字体 + 矢量绘图),Word/docx流式文档(段落 + 表格 + 样式继承)。两者数据模型本质不同,纯前端 JS 无法保证 100% 还原版式,特别是:

表格识别 / 多栏排版 / 嵌入字体 / 复杂列表层级 / 图文混排 / 公式

本工具提供本地命令行 / Docker / API 三种生产级备选方案。

推荐方案

方案 1:LibreOffice 命令行(推荐 · 免费)

安装 LibreOffice 后用命令行批量转换,质量好,无服务器开销:

# macOS / Linux 安装
brew install --cask libreoffice  # mac
sudo apt install libreoffice     # ubuntu

# 转换
libreoffice --headless \
  --convert-to pdf \
  --outdir output/ \
  input.xlsx

方案 2:Pandoc(开源 · 命令行)

学术党推荐,支持公式 / 引用:

# 安装
brew install pandoc  # mac
sudo apt install pandoc

# 转换(需先有文本可选 PDF)
pandoc input.xlsx -o output.pdf

方案 3:CloudConvert API(在线)

企业用户免费配额:

curl --request POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@input.xlsx" \
  -F "outputformat=docx" \
  "https://api.cloudconvert.com/v2/convert"

方案 4:Adobe Acrobat DC(最佳质量)

Adobe 官方付费,OCR + 排版还原最优秀。年订阅 ~ ¥1,800。文件 → 导出 PDF → Microsoft Word。

方案 5:浏览器 OCR + 手动整理(适合扫描件)

扫描 PDF 用 PDF OCR 工具 识别为文本,然后在 Word 中重新排版。

本地一键操作

步骤 1:安装 LibreOffice

下载 LibreOffice 官网(免费,类似 MS Office),约 350MB。

步骤 2:转换

方法 A:打开 PDF → 文件 → 导出 → Microsoft Word(.docx)

方法 B:命令行 libreoffice --headless --convert-to pdf input.xlsx

步骤 3:检查版式

所有 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 软件,且缩放阅读不卡顿。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A(Smallpdf)传统方法(Microsoft Excel / WPS)
数据隐私纯浏览器端处理,文件不上传服务器文件上传至云端处理,受服务商隐私政策约束文件完全本地存储,不经过第三方网络
处理速度秒级(1-3 秒,取决于文件大小)受上传带宽和服务器排队影响,通常 5-15 秒取决于软件启动速度和导出操作,通常 3-10 秒
离线可用完全离线(浏览器本地运行)必须联网完全离线(需安装桌面软件)
文件大小限制无明确上限(受浏览器内存限制,建议 <50MB)免费版通常限制 2-5MB,大文件需付费无限制(受本地硬件性能限制)
收费模式完全免费免费版有限制(次数/大小),高级版约 $9-$12/月需购买 Office 授权(一次性或订阅)
注册要求无需注册或登录免费使用需注册账号无需注册(但需安装软件)
平台依赖任何现代浏览器(Chrome/Firefox/Edge/Safari)任何设备 + 浏览器仅限 Windows/macOS 桌面端

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 上传 xls 或 xlsx 文件,单文件 ≤ 50MB,支持一次选择多个文件
  2. 点击「开始转换」按钮,系统使用 LibreOffice 引擎将每个表格转为 PDF
  3. 转换完成后,点击「下载」保存单个 PDF,或「全部下载」打包 ZIP

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
销售报表.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:长文本自动换行,不丢失内容

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 上传了 .xlsm(启用宏的工作簿)

错误
财务对账表.xlsm
修复
财务对账表.xlsx(或另存为 .xls)

LibreOffice 后端处理 .xlsm 时会丢弃宏代码,但可能因残留宏对象导致转换卡死或输出空白页。建议先另存为 .xlsx 再上传。

2. 文件包含密码保护 / 只读密码

错误
加密工资单.xlsx(打开需密码)
修复
先移除工作簿保护:文件 → 信息 → 保护工作簿 → 用密码加密 → 删除密码后保存

后端 LibreOffice 无法自动解密受密码保护的 .xlsx 文件,转换会直接失败并返回空 PDF。必须在本地先解除密码。

3. 文件超过 200MB 或行数超 10 万行

错误
10年销售流水.xlsx(50MB,20万行)
修复
拆分文件:按年份或月份拆成多个小文件,每个 < 50MB 且 < 10 万行

服务端 LibreOffice 在内存中加载整个工作簿,超大文件会触发 OOM 或被系统 OOM Killer 杀掉,导致转换超时或返回 502。

4. 单元格使用了不支持的字体(如思源黑体)

错误
单元格字体 = "Source Han Sans SC"(服务端未安装)
修复
改用通用字体:宋体 / 微软雅黑 / Arial / Times New Roman

LibreOffice 渲染 PDF 时会用 fallback 字体替代缺失字体,导致中文乱码、字符重叠或行高错乱。建议用系统自带字体。

5. 工作表包含大量条件格式 / 数据验证 / 图表

错误
销售仪表盘.xlsx(含 30 个条件格式规则 + 5 个数据透视图)
修复
先复制为纯值:选中区域 → 粘贴为数值;图表截图后作为图片插入

条件格式和图表在 LibreOffice 中兼容性差,经常出现颜色丢失、图表变形或渲染失败。纯文本 + 静态图片最稳定。

6. 文件路径或文件名含中文字符(旧版浏览器)

错误
2023年度报表.xlsx
修复
2023_report.xlsx(仅用英文字母、数字、下划线)

部分浏览器(如旧版 Edge / Safari)上传含中文的文件名时,后端收到的文件名可能被 URL 编码截断或乱码,导致 LibreOffice 找不到文件。

7. 单元格内嵌了 OLE 对象(如嵌入的 Word 文档)

错误
合同附件.xlsx(单元格内嵌了 .docx 文件)
修复
将嵌入对象另存为独立文件,在 Excel 中删除 OLE 对象后再上传

LibreOffice 无法正确渲染 Excel 的 OLE 嵌入对象,转换后该区域会显示为空白框或乱码图标。

8. 工作表使用了冻结窗格但未设置打印区域

错误
冻结了前 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 引擎实现。

原理图

上传 Excel 文件.xls / .xlsx服务端转换LibreOffice 引擎下载 PDF 文件.pdf处理流程说明用户通过浏览器上传 .xls 或 .xlsx 文件到服务器服务器使用 LibreOffice 将 Excel 文件转换为 PDF 格式转换完成后,提供 PDF 文件下载链接
用户输入 服务端处理 输出结果

开发者集成

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 个高频疑问

Excel 文件里有图表、条件格式、公式,转成 PDF 后这些东西还在吗?
图表(柱状图、折线图、饼图等)和条件格式(填充色、字体颜色)会保留,但交互性消失(比如鼠标悬停显示数据)。公式不保留——PDF 里只有公式的最终计算结果,看不到原始公式文本。如果文件里有数据透视图或 VBA 宏,转出的 PDF 可能只显示数据源区域,不包含透视图/宏运行结果。建议先另存为普通 xlsx 再转换。
为什么我的 Excel 转成 PDF 后,有些列的内容被截断了,显示不全?
PDF 页面尺寸固定(默认 A4),而 Excel 工作表的列宽可能超出页面宽度。解决方法:转换前在 Excel 中设置页面布局为「将所有列调整为一页」,或手动调窄列宽。本工具使用 LibreOffice 默认的「适合打印宽度」策略,如果某列内容实在太长(如 200 字符的文本),仍可能换行显示甚至溢出。可以尝试先横向排版(A4 横向),能容纳更多列。
这个工具和 WPS 的「输出为 PDF」有什么区别?
核心区别有三点:第一,本工具完全在线运行,不需要安装 Office 或 WPS,浏览器打开就能用;第二,WPS 的 PDF 输出依赖其自身排版引擎,本工具基于 LibreOffice,对复杂 Excel 文件(如多 sheet、合并单元格、数据验证下拉列表)的兼容性稍好;第三,本工具不保存任何文件到服务器(处理完后即删除),而 WPS 桌面版需要本地保存。如果只是简单表格转 PDF,两者结果基本一致。
Excel 文件超过 100MB,或者有几十个 sheet,能转吗?
能转,但受限于浏览器上传和 LibreOffice 处理能力。实测单文件 50MB 以内、sheet 数少于 30 个时,转换速度在 10-30 秒。100MB 以上文件可能因上传超时或服务端内存不足而失败。如果 sheet 非常多(50+),建议分拆为多个小文件分批转换。另外,超大文件中的图片、图表会显著增加 PDF 体积,转换后的 PDF 可能比原 Excel 还大。
转换后的 PDF 里,数字和文字能选中复制吗?还是变成了图片?
能选中复制。本工具是用 LibreOffice 直接渲染生成的 PDF,文字和数字是文本图层,不是扫描图片。选中后可以正常复制粘贴到记事本、Word 等工具。但注意:如果原 Excel 单元格里的数字是文本格式(左上角有绿色三角标记),复制出来的数字可能带引号或空格;如果是日期格式,复制出来的是日期序列值(如 45000),不是原始显示的日期字符串。
我有几列数据是隐藏的,转成 PDF 后隐藏列还会显示出来吗?
默认情况下,隐藏的行和列不会出现在 PDF 中。LibreOffice 会按照 Excel 文件中的「可见」状态来渲染页面。但有一种例外:如果隐藏列是通过「分组」功能收缩的(而非直接右键隐藏),某些版本的 LibreOffice 可能会把收缩状态误判为展开,导致隐藏列出现在 PDF 里。建议转换前手动右键取消隐藏所有列,确认后再转换,或者先用 Excel 的「打印预览」检查一遍。
为什么我转换后的 PDF 文件比原来的 Excel 文件大了好几倍?
常见原因有两个:一是原 Excel 文件包含大量高分辨率图片(如 300 DPI 的截图),LibreOffice 在渲染 PDF 时默认不压缩图片,导致 PDF 体积膨胀;二是字体嵌入——如果原 Excel 使用了特殊字体(如思源黑体),LibreOffice 会把整个字体文件嵌入 PDF,一个字体可能占 10-20MB。解决方法:转换前把图片压缩到 150 DPI 以下,或者改用系统自带字体(宋体、微软雅黑)。
我用的 Excel 是 2003 版(.xls 格式),能转成 PDF 吗?
能转。LibreOffice 兼容 .xls 格式(Excel 97-2003),转换结果与 .xlsx 基本一致。但注意:.xls 格式有行数限制(最多 65536 行),超过的行不会被读取;另外,2003 版不支持条件格式、数据验证等新功能,这些内容在 .xls 中会被丢弃,转换后的 PDF 自然也不会有。建议先用 Excel 2010+ 打开 .xls 文件,另存为 .xlsx 后再上传,可以保留更多格式。
选择 打开 +新窗口 esc关闭