在 Web 应用中处理 Excel 文件时,复制数据并保留格式是常见的需求。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成 Excel 操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。它提供了完整的 API,支持复制行、列和单元格区域,同时保留原始样式、字体、颜色及其他格式。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
在 Excel 中复制行
使用 Spire.XLS for JavaScript,您可以在同一工作表中或在不同工作表之间复制行,同时保留所有格式、公式和样式。通过 CopyRangeOptions 参数,您可以灵活设置复制选项,例如:复制所有格式、复制条件格式、复制数据验证,或者仅复制公式的结果值等等。这适用于需要复制结构化数据的场景,例如表头、汇总行或格式化模板。具体操作步骤如下:
- 创建
Workbook对象并加载已有的 Excel 文件。 - 通过
workbook.Worksheets.get()获取源工作表和目标工作表。 - 使用
sheet.Rows[index]获取要复制的行。 - 使用
sheet.Copy()指定源行、目标工作表、目标行索引和CopyRangeOptions.All,复制该行及其格式到目标工作表。 - 将源行中单元格的列宽复制到目标行中相应的单元格。
- 使用
SaveToFile()保存工作簿为 Excel 文件。
下面是一个完整的代码示例,展示了在 React 中复制 Excel 行:
function App() {
const copyRows = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将文件加载到虚拟文件系统(VFS)
let excelFileName = 'Copying.xls';
await window.spire.FetchFileToVFS(excelFileName, '', `${process.env.PUBLIC_URL}data/`);
// 创建新工作簿并加载已有文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: excelFileName });
// 获取源工作表和目标工作表
let sheet1 = workbook.Worksheets.get(0);
let sheet2 = workbook.Worksheets.get(1);
// 获取要复制的行
let row = sheet1.Rows[0];
// 将该行及所有格式复制到目标工作表
sheet1.Copy({ sourceRange: row, destRange: sheet2.Rows[0], copyOptions: xlsModule.CopyRangeOptions.All });
// 将源行的列宽复制到目标行的相应单元格
let columns = sheet1.Columns.length;
for (let i = 0; i < columns; i++) {
let columnWidth = row.Columns[i].ColumnWidth;
sheet2.Rows[0].Columns[i].ColumnWidth = columnWidth;
}
// 保存工作簿
const outputFileName = 'CopyRows_out.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>复制 Excel 行</h1>
<button onClick={copyRows}>
生成
</button>
</div>
);
}
export default App;
复制行结果

在 Excel 中复制列
使用 Spire.XLS for JavaScript 复制列同样简单。您可以在同一工作表中复制列,或将其复制到另一个工作表,所有单元格样式、数字格式和数据都会被保留。通过 CopyRangeOptions 参数,您可以灵活设置复制选项。这对于重新组织电子表格布局或复制数据结构非常有用。具体操作步骤如下:
- 创建
Workbook对象并加载已有的 Excel 文件。 - 获取源工作表和目标工作表。
- 使用
sheet.Columns[index]获取要复制的列。 - 使用
sheet.Copy()指定源列、目标工作表、目标列索引和CopyRangeOptions.All,复制该列及其格式到目标工作表。 - 将源列中单元格的列宽和行高复制到目标列中相应的单元格。
- 使用
SaveToFile()保存工作簿为 Excel 文件。
下面是一个完整的代码示例,展示了在 React 中复制 Excel 列:
function App() {
const copyColumns = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将文件加载到虚拟文件系统(VFS)
let excelFileName = 'Copying.xls';
await window.spire.FetchFileToVFS(excelFileName, '', `${process.env.PUBLIC_URL}data/`);
// 创建新工作簿并加载已有文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: excelFileName });
// 获取源工作表和目标工作表
let sheet1 = workbook.Worksheets.get(0);
let sheet2 = workbook.Worksheets.get(1);
// 获取要复制的列
let column = sheet1.Columns[0];
// 将该列及所有格式复制到目标工作表
sheet1.Copy({ sourceRange: column, destRange: sheet2.Columns[0], copyOptions: xlsModule.CopyRangeOptions.All });
// 将源列的列宽和行高复制到目标列的相应单元格
sheet2.Columns[0].ColumnWidth = column.ColumnWidth;
let rows = column.Rows.length;
for (let i = 0; i < rows; i++) {
let rowHeight = column.Rows[i].RowHeight;
sheet2.Columns[0].Rows[i].RowHeight = rowHeight;
}
// 保存工作簿
const outputFileName = 'CopyColumns_out.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>复制 Excel 列</h1>
<button onClick={copyColumns}>
生成
</button>
</div>
);
}
export default App;
复制列结果

在 Excel 中复制单元格
除了复制整行和整列外,Spire.XLS for JavaScript 还提供了 CellRange.Copy() 方法,支持复制特定单元格或单元格区域并保留所有格式。这为您提供了更细粒度的控制,能够精确选择要复制的单元格。您可以在同一工作表中或跨工作表复制单元格区域。具体操作步骤如下:
- 创建
Workbook对象并加载已有的 Excel 文件。 - 获取源工作表和目标工作表。
- 使用
sheet.Range.get()获取源单元格区域和目标单元格区域。 - 使用
sourceRange.Copy()指定目标区域和CopyRangeOptions.All,复制源单元格区域及其格式到目标单元格区域。 - 将源单元格区域的行高和列宽复制到目标单元格区域。
- 使用
SaveToFile()保存工作簿为 Excel 文件。
下面是一个完整的代码示例,展示了在 React 中复制 Excel 单元格:
function App() {
const copyCells = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将文件加载到虚拟文件系统(VFS)
let excelFileName = 'Copying.xls';
await window.spire.FetchFileToVFS(excelFileName, '', `${process.env.PUBLIC_URL}data/`);
// 创建新工作簿并加载已有文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: excelFileName });
// 获取源工作表和目标工作表
let sheet1 = workbook.Worksheets.get(0);
let sheet2 = workbook.Worksheets.get(1);
// 获取源单元格区域和目标单元格区域
let range1 = sheet1.Range.get("A1:E7");
let range2 = sheet2.Range.get("A1:E7");
// 将源单元格区域及其格式复制到目标单元格区域
range1.Copy({ destRange: range2, copyOptions: xlsModule.CopyRangeOptions.All });
// 将源单元格区域的行高和列宽复制到目标单元格区域
for (let i = 0; i < range1.Rows.length; i++) {
let row = range1.Rows[i];
for (let j = 0; j < row.Columns.length; j++) {
let column = row.Columns[j];
range2.Rows[i].Columns[j].ColumnWidth = column.ColumnWidth;
range2.Rows[i].RowHeight = row.RowHeight;
}
}
// 保存工作簿
const outputFileName = 'CopyCells.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>复制 Excel 单元格</h1>
<button onClick={copyCells}>
生成
</button>
</div>
);
}
export default App;
复制单元格结果

常见问题
复制行/列/单元格后目标位置已有数据会怎样
原因:默认情况下,Copy() 方法会覆盖目标位置的现有数据,而不会自动合并或保留原有内容。
解决:如果希望保留目标位置的原有数据,请选择一个空白区域作为目标范围,或在复制前检查目标区域是否为空。也可以先备份目标区域的数据,再执行复制操作。
能否只复制数值而不复制公式
原因:默认 CopyRangeOptions.All 会复制公式本身,而有时只需要公式的计算结果值,不需要保留公式逻辑。
解决:使用 CopyRangeOptions.OnlyCopyFormulaValue 选项,仅复制公式的计算结果值,而非公式本身:
sourceRange.Copy({ destRange: destRange, copyOptions: xlsModule.CopyRangeOptions.OnlyCopyFormulaValue });
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









