将 Excel 文件按工作表、按行或按列拆分为多个独立文件,是数据分发与管理的常见需求。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成拆分操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
按工作表拆分 Excel 为独立文件
按工作表拆分是将多工作表工作簿中的每个工作表导出为独立的 Excel 文件。当一个工作簿中包含多个工作表,且每个表代表不同的数据,如不同部门或月份时,我们可以将每个工作表拆分并保存为独立的 Excel 文件。Spire.XLS 通过遍历源文件中的所有工作表,创建新的工作簿,并拷贝当前工作表来完成这个任务。下方为具体的操作步骤:
- 创建
Workbook对象并使用LoadFromFile()加载 Excel 源文档。 - 遍历源文档中的所有工作表。
- 创建新的
Workbook对象。 - 通过
CopyFrom方法将源工作表复制到新工作簿的默认工作表中。 - 通过
sheet.Name获取工作表的名称,作为输出文件名。 - 通过
SaveToFile()方法保存新的工作簿为 Excel 文件。
下面是一个完整的代码示例,展示了将工作表拆分为多个独立的 Excel 文件:
function App() {
const splitByWorksheet = 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('arial.ttf', '/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 });
// 遍历每个工作表,将其导出为独立文件
for (let i = 0; i < workbook.Worksheets.Count; i++) {
let sheet = workbook.Worksheets.get(i);
// 创建新工作簿并复制当前工作表
let newWorkbook = new xlsModule.Workbook();
let newSheet = newWorkbook.Worksheets.get(0);
newSheet.CopyFrom(sheet);
// 使用工作表名称作为输出文件名
const outputFileName = `${sheet.Name}.xlsx`;
newWorkbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
newWorkbook.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);
}
// 释放资源
workbook.Dispose();
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Split Excel By Worksheet</h1>
<button onClick={splitByWorksheet}>
Generate
</button>
</div>
);
}
export default App;
按工作表拆分后,每个独立文件包含原工作簿中的一个工作表

按行拆分 Excel 文件
按行拆分适用于将大型表格按固定行数分割为多个小文件,便于分页查看或分发。当一个工作表中包含大量数据行,需要拆分为多个文件时,Spire.XLS 通过逐行复制源行到新工作簿来完成这个任务。下方为具体的操作步骤:
- 创建
Workbook对象并使用LoadFromFile()加载 Excel 源文档,获取第一个工作表。 - 创建新的
Workbook对象(默认自带一个工作表)。 - 通过循环逐行调用
Copy方法,将源工作表的指定行复制到新工作表。 - 复制源工作表的列宽到新工作表。
- 通过
SaveToFile()方法保存新的工作簿为 Excel 文件。 - 重复上述步骤创建更多拆分文件,并在必要时单独复制表头行。
下面是一个完整的代码示例,展示了按行将工作表拆分为多个独立的 Excel 文件:
function App() {
const splitByRow = 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('arial.ttf', '/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);
// 创建新的工作簿(默认自带一个工作表)
let newWorkbook1 = new xlsModule.Workbook();
let newSheet1 = newWorkbook1.Worksheets.get(0);
// 将第 1-5 行复制到目标文件
let destRow = 1;
for (let i = 0; i < 5; i++) {
sheet.Copy({
sourceRange: sheet.Rows[i],
worksheet: newSheet1,
destRow: destRow,
destColumn: 1,
copyStyle: true
});
destRow++;
}
// 复制列宽
for (let c = 0; c < sheet.Columns.length; c++) {
newSheet1.SetColumnWidth(c + 1, sheet.GetColumnWidth(c + 1));
}
// 保存第一个拆分文件
const outputFileName1 = "Rows1-5.xlsx";
newWorkbook1.SaveToFile({ fileName: outputFileName1, version: xlsModule.ExcelVersion.Version2010 });
newWorkbook1.Dispose();
// 从 VFS 读取文件数据
const fileData1 = window.dotnetRuntime.Module.FS.readFile(outputFileName1);
// 创建第二个新工作簿
let newWorkbook2 = new xlsModule.Workbook();
let newSheet2 = newWorkbook2.Worksheets.get(0);
destRow = 1;
// 复制表头
sheet.Copy({
sourceRange: sheet.Rows[0],
worksheet: newSheet2,
destRow: destRow,
destColumn: 1,
copyStyle: true
});
destRow++;
// 将第 6-10 行复制到第二个目标文件
for (let i = 5; i < 10; i++) {
sheet.Copy({
sourceRange: sheet.Rows[i],
worksheet: newSheet2,
destRow: destRow,
destColumn: 1,
copyStyle: true
});
destRow++;
}
// 复制列宽
for (let c = 0; c < sheet.Columns.length; c++) {
newSheet2.SetColumnWidth(c + 1, sheet.GetColumnWidth(c + 1));
}
// 保存第二个拆分文件
const outputFileName2 = "Rows6-10.xlsx";
newWorkbook2.SaveToFile({ fileName: outputFileName2, version: xlsModule.ExcelVersion.Version2010 });
newWorkbook2.Dispose();
// 从 VFS 读取文件数据
const fileData2 = window.dotnetRuntime.Module.FS.readFile(outputFileName2);
// 将拆分后的文件打包为 ZIP 下载
const zip = new JSZip();
zip.file(outputFileName1, fileData1);
zip.file(outputFileName2, fileData2);
const zipBlob = await zip.generateAsync({ type: 'blob' });
const zipUrl = URL.createObjectURL(zipBlob);
const a = document.createElement('a');
a.href = zipUrl;
a.download = "SplitByRows.zip";
a.click();
URL.revokeObjectURL(zipUrl);
// 释放资源
workbook.Dispose();
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Split Excel By Row</h1>
<button onClick={splitByRow}>
Generate
</button>
</div>
);
}
export default App;
按行拆分后,每个文件包含表头行和指定数量的数据行

按列拆分 Excel 文件
按列拆分适用于将宽表格按列分组拆分为多个文件,使数据结构更清晰。当一个工作表包含大量列,需要将不同列组拆分为独立文件时,Spire.XLS 通过逐列复制源列到新工作簿来完成这个任务。下方为具体的操作步骤:
- 创建
Workbook对象并使用LoadFromFile()加载 Excel 源文档,获取第一个工作表。 - 创建新的
Workbook对象(默认自带一个工作表)。 - 通过循环逐列调用
Copy方法,将源工作表的指定列复制到新工作表。 - 复制源工作表的列宽到新工作表。
- 通过
SaveToFile()方法保存新的工作簿为 Excel 文件。 - 重复上述步骤创建更多拆分文件。
下面是一个完整的代码示例,展示了按列将工作表拆分为多个独立的 Excel 文件:
function App() {
const splitByColumn = 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('arial.ttf', '/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);
// 创建新的工作簿,将第 1-2 列(AB 列)复制到新文件
let newWorkbook1 = new xlsModule.Workbook();
let newSheet1 = newWorkbook1.Worksheets.get(0);
for (let i = 1; i <= 2; i++) {
sheet.Copy({
sourceRange: sheet.Columns[i - 1],
worksheet: newSheet1,
destRow: 1,
destColumn: i,
copyStyle: true
});
}
// 复制列宽
for (let i = 1; i <= 2; i++) {
newSheet1.SetColumnWidth(i, sheet.GetColumnWidth(i));
}
// 保存第一个拆分文件
const outputFileName1 = "ColumnsAB.xlsx";
newWorkbook1.SaveToFile({ fileName: outputFileName1, version: xlsModule.ExcelVersion.Version2010 });
newWorkbook1.Dispose();
// 从 VFS 读取文件数据
const fileData1 = window.dotnetRuntime.Module.FS.readFile(outputFileName1);
// 创建第二个新工作簿,将第 3-4 列(CD 列)复制到新文件
let newWorkbook2 = new xlsModule.Workbook();
let newSheet2 = newWorkbook2.Worksheets.get(0);
for (let i = 3; i <= 4; i++) {
sheet.Copy({
sourceRange: sheet.Columns[i - 1],
worksheet: newSheet2,
destRow: 1,
destColumn: i - 2,
copyStyle: true
});
}
// 复制列宽
for (let i = 3; i <= 4; i++) {
newSheet2.SetColumnWidth(i - 2, sheet.GetColumnWidth(i));
}
// 保存第二个拆分文件
const outputFileName2 = "ColumnsCD.xlsx";
newWorkbook2.SaveToFile({ fileName: outputFileName2, version: xlsModule.ExcelVersion.Version2010 });
newWorkbook2.Dispose();
// 从 VFS 读取文件数据
const fileData2 = window.dotnetRuntime.Module.FS.readFile(outputFileName2);
// 将拆分后的文件打包为 ZIP 下载
const zip = new JSZip();
zip.file(outputFileName1, fileData1);
zip.file(outputFileName2, fileData2);
const zipBlob = await zip.generateAsync({ type: 'blob' });
const zipUrl = URL.createObjectURL(zipBlob);
const a = document.createElement('a');
a.href = zipUrl;
a.download = "SplitByColumns.zip";
a.click();
URL.revokeObjectURL(zipUrl);
// 释放资源
workbook.Dispose();
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>Split Excel By Column</h1>
<button onClick={splitByColumn}>
Generate
</button>
</div>
);
}
export default App;
按列拆分后,每个文件包含原工作表中的部分列数据

常见问题
拆分后工作表名称显示为默认名(Sheet1)而非原名
原因:CopyFrom 方法仅复制工作表内容,不会保留原工作表名称。新工作簿的默认工作表保持默认名称不变。
解决:复制后通过 newSheet.Name = sheet.Name 手动设置工作表名称:
let newSheet = newWorkbook.Worksheets.get(0);
newSheet.CopyFrom(sheet);
newSheet.Name = sheet.Name;
VFS 文件加载失败或路径错误
原因:文件路径或 VFS 文件名不正确,或必需的字体文件未载入 VFS,导致工作簿加载失败。
解决:确认 FetchFileToVFS 的参数路径正确。字体文件路径应为 /Library/Fonts/,并确保字体文件名精确匹配(如 arial.ttf):
await window.spire.FetchFileToVFS('arial.ttf', '/Library/Fonts/', fontSourcePath);
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









