整理来自业务系统导出或网页粘贴的表格时,数字常常以文本形式存放:单元格左上角带绿色三角标记,求和结果却是 0;反过来,商品编号、联系电话这类只作标识的值又需要按文本保存,避免被表格软件当作数值改写。文本与数字之间的转换因此成为表格整理中的常规操作。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端完成两个方向的转换,输入输出文件通过虚拟文件系统(VFS)管理,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
将文本型数字转换为数字
文本型数字看上去与普通数字相同,但单元格保存的是文本,排序按字符逐位比较,求和、平均值等计算则会直接跳过这些单元格。把选定区域中的文本型数字转换为数字后,单元格恢复为可计算的数值,排序、筛选与公式统计都能得到正确结果。
将文本型数字转换为数字的写法与结果:
| 写法 | 得到的结果 |
|---|---|
sheet.Range.get("B2:C8") |
取得目标两列区域 |
range.ConvertToNumber() |
把区域中的文本型数字转换为数字 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与 Excel 测试文件载入 VFS。 - 用
new Workbook()新建工作簿,再用workbook.LoadFromFile载入测试文件。 - 调用
workbook.Worksheets.get(0)取得第一张工作表。 - 用
sheet.Range.get("B2:C8")取得存放数量与销售额的区域。 - 调用
range.ConvertToNumber(),把区域中的文本型数字转换为数字。 - 用
workbook.SaveToFile写出TextToNumbers.xlsx,再用workbook.Dispose释放资源并从 VFS 读取工作簿触发下载。
以下为完整的代码示例,演示如何把工作表中的文本型数字转换为数字:
function App() {
const convertTextToNumbers = 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 = 'TextNumberData.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);
// 取得存放数量与销售额的区域
const range = sheet.Range.get('B2:C8');
// 把区域中的文本型数字转换为数字
range.ConvertToNumber();
// 将转换后的工作簿保存到 VFS
const outputFileName = 'TextToNumbers.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>在 React 中进行 Excel 文本与数字互转</h1>
<button id="text-to-number" onClick={convertTextToNumbers}>文本转数字</button>
</div>
);
}
export default App;
把文本型数字转换为数字后的 Excel 工作簿:

将数字转换为文本
商品编号、联系电话、邮政编码这类值只用于标识,不参与运算。以数值保存时,超过 15 位的数字会被表格软件舍入,位数较多的编号在列宽不足时还会显示为科学计数法。在写出文件前把这类区域设为文本格式,单元格按文本格式显示与处理,导出后的文件在其他系统中读取时不会再被当作数值改写。
将数字转换为文本的写法与结果:
| 写法 | 得到的结果 |
|---|---|
range.NumberFormat = "@" |
把区域设置为文本格式 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与 Excel 测试文件载入 VFS。 - 用
new Workbook()新建工作簿,再用workbook.LoadFromFile载入测试文件。 - 调用
workbook.Worksheets.get(0)取得第一张工作表。 - 用
sheet.Range.get("D2:E8")取得存放商品编号与联系电话的区域。 - 把
range.NumberFormat设为"@",让区域中的数字以文本格式显示与处理。 - 用
workbook.SaveToFile写出NumbersToText.xlsx,再用workbook.Dispose释放资源并从 VFS 读取工作簿触发下载。
以下为完整的代码示例,演示如何把工作表中的数字保存为文本:
function App() {
const convertNumbersToText = 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 = 'TextNumberData.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);
// 取得存放商品编号与联系电话的区域
const range = sheet.Range.get('D2:E8');
// 把区域设置为文本格式
range.NumberFormat = '@';
// 将转换后的工作簿保存到 VFS
const outputFileName = 'NumbersToText.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>在 React 中进行 Excel 文本与数字互转</h1>
<button id="number-to-text" onClick={convertNumbersToText}>数字转文本</button>
</div>
);
}
export default App;
将数字转换为文本后的 Excel 工作簿:

常见问题
执行 ConvertToNumber 后求和结果仍为 0
原因:传入的区域没有覆盖实际存放文本型数字的列,或单元格中含有空格等无法解析为数字的字符,这些内容不会被转换。
解决:先用 sheet.Range.get("B2:C8") 核对区域地址与数据列是否一致;转换并保存后重新打开文件,确认单元格已由左对齐变为右对齐。含有额外字符的文本需要先清理,再交给 ConvertToNumber()。
把单元格设为文本格式后,数字为什么看起来没有变化
原因:NumberFormat = "@" 设置的是单元格的数字格式,改变的是显示方式与后续输入的处理方式,已保存的数值本身不会被改写,读回时仍是数字。
解决:如果要求单元格的值本身就是文本,可在写入数据时直接按文本赋值,例如 sheet.Range.get("D2").Text = "1001",再按需要为区域设置文本格式。
文本型编号转换后前导零丢失,还能恢复吗
原因:前导零不属于数值的一部分,001001 与 1001 表示同一个数,转为数字后自然不再保留。
解决:商品编号、邮编、电话这类只作标识的值不要执行 ConvertToNumber(),保持文本格式;需要按固定位数显示时,可为区域设置 NumberFormat = "000000" 之类的补零格式。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







