调整表格布局时,常需要在不打乱原有顺序的前提下腾出一块位置:在两条记录之间补上一行,在既有字段旁新增一列。在指定位置插入空白行与空白列后,其后的行与列依次后移,原有的数据、行高列宽与单元格边框随内容一并迁移,无需另行排版。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成上述操作,通过虚拟文件系统(VFS)管理输入与输出文件,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
在 Excel 中插入一行和一列
表格中间往往需要补上遗漏的一处:一条尚未录入的记录,一个后来才定下的字段。按行号、列号在原位置各插入一次,新腾出的行与列留作空白,原有的内容依次后移,行高、列宽与单元格边框随内容一并迁移,原有的数字格式不受影响。示例工作簿的台账中含一处待补的记录与一列待加的字段,插入前后对比即可看出差别。
在 Excel 中插入一行和一列时,InsertRow 与 InsertColumn 分别按行号、列号插入一整行或一整列:
| 写法 | 得到的结果 |
|---|---|
sheet.InsertRow(6) |
在第 6 行处插入一行空白行,原第 6 行及之后各行依次下移 |
sheet.InsertColumn(4) |
在第 4 列处插入一列空白列,原第 4 列及之后各列依次右移 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,用workbook.LoadFromFile载入输入文件,再用workbook.Worksheets.get(0)取得第一张工作表。 - 用
sheet.InsertRow传入行号,在该位置插入一行空白行。 - 用
sheet.InsertColumn传入列号,在该位置插入一列空白列。 - 用
workbook.SaveToFile保存工作簿,再用workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 Excel 中插入一行和一列:
function App() {
const insertRowAndColumn = 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/`);
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);
// 在第 6 行插入一行空白行
sheet.InsertRow(6);
// 在第 4 列插入一列空白列
sheet.InsertColumn(4);
// 保存工作簿
const outputFileName = 'InsertRowAndColumn.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2016 });
// 释放 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>插入 Excel 行和列</h1>
<button id="insert-row-column" onClick={insertRowAndColumn}>在 Excel 中插入一行和一列</button>
</div>
);
}
export default App;
在指定位置插入一行和一列后的工作表:

在 Excel 中插入多行和多列
需要腾出的若是一整块位置,逐条调用不仅要反复推算新的行号,还会因前一次插入使后续位置整体后移而落在别处。在行号、列号之外给出要插入的条数,即可一次腾出从该位置起连续的若干行或列,其余内容自动后移,插入后的位置与预期一致。示例工作簿的台账中含一批待补的记录与两列待加的字段,插入前后对比即可看出差别。
在 Excel 中插入多行和多列时,两个方法都接受条数参数,一次插入从该位置起连续的一段:
| 写法 | 得到的结果 |
|---|---|
sheet.InsertRow({ rowIndex: 8, rowCount: 3 }) |
从第 8 行起插入 3 行空白行,原第 8 行及之后各行依次下移 |
sheet.InsertColumn({ columnIndex: 5, columnCount: 2 }) |
从第 5 列起插入 2 列空白列,原第 5 列及之后各列依次右移 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,用workbook.LoadFromFile载入输入文件,再用workbook.Worksheets.get(0)取得第一张工作表。 - 用
sheet.InsertRow传入起始行号与rowCount,从该位置起插入连续的若干行。 - 用
sheet.InsertColumn传入起始列号与columnCount,从该位置起插入连续的若干列。 - 用
workbook.SaveToFile保存工作簿,再用workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 Excel 中插入多行和多列:
function App() {
const insertMultipleRowsAndColumns = 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/`);
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);
// 从第 8 行起插入 3 行空白行
sheet.InsertRow({ rowIndex: 8, rowCount: 3 });
// 从第 5 列起插入 2 列空白列
sheet.InsertColumn({ columnIndex: 5, columnCount: 2 });
// 保存工作簿
const outputFileName = 'InsertMultipleRowsAndColumns.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2016 });
// 释放 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>插入 Excel 行和列</h1>
<button id="insert-multiple-rows-columns" onClick={insertMultipleRowsAndColumns}>在 Excel 中插入多行和多列</button>
</div>
);
}
export default App;
一次插入多行和多列后的工作表:

常见问题
InsertRow 的行号是从 0 开始还是从 1 开始
原因:InsertRow、InsertColumn 的行号、列号都从 1 起算,sheet.InsertRow(6) 插到第 6 行的位置上,原本的第 6 行被挤到第 7 行。工作表集合中的下标才是 0 基的,sheet.Worksheets.get(0) 取到的是第一张工作表。
解决:行号、列号直接写工作表中的序号即可,不必再加 1;只有从 Worksheets、Charts 这类集合里取下标的场合才需要留意 0 基的差别。
插入的行和列会带上相邻的单元格格式吗
原因:InsertRow 与 InsertColumn 插入的是空白行、空白列,其中的单元格不带边框、填充与数字格式,格式为默认值;新行取默认行高、新列取默认列宽,原有行高与列宽则跟随各自的行、列一并后移。
解决:若插入的行、列需要与表格其余部分保持一致,在插入之后再单独设置:用 sheet.Range.get('A6:G6') 取得该行,再通过 Style 设置字体与数字格式。
插入多行时能跳过中间的行吗
原因:rowCount、columnCount 表示从起始位置起连续的条数,一次插入的是一整段相邻的行或列,无法在中间留出空档。
解决:需要插入不连续的两段时分开调用,从行号大的那一段开始。先插入靠后的段落,前面各段的位置不受影响;若从行号小的开始,后一段的起始行号会被前一段挤后,落在别处。
在表格末尾追加一行应该传什么行号
原因:InsertRow 只认行号,不区分表头、数据区与合计行,传 LastRow + 1 即在合计行之后腾出一行。
解决:用 sheet.LastRow 取得当前已用区域的末行号,再传给 InsertRow:
const lastRow = sheet.LastRow;
sheet.InsertRow(lastRow + 1);
若要在合计行之前追加,则传合计行的行号;此时合计行本身会被挤到下一行。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









