把数据写进 Excel 时,最直接的做法是逐个单元格赋值,写十行就要循环十次。但数据在 JavaScript 里往往本来就是成块的——接口返回的列表、页面上已有的表格、计算出的结果集——既然是数组,就没必要拆散了再一格一格塞回去。Spire.XLS for JavaScript 提供的 InsertArray 方法接受整段数组,配合起始行列与写入方向,一次调用就能把整列或整行数据落进工作表。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成上述操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
将一维数组导入工作表
InsertArray 按数据类型分为多个重载:文本用 stringArray,整数用 intArray,小数用 doubleArray。分成三个重载并非多余的设计——Excel 会把单元格按数据类型区别对待,数值右对齐、可以直接参与求和与图表,而被写成文本的数字左对齐,公式里引用它只会得到 0。分数、金额、数量这类要参与计算的字段,就该走数值重载。
其余参数决定数据落在哪里:firstRow 与 firstColumn 指定起始位置,行列都从 1 开始计数;isVertical 决定数组的展开方向——取 false 时沿行铺开,取 true 时沿列铺开。同一个 ['一月', '二月', '三月'],换个方向就是从 A1 到 C1 的一行表头,或是从 A1 到 A3 的一列数据。具体操作步骤如下:
- 将字体载入 VFS。
- 新建
Workbook,用Worksheets.get(0)取得第一个工作表。 - 用
InsertArray的stringArray重载横向写入一行表头。 - 用
stringArray纵向写入姓名列,用intArray纵向写入分数列。 - 用
AllocatedRange.AutoFitColumns调整列宽,再以SaveToFile保存工作簿。
以下为完整的代码示例,演示如何在 React 中把一维数组导入工作表:
function App() {
const importArray = 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 workbook = new xlsModule.Workbook();
const sheet = workbook.Worksheets.get(0);
// 横向写入一行表头:isVertical 为 false,数组沿行展开到 A1:B1
sheet.InsertArray({
stringArray: ['姓名', '分数'],
firstRow: 1,
firstColumn: 1,
isVertical: false,
});
// 纵向写入姓名列:isVertical 为 true,数组沿列展开到 A2:A4
sheet.InsertArray({
stringArray: ['张三', '李四', '王五'],
firstRow: 2,
firstColumn: 1,
isVertical: true,
});
// 纵向写入分数列:数值走 intArray 重载,单元格中保存的是数字而非文本
sheet.InsertArray({
intArray: [92, 85, 78],
firstRow: 2,
firstColumn: 2,
isVertical: true,
});
// 按内容调整列宽
sheet.AllocatedRange.AutoFitColumns();
// 保存工作簿
const outputFileName = 'ImportArray.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>导入一维数组</h1>
<button onClick={importArray}>Start</button>
</div>
);
}
export default App;
运行后,将一维数组导入工作表的效果:

将二维数据表导入工作表
数据表的自然形式是二维数组——第一行表头,其余每行一条记录,像 [['姓名', '科目', '分数'], ['张三', '数学', 92]] 这样。要把二维数据表导入 Excel,需要把二维数组按列拆开,每一列当成一个一维数组单独写入:表头横向写一行,数据部分逐列纵向写入,文本列用 stringArray,数值列用 intArray。同一列的数据类型是统一的,所以每次调用只需选一种写法。若数据是分批到达的,用 LastRow 读出当前已用到的最后一行,下一批接着它的下一行写即可。具体操作步骤如下:
- 将字体载入 VFS。
- 新建
Workbook,用Worksheets.get(0)取得第一个工作表。 - 用
InsertArray的stringArray重载把表头横向写入第一行。 - 把数据部分按列拆开,逐列调用
stringArray或intArray纵向写入。 - 第二批数据到达时,用
LastRow定位起始行,同样逐列写入。 - 用
AllocatedRange.AutoFitColumns调整列宽,再以SaveToFile保存工作簿。
以下为完整的代码示例,演示如何在 React 中把二维数据表导入工作表:
function App() {
const importDataTable = 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 rows = [
['姓名', '科目', '分数'],
['张三', '数学', 92],
['李四', '语文', 85],
];
// 新建工作簿,取第一个工作表
const workbook = new xlsModule.Workbook();
const sheet = workbook.Worksheets.get(0);
// 按列写入:文本列走 stringArray,数值列走 intArray
const writeColumn = (values, firstRow, firstColumn) => {
const isNumeric = values.every((value) => typeof value === 'number');
if (isNumeric) {
sheet.InsertArray({ intArray: values, firstRow, firstColumn, isVertical: true });
} else {
sheet.InsertArray({ stringArray: values, firstRow, firstColumn, isVertical: true });
}
};
// 表头横向写入第一行
sheet.InsertArray({
stringArray: rows[0],
firstRow: 1,
firstColumn: 1,
isVertical: false,
});
// 数据部分按列拆开,逐列纵向写入,从第二行开始
const body = rows.slice(1);
for (let column = 0; column < rows[0].length; column++) {
writeColumn(body.map((row) => row[column]), 2, column + 1);
}
// 第二批数据到达,用 LastRow 定位起始行后接在已有数据下方
const nextBatch = [
['王五', '英语', 78],
['赵六', '物理', 91],
];
const startRow = sheet.LastRow + 1;
for (let column = 0; column < rows[0].length; column++) {
writeColumn(nextBatch.map((row) => row[column]), startRow, column + 1);
}
// 按内容调整列宽
sheet.AllocatedRange.AutoFitColumns();
// 保存工作簿
const outputFileName = 'ImportDataTable.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>导入二维数据表</h1>
<button onClick={importDataTable}>Start</button>
</div>
);
}
export default App;
运行后,将二维数据表导入工作表的效果:

常见问题
日期怎么写进单元格?
原因:dateTimeArray 不能用来写 JavaScript 的 Date——传进去会得到 0001/1/1。逐个赋值可以用 Range.DateTimeValue,但它只认 Date 对象,传字符串会提示 Value is not a Date。
解决:整列导入时,把日期写成 yyyy-mm-dd 形式的字符串交给 stringArray 最为简便。保存后的单元格是真正的日期值——读回 NumberValue 得到日期序列号(如 46037),不必再设置数字格式:
sheet.InsertArray({
stringArray: ['2026-01-15', '2026-02-20'],
firstRow: 1,
firstColumn: 1,
isVertical: true,
});
若只需精确控制某一格,也可以逐个赋值,注意传 Date 对象而非字符串:
sheet.Range.get('A1').DateTimeValue = new Date(Date.UTC(2026, 0, 15));
数组里的空值会打断写入吗?
原因:不会。null、undefined 与空字符串都只写成空单元格,InsertArray 按数组下标定位每一格,与值本身无关,所以后面的元素不会移位,也不会报错。
解决:无须额外处理,直接传入即可。下面这一行会写入 A1:D1 四格,丁 仍落在第四列:
sheet.InsertArray({
stringArray: ['甲', null, '', '丁'],
firstRow: 1,
firstColumn: 1,
isVertical: false,
});
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







