工作簿适合编辑,却不一定适合归档与打印。XPS、OFD 与 PostScript 都属于固定版式文档:页面尺寸、文字位置与字体在写出时就被固定下来,换一台机器打开也不会重排。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成这三种格式的转换,输入输出文件通过虚拟文件系统(VFS)管理,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
将 Excel 转换为 XPS
XPS 是随 Windows 一同提供的固定版式文档格式,一份工作簿存成 XPS 之后,版式不再随打开它的软件而变化,适合当作报表的归档副本,或在没有安装 Excel 的机器上查看。转换改变的只是保存格式:工作表的页面设置、单元格格式与所用字体都会随文件一同写出,fileFormat 参数指明目标格式即可。
workbook.SaveToFile 的 fileFormat 参数决定写出哪一种格式:
| 写法 | 得到的结果 |
|---|---|
workbook.LoadFromFile({ fileName: inputFileName }) |
从 VFS 载入待转换的工作簿 |
workbook.SaveToFile({ fileName: 'ExcelToXPS.xps', fileFormat: xlsModule.FileFormat.XPS }) |
按 XPS 格式写出,页面尺寸、文字位置与字体在写出时固定 |
workbook.Dispose() |
释放 workbook 对象占用的资源 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,并用workbook.LoadFromFile加载 Excel 文件。 - 用
workbook.SaveToFile保存工作簿,把fileFormat指定为xlsModule.FileFormat.XPS。 - 用
workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 React 中把 Excel 工作簿转换为 XPS:
function App() {
const excelToXps = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'SalesReport.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 保存为 XPS,格式由 fileFormat 指定
const outputFileName = 'ExcelToXPS.xps';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.XPS });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.ms-xpsdocument' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将 Excel 转为 XPS、OFD 或 PostScript</h1>
<button id="excel-to-xps" onClick={excelToXps}>将 Excel 转换为 XPS</button>
</div>
);
}
export default App;
将 Excel 转换为 XPS 后的文档:

将 Excel 转换为 OFD
OFD 是国内电子公文与电子发票采用的版式文档格式,版面信息以国标的方式描述,常用来交付需要长期保存的正式文件。把销售报表一类的工作簿存成 OFD,其他系统读到的是固定版面,不会因为缺少字体或行高不同而走样。转换过程与前一个功能点相同,只是 fileFormat 换成 OFD。
| 写法 | 得到的结果 |
|---|---|
workbook.LoadFromFile({ fileName: inputFileName }) |
从 VFS 载入待转换的工作簿 |
workbook.SaveToFile({ fileName: 'ExcelToOFD.ofd', fileFormat: xlsModule.FileFormat.OFD }) |
按 OFD 格式写出,版面按国标方式描述 |
workbook.Dispose() |
释放 workbook 对象占用的资源 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,并用workbook.LoadFromFile加载 Excel 文件。 - 用
workbook.SaveToFile保存工作簿,把fileFormat指定为xlsModule.FileFormat.OFD。 - 用
workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 React 中把 Excel 工作簿转换为 OFD:
function App() {
const excelToOfd = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'SalesReport.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 保存为 OFD,格式由 fileFormat 指定
const outputFileName = 'ExcelToOFD.ofd';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.OFD });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/ofd' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将 Excel 转为 XPS、OFD 或 PostScript</h1>
<button id="excel-to-ofd" onClick={excelToOfd}>将 Excel 转换为 OFD</button>
</div>
);
}
export default App;
将 Excel 转换为 OFD 后的文档:

将 Excel 转换为 PostScript
PostScript 是打印设备与印刷流程使用的页面描述语言,文件本身是一段可读的文本,里面既有页面描述,也有随文件嵌入的字体,可以直接送往支持 PostScript 的打印机或排版软件。需要把报表交给印刷环节时,存成 PostScript 比交出一份原始工作簿更稳妥。用法与前两个功能点一致,fileFormat 换成 PostScript。
| 写法 | 得到的结果 |
|---|---|
workbook.LoadFromFile({ fileName: inputFileName }) |
从 VFS 载入待转换的工作簿 |
workbook.SaveToFile({ fileName: 'ExcelToPostScript.ps', fileFormat: xlsModule.FileFormat.PostScript }) |
按 PostScript 格式写出,文件为可读的页面描述文本 |
workbook.Dispose() |
释放 workbook 对象占用的资源 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,并用workbook.LoadFromFile加载 Excel 文件。 - 用
workbook.SaveToFile保存工作簿,把fileFormat指定为xlsModule.FileFormat.PostScript。 - 用
workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 React 中把 Excel 工作簿转换为 PostScript:
function App() {
const excelToPostScript = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'SalesReport.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 保存为 PostScript,格式由 fileFormat 指定
const outputFileName = 'ExcelToPostScript.ps';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.PostScript });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/postscript' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将 Excel 转为 XPS、OFD 或 PostScript</h1>
<button id="excel-to-ps" onClick={excelToPostScript}>将 Excel 转换为 PostScript</button>
</div>
);
}
export default App;
将 Excel 转换为 PostScript 后的文档:

常见问题
转换报错 Cannot found font,是什么原因
原因:写出 XPS、OFD 与 PostScript 时要把用到的字体一并嵌入,工作簿里的中文因此需要字库文件。转换前没有把字体载入 VFS,模块找不到宋体,SaveToFile 会直接中断并抛出 Cannot found font(宋体) installed on the system.。
解决:把字库文件放进 public/font,并在加载工作簿之前载入 VFS,文件名要与代码里写的一致:
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
工作表的页面设置会影响转换出来的文档吗
原因:XPS、OFD 与 PostScript 都是按页写出的,页面的尺寸与方向取自工作表的页面设置,而不是由转换过程另行决定。
解决:会原样带上。以本示例的报表为例,报表保持默认方向时,转出来的 XPS 页面框为 794 × 1122(纵向);把第一张工作表的 sheet.PageSetup.Orientation 设为 xlsModule.PageOrientationType.Landscape 之后再转换,页面框变成 1122 × 794(横向)。纸张大小、页边距与打印区域同样在写出时生效。
转换出来的文件比原工作簿大很多,是什么原因
原因:写出 XPS、OFD 与 PostScript 时,工作簿用到的字体要一并嵌入文件,转换结果因此比只存单元格数据的工作簿大出数倍。这是固定版式文档能够脱离原环境打开的前提。
解决:属于正常现象,无需处理。若要缩小体积,可以换用体积更小的字库文件,或先确认报表没有同时用到好几个字库。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









