在日常 Excel 文档处理中,复制工作表是最常用且高效的操作之一——无论是基于模板快速创建相似报表,还是跨文档汇总数据,都离不开工作表复制功能。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成此操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
在同一工作簿内复制工作表
在同一个工作簿中复制工作表是日常开发中的高频需求,例如基于月度报表模板快速创建下个月的报表副本。Spire.XLS for JavaScript 通过 CopyFrom 方法实现工作表的复制,复制后的副本会保留源工作表的所有内容,包括数据、样式、字体、颜色、边框、列宽、行高等格式信息。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'Sample.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取第一个工作表。
let sheet = workbook.Worksheets.get(0);
// 添加一个工作表
let sheet1 = workbook.Worksheets.Add("MySheet");
// 将第一个工作表复制到新添加的工作表中。
sheet1.CopyFrom(sheet);
const outputFileName = "CopySheetWithinWorkbook_output.xlsx";
workbook.SaveToFile({ fileName: outputFileName });
// 释放 workbook 对象以释放资源
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>Copy Worksheet Within Workbook</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;
通过 CopyFrom 方法,源工作表中的数据、样式、字体、颜色、边框以及列宽等格式信息会被完整复制到新工作表中。

跨工作簿复制工作表
在实际业务中,经常需要将多个 Excel 文件的数据汇总到同一个工作簿中。例如,从不同部门的报表文件中提取特定工作表合并到总表。通过 AddCopy 方法可以将源工作簿中的工作表完整复制到目标工作簿中。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const sourceFileName = 'ReadImages.xlsx';
const targetFileName = 'Sample.xlsx';
await window.spire.FetchFileToVFS(sourceFileName, '', `${process.env.PUBLIC_URL}data/`);
await window.spire.FetchFileToVFS(targetFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载源工作簿
const sourceWorkbook = new xlsModule.Workbook();
sourceWorkbook.LoadFromFile({ fileName: sourceFileName });
// 获取源工作簿的第一个工作表
const srcWorksheet = sourceWorkbook.Worksheets.get(0);
// 加载目标工作簿
const targetWorkbook = new xlsModule.Workbook();
targetWorkbook.LoadFromFile({ fileName: targetFileName });
// 在目标工作簿中添加新工作表,并将源工作表复制过来
targetWorkbook.Worksheets.AddCopy({ sheet: srcWorksheet });
// 保存目标工作簿
const outputFileName = "CopyAcrossWorkbooks_output.xlsx";
targetWorkbook.SaveToFile({ fileName: outputFileName });
// 释放资源
sourceWorkbook.Dispose();
targetWorkbook.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>Copy Worksheet Across Workbooks</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;
跨工作簿复制时,源工作表的全部数据和样式同样会被保留,AddCopy 会将完整的工作表内容复制到目标工作簿中。

复制选定的单元格区域
有时候我们并不需要复制整张工作表,而只需要将某个单元格区域(例如特定数据表或汇总结果)复制到目标位置。Spire.XLS for JavaScript 提供了 Copy 方法,支持将源区域的数据、样式和格式一同复制到目标区域的起始位置。
function App() {
const sheetToSVG = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将原 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'Sample.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取第一个第一行作为源区域
const sheet = workbook.Worksheets.get(0);
const sourceRange = sheet.Range.get("A1:E1");
// 新添加工作表
let sheet1 = workbook.Worksheets.Add("AddSheet");
// 将源区域复制到目标工作表的起始位置
sheet.Copy(sourceRange, sheet1, sheet.FirstRow, sheet.FirstColumn, true);
sheet1.AllocatedRange.AutoFitColumns();
// 保存工作簿
const outputFileName = "CopyRange_output22.xlsx";
workbook.SaveToFile({ fileName: outputFileName });
// 释放资源
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>Copy Range</h1>
<button onClick={sheetToSVG}>
Start
</button>
</div>
);
}
export default App;
Copy 方法将源区域的数据、样式和格式一同复制到目标区域。适合仅需提取部分数据的轻量场景。

常见问题
复制后列宽不一致
原因:使用字体差异
解决:确保在跨工作簿复制前,所有需要的字体文件已加载到目标工作簿的 VFS 环境中,例如:
await window.spire.FetchFileToVFS(
'simsun.ttc', '/Library/Fonts/', '/'
);
区域复制后位置偏移
原因:Copy 方法中指定的 destRow 和 destColumn 参数不正确,导致数据粘贴到预期之外的位置。
解决:确认目标行和列索引从 1 开始计数(非 0),并在复制前验证目标工作表的行列范围。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







