Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
在实际开发中,常常需要将一个 Excel 文件拆分成若干更小的文件。例如,工作簿中可能为每个部门提供一个工作表,而每位部门负责人只需接收自己的工作表。又或者希望从工作表中提取特定表格或数据块,作为独立文件通过邮件发送,而不暴露工作簿的其余内容。大型合并工作簿有时也需要拆分为更小的片段,以便更容易处理、加快加载速度,或供下游系统进一步处理。
Aspose.Cells for JavaScript via C++ 提供了两种灵活的实现方式。第一种方式遍历源工作簿的所有工作表,将每个工作表的内容复制到全新的 Workbook 实例,并分别保存为独立文件。第二种方式聚焦于工作表中的特定单元格区域,仅将该区域复制到新工作簿。两种方式的通用流程相同:使用 Workbook 类加载源工作簿,通过 Worksheet 和 Cells 对象获取相关数据,将内容转移到目标 Workbook,最后将目标工作簿保存到磁盘。
在此方法中,先打开一次源工作簿,然后对其 Worksheets 集合中的每个 Worksheet,创建一个新的目标 Workbook。将源工作表的内容复制到目标工作簿的第一个工作表中,并使用源工作表的名称生成输出文件名。最终得到的结果是每个工作表对应一个输出文件,每个文件仅包含该源工作表的数据。
当源工作簿中的每个工作表代表一个逻辑上独立的信息单元(如部门、地区、月份或产品线),且希望对每个单元单独交付或处理时,此方法是最佳选择。
以下步骤说明如何通过复制每个工作表到新工作簿来拆分 Excel 文件:
Workbook 对象并传入文件路径,以打开源 Excel 文件。for 或 for...of 循环遍历 Workbook.Worksheets 集合,处理源文件中的每个 Worksheet。Workbook 实例(空工作簿)。Cells 集合并将值写入目标工作表对应的单元格,或使用 Cells.Copy 方法一次性复制整个区域。dataDir + worksheet.Name + ".xls"),确保每个生成的文件名称唯一。Workbook.Save 方法将文件写入磁盘。<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example</h1>
<input type="file" id="fileInput" accept=".xls" />
<button id="runExample">Run Example</button>
<div id="result"></div>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook } = AsposeCells;
const readyPromise = AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: ["arial.ttf", "NotoSansSC-Regular.ttf"]
});
document.getElementById('runExample').addEventListener('click', async () => {
const result = document.getElementById('result');
try {
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
if (!file) {
result.innerHTML = '<p style="color: red;">Please select an .xls file.</p>';
return;
}
result.innerHTML = '<p>Processing...</p>';
const workbook = new Workbook(new Uint8Array(await file.arrayBuffer()));
const downloadLinks = document.createElement('div');
for (let i = 0; i < workbook.worksheets.count; i++) {
const sourceSheet = workbook.worksheets.get(i);
const sheetName = sourceSheet.name;
const destWorkbook = new Workbook();
const destIndex = destWorkbook.worksheets.add();
const destSheet = destWorkbook.worksheets.get(destIndex);
destSheet.name = sheetName;
destSheet.copy(sourceSheet);
const outputData = destWorkbook.save(AsposeCells.SaveFormat.Excel97To2003);
const blob = new Blob([outputData], { type: "application/vnd.ms-excel" });
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = `${sheetName}.xls`;
downloadLink.textContent = `Download ${sheetName}.xls`;
downloadLink.style.display = 'block';
downloadLink.style.marginTop = '8px';
downloadLinks.appendChild(downloadLink);
}
result.innerHTML = '<p style="color: green;">Done! Click a download link to get the result file.</p>';
result.appendChild(downloadLinks);
} catch (error) {
console.error(error);
const errorMessage = document.createElement('p');
errorMessage.style.color = 'red';
errorMessage.textContent = `Error: ${error instanceof Error ? error.message : error}`;
result.replaceChildren(errorMessage);
}
});
</script>
</body>
</html>
预期的输出是一组位于 data 目录的新文件,每个文件对应源工作簿中的一个工作表。每个文件的名称来源于相应的源工作表,并且文件中包含该工作表的数据(以及可选的格式)。
有时需要拆分的数据并非整张工作表,而是工作表中的特定矩形区域,例如 A1:D10 或表示某个表格的命名区域。在这种情况下,复制整个工作表会造成资源浪费,需要采用更精确的方式:定位源区域,仅将该区域复制到新工作簿,并保存为新文件。
当您只想从大型工作表中提取单个表格、报告块或数据区域,同时舍弃所有不相关内容时,此方法非常适用。它也可用于将用户选定的工作表区域导出为独立文件。
以下步骤说明如何通过复制特定区域到新工作簿来拆分 Excel 文件:
Workbook 对象并提供文件路径,以打开源 Excel 文件。Worksheets 集合中获取包含目标区域的 Worksheet,可按索引(例如第一张工作表)或按名称获取。A1:C10,也可以是通过 Worksheet.Cells 集合获取的命名区域,或使用 Worksheet.Cells.CreateRange 创建的区域。Workbook 实例。Worksheet(默认工作表)。A1 开始。可以使用目标 Cells 集合的 Cells.Copy 方法一次性复制整个区域,或遍历源区域的单元格并使用 PutValue 将值写入目标单元格。可选地提供 CopyOptions 以控制复制内容(仅值、值加样式、公式等)。Workbook.Save 方法将目标工作簿保存到磁盘上的新文件路径。预期的输出是 data 目录中的一个新文件,该文件仅包含从源工作簿中提取的指定区域的值(以及可选的格式),文件的第一工作表从单元格 A1 开始,且与源文件的其他数据无任何关联。
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.