透视表(PivotTable)是 Excel 中用于快速汇总、分析大量数据的核心工具,通过拖拽字段即可实现数据的统计与对比。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成透视表的创建、筛选与更新操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
创建透视表
创建透视表通常包括四个步骤:准备源数据、添加透视表、设置字段布局以及计算数据。下面示例在第一个工作表中写入一份产品销售记录,然后通过 PivotCaches.Add 方法基于数据区域创建缓存,使用 PivotTables.Add 方法在工作表中添加透视表,最后将字段拖拽到行区域和数据区域完成布局。
function App() {
const createPivotTable = 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);
// 向单元格写入源数据
sheet.Range.get('A1').Value = 'Product';
sheet.Range.get('B1').Value = 'Month';
sheet.Range.get('C1').Value = 'Count';
sheet.Range.get('A2').Value = 'SpireDoc';
sheet.Range.get('A3').Value = 'SpireDoc';
sheet.Range.get('A4').Value = 'SpireXls';
sheet.Range.get('A5').Value = 'SpireDoc';
sheet.Range.get('A6').Value = 'SpireXls';
sheet.Range.get('A7').Value = 'SpireXls';
sheet.Range.get('B2').Value = 'January';
sheet.Range.get('B3').Value = 'February';
sheet.Range.get('B4').Value = 'January';
sheet.Range.get('B5').Value = 'January';
sheet.Range.get('B6').Value = 'February';
sheet.Range.get('B7').Value = 'February';
sheet.Range.get('C2').Value = '10';
sheet.Range.get('C3').Value = '15';
sheet.Range.get('C4').Value = '9';
sheet.Range.get('C5').Value = '7';
sheet.Range.get('C6').Value = '8';
sheet.Range.get('C7').Value = '10';
// 基于数据区域创建透视表缓存
const dataRange = sheet.Range.get('A1:C7');
const cache = workbook.PivotCaches.Add({ range: dataRange });
// 添加透视表
const pt = sheet.PivotTables.Add('Pivot Table', sheet.Range.get({ row: 10, column: 5 }), cache);
// 将字段拖入行区域
const pf1 = pt.PivotFields.get_Item('Product');
pf1.Axis = xlsModule.AxisTypes.Row;
const pf2 = pt.PivotFields.get_Item('Month');
pf2.Axis = xlsModule.AxisTypes.Row;
// 将字段拖入数据区域
pt.DataFields.Add(pt.PivotFields.get_Item('Count'), 'Sum of Count', xlsModule.SubtotalTypes.Sum);
// 设置透视表样式
pt.BuiltInStyle = xlsModule.PivotBuiltInStyles.PivotStyleMedium12;
// 计算透视表数据
pt.CalculateData();
sheet.AutoFitColumn(5);
sheet.AutoFitColumn(6);
// 保存工作簿
const outputFileName = 'CreatePivotTable_output.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>Create Pivot Table</h1>
<button onClick={createPivotTable}>Start</button>
</div>
);
}
export default App;
通过 CalculateData 方法计算后,透视表会按产品与月份汇总各产品的数量总和,并以设置的 PivotStyleMedium12 样式显示。

筛选透视表
当透视表包含较多数据时,可以通过在行字段上添加筛选,只保留符合条件的数据行。
function App() {
const filterPivotTable = 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('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'PivotTableExample.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 获取第二个工作表(PivotTable)中的第一个透视表
const pt = workbook.Worksheets.get(1).PivotTables.get(0);
// 获取透视表的第一个行字段
const rowField = pt.RowFields.get(0);
// 为行字段添加数值筛选:第一个数据字段的值小于 5300000
rowField.AddValueFilter(xlsModule.PivotValueFilterType.LessThan, pt.DataFields.get(0), window.spire.Double.Create(5300000), new window.spire.SpireObject(0));
// 重新计算透视表数据
pt.CalculateData();
// 保存工作簿
const outputFileName = 'FilterPivotTable_output.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>Filter Pivot Table</h1>
<button onClick={filterPivotTable}>Start</button>
</div>
);
}
export default App;
原透视表数据
筛选完成后,透视表的行区域只保留满足筛选条件的数据,便于聚焦分析特定范围的数据。

更新数据源并刷新透视表
当透视表的基础数据发生变化时,需要更新数据源并刷新透视表缓存,才能让透视表反映最新的汇总结果。
function App() {
const updateDataSource = 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('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'PivotTableExample.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 获取数据源工作表并修改其中的单元格值
const data = workbook.Worksheets.get('Data');
data.Range.get('A2').Text = 'NewValue';
data.Range.get('D2').NumberValue = 28000;
// 获取透视表所在的工作表
const sheet = workbook.Worksheets.get({ sheetName: 'PivotTable' });
// 获取工作表上的第一个透视表
const pt = sheet.PivotTables.get(0);
// 刷新透视表缓存
pt.Cache.IsRefreshOnLoad = true;
// 计算并更新透视表数据
pt.CalculateData();
// 保存工作簿
const outputFileName = 'UpdateDataSource_output.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>Update Pivot Table Data Source</h1>
<button onClick={updateDataSource}>Start</button>
</div>
);
}
export default App;
数据源更新并刷新后,透视表中对应的汇总结果会同步更新。

常见问题
创建透视表后没有显示汇总数据
原因:透视表添加字段后未调用 CalculateData 方法,或数据字段未正确添加到数据区域。
解决:完成字段布局后调用 pt.CalculateData() 重新计算透视表,并确保通过 DataFields.Add 方法将数值字段添加到数据区域。
添加筛选后透视表数据没有变化
原因:添加标签或数值筛选后未调用 CalculateData 方法重新计算,或筛选添加到了错误的字段上。
解决:调用 pt.CalculateData() 重新计算透视表,并确认使用 pt.RowFields.get(0) 等属性获取正确的字段后再添加筛选。
更新数据源后透视表数据未变化
原因:修改数据源后未刷新透视表缓存,导致透视表仍保留旧的数据。
解决:修改数据源后,将 pt.Cache.IsRefreshOnLoad 设置为 true 并调用 pt.CalculateData(),使透视表基于最新的数据源重新计算。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







