Excel 除用于存放单元格数据外,也常被用作文件容器:报价单中可嵌入 Word 版合同条款,产品表中可附带 PDF 规格书,双击对象即可直接打开源文件。此类嵌入工作表的文件称为 OLE 对象(Object Linking and Embedding)。在 Excel 界面中插入 OLE 对象仅需「插入 → 对象」两步操作,但若需在浏览器端由程序批量完成,则须借助专门的 API。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成上述操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
在 Excel 中插入 OLE 对象
OleObjects.Add 用于将外部文件插入工作表,共接受三个参数:待嵌入的文件名、对象在工作表上显示的图标,以及链接方式——OleLinkType.Embed 表示将文件嵌入工作簿,OleLinkType.Link 表示以链接方式插入。对象插入后,用 Location 指定锚定到哪个单元格、用 ObjectType 声明嵌入的文件类型,Excel 据此确定双击时调用哪个程序打开。具体操作步骤如下:
- 新建工作簿,在单元格中写入说明文字。
- 打开被嵌入的工作簿,将其工作表渲染为图片,作为 OLE 对象的显示图标。
- 通过
OleObjects.Add将该 Excel 文件嵌入工作表。 - 设置
Location与ObjectType。 - 保存工作簿。
以下为完整的代码示例,演示如何在 React 中将 Excel 文件作为 OLE 对象插入工作表:
function App() {
const insertOleObject = 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/`);
// 将被嵌入的 Excel 文件载入 VFS
const embeddedFileName = 'OLEObjects.xlsx';
await window.spire.FetchFileToVFS(embeddedFileName, '', `${process.env.PUBLIC_URL}/static/data/`);
// 新建工作簿,并写入说明文字
const workbook = new xlsModule.Workbook();
const sheet = workbook.Worksheets.get(0);
sheet.Range.get("A1").Text = "这里是一个 OLE 对象。";
// 打开被嵌入的工作簿,把它的工作表渲染成图片,作为 OLE 对象的显示图标
const embeddedBook = new xlsModule.Workbook();
embeddedBook.LoadFromFile(embeddedFileName);
const embeddedSheet = embeddedBook.Worksheets.get(0);
embeddedSheet.PageSetup.LeftMargin = 0;
embeddedSheet.PageSetup.RightMargin = 0;
embeddedSheet.PageSetup.TopMargin = 0;
embeddedSheet.PageSetup.BottomMargin = 0;
const image = embeddedSheet.ToImage(1, 1, 19, 5);
embeddedBook.Dispose();
// 把 Excel 文件嵌入工作表,文件数据随工作簿一起保存
const oleObject = sheet.OleObjects.Add(
embeddedFileName,
image,
xlsModule.OleLinkType.Embed
);
// 把对象锚定到 B4 单元格,并声明它是一份 Excel 工作表
oleObject.Location = sheet.Range.get("B4");
oleObject.ObjectType = xlsModule.OleObjectType.ExcelWorksheet;
// 保存工作簿
const outputFileName = "InsertOLEObject.xlsx";
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
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>插入 OLE 对象</h1>
<button onClick={insertOleObject}>Start</button>
</div>
);
}
export default App;
示例中的图标直接取自被嵌入工作表的渲染结果,因此 OLE 对象在工作表中显示的是其自身内容。将 ObjectType 改为 OleObjectType.WordDocument、OleObjectType.AdobeAcrobatDocument 等值,即可声明其他类型的嵌入文件。
运行后,插入 Excel 工作簿作为 OLE 对象的效果:

插入带自定义图标的 OLE 对象
ToImage 每次均需先打开工作簿、再按行列范围渲染,适用于需要让对象呈现自身内容的场景;若要为附件统一配图标,直接读取一张现成的图片更为简便,且同一张图片可复用于多个附件。OleObjects.Add 的第二个参数本身即同时接受这两种入参。具体操作步骤如下:
- 将图标图片与附件文件载入 VFS。
- 新建工作簿,用
new xlsModule.Stream将图标图片读取为流。 - 通过
OleObjects.Add将附件以嵌入方式插入,并传入图标流。 - 设置
Location与ObjectType。 - 保存工作簿。
以下为完整的代码示例,演示如何在 React 中插入带自定义图标的 PDF 附件:
function App() {
const insertOleObjectWithIcon = 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/`);
// 将图标图片与附件载入 VFS
const iconFileName = 'OLEIcon.png';
const attachmentFileName = 'Attachment.pdf';
await window.spire.FetchFileToVFS(iconFileName, '', `${process.env.PUBLIC_URL}/static/data/`);
await window.spire.FetchFileToVFS(attachmentFileName, '', `${process.env.PUBLIC_URL}/static/data/`);
// 新建工作簿
const workbook = new xlsModule.Workbook();
const sheet = workbook.Worksheets.get(0);
// 把图标图片读成流,作为 OLE 对象在工作表上的显示图标
const iconStream = new xlsModule.Stream(iconFileName);
// 把 PDF 附件嵌入工作表
const oleObject = sheet.OleObjects.Add(
attachmentFileName,
iconStream,
xlsModule.OleLinkType.Embed
);
// 把对象锚定到 B4 单元格,并声明它是一份 PDF 文档
oleObject.Location = sheet.Range.get("B4");
oleObject.ObjectType = xlsModule.OleObjectType.AdobeAcrobatDocument;
// 保存工作簿
const outputFileName = "InsertOLEObjectWithIcon.xlsx";
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
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>插入带自定义图标的 OLE 对象</h1>
<button onClick={insertOleObjectWithIcon}>Start</button>
</div>
);
}
export default App;
运行后,插入带自定义图标的 PDF 附件作为 OLE 对象的效果:

常见问题
插入后工作表中只显示一个空白图标?
原因:OleObjects.Add 的第二个参数决定 OLE 对象在工作表上的显示图标。使用 ToImage 取图时,若指定的区域落在工作表已用范围之外,得到的将是一张空白图片,插入的对象也只会显示空白。
解决:将取图区域限制在表格有内容的范围内,或改用一张现成的图片文件:
// 用固定图片作为图标,不依赖工作表内容
const iconStream = new xlsModule.Stream('OLEIcon.png');
const oleObject = sheet.OleObjects.Add('Attachment.pdf', iconStream, xlsModule.OleLinkType.Embed);
oleObject.Location = sheet.Range.get("B4");
oleObject.ObjectType = xlsModule.OleObjectType.AdobeAcrobatDocument;
ObjectType 设为其他值会有什么影响?
原因:ObjectType 并非注释,其取值会被写入工作簿的 progId 字段,Excel 双击对象时依据该标识查找对应的程序。同一份 PDF 附件,声明为 OleObjectType.AdobeAcrobatDocument 时写出的 progId 为 Acrobat Document;若声明为 OleObjectType.ExcelWorksheet,写出的则变为 Worksheet,Excel 会尝试用 Excel 本身打开该 PDF,对象将无法打开。
解决:按嵌入文件的实际类型设置 ObjectType。常用取值如下:
| 嵌入文件 | ObjectType |
|---|---|
| Excel 工作簿 | OleObjectType.ExcelWorksheet |
| Word 文档 | OleObjectType.WordDocument |
| PowerPoint 演示文稿 | OleObjectType.PowerPointSlide |
| PDF 文档 | OleObjectType.AdobeAcrobatDocument |
// 按文件真实类型声明,Excel 才能用正确的程序打开
oleObject.ObjectType = xlsModule.OleObjectType.AdobeAcrobatDocument;
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







