在跨行业的数据处理场景中,把 CSV、PDF 中的数据导入 Excel 是最常见也最容易出错的环节——财务核对银行导出的 CSV 流水,电商整理多平台导出的订单文件,行政处理供应商发来的 PDF 对账单。这些文件的格式五花八门:CSV 分隔符不统一、字段内含有逗号、日期以各种形式出现、手机号、身份证号等以 0 开头的编号被默认当作数字处理而丢失前导零;PDF 表格无法直接编辑,复制到 Excel 后行、列、合并单元格全部错位。
传统做法通常是手工分列、逐列设置格式、靠眼睛寻找错误单元格。一个几百行的 CSV 往往要花上半小时反复调整;PDF 表格更是只能逐行复制粘贴。传统方式还容易出现分列错位、日期串位、数字变文本等隐患,一旦数据量增大,人工处理几乎不可行。
以财务核对银行流水为例,拿到 CSV 后往往要经历:先用文本编辑器确认编码 → 在 Excel 中分列 → 逐列设置日期与金额格式 → 肉眼排查异常值。字段内含逗号会导致整行串位,以 0 开头的账号被吞掉前导零,几经周折才能得到一份可用的表格。PDF 对账单更是只能逐行复制粘贴,行、列、合并单元格几乎全部错位,还原一份往往要耗费小半天。
| 传统 Spire.Office for .NET API | Spire.Agent.Office 处理 | |
|---|---|---|
| 驱动方式 | 编写分列、类型转换、格式判断代码,控制每一步处理 | 用自然语言描述目标,AI 理解后自动编排执行路径 |
| 代码量 | 数据导入场景通常需要 500-1000 行 C# 代码(含解析器、类型转换、错误检测等) | 约 10 行调用代码 + 一条自然语言指令 |
| 分隔符与引号 | 需手写解析逻辑处理引号内逗号、转义字符等边界情况 | AI 自动识别分隔符与引号包裹字段,智能分列 |
| 类型识别 | 需按列硬编码日期/数字/文本的识别规则,规则变动需改代码 | AI 理解数据类型语义,自动识别日期、数字、文本 |
| 错误检测 | 需编写正则和条件判断逐格校验,错误类型覆盖不全 | AI 自动识别类型不匹配、列数不符等异常并标红 |
| 需求变更 | 新增一种 CSV 变体需改代码 → 编译 → 部署 | 修改指令中的描述,即刻生效 |
本文介绍如何使用 Spire.Agent.Office 的 Excel AI 能力,分别实现 CSV 智能分列导入与 PDF 表格导入,自动完成数据类型识别与错误格式标红,仅需一条自然语言指令。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
CSV 是数据交换中最常见的格式,但也是最"不可控"的格式:分隔符可能是逗号、制表符或分号;字段内可能包含被引号包裹的逗号或换行;日期、数字、文本混杂在同一张表中;手机号、编码等以 0 开头的编号会被默认当作数字处理而丢失前导零。导入质量直接决定后续分析与报表的准确性。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令自动导入 CSV,完成智能分列、数据类型识别与错误格式标红:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 待导入的 CSV 源文件(作为附件传入)
string[] attachmentPaths = new string[] { @"C:\DataImport\员工销售数据.csv" };
// 导入结果文档保存路径
string savePath = @"C:\DataImport\ToXLSX.xlsx";
// SpireToken Key(需在官网页面申请)
string key = "sk-TF***************************r";
// 自然语言指令
string instruction = "请按以下步骤处理:\n" +
"1. 将附件CSV文件转为Excel文档并添加合适的格式来提高可读性\n" +
"2. 将文件中的日期/销售额/电话号码格式进行统一\n" +
"3. 用红色背景标记错误和缺失的数据";
// AI 生成
AIResult result = ImportCsvData(instruction, savePath, key, attachmentPaths);
// AI 辅助 CSV 导入
static AIResult ImportCsvData(string instruction, string savePath, string key, string[] attachmentPaths)
{
// 设置 AI 处理选项
AIOptions options = new AIOptions();
options.SpireToken = key;
using (Workbook wb = new Workbook())
{
AIDocumentProcessor processor = wb.AI(options);
return processor.ExecuteInstruction(wb, instruction, savePath, attachmentPaths);
}
}
原始 CSV 数据和智能分列导入结果

PDF 是分发和归档的通用格式,但其中的表格数据无法直接编辑:复制到 Excel 后行列错位、合并单元格丢失、数字与日期被当成文本。当供应商、银行或政府机构以 PDF 交付报表时,将 PDF 中的表格数据准确还原为可编辑的 Excel 数据,是从固定版式文档走向电子化处理的必经一步。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令将 PDF 中的表格数据自动提取并写入 Excel:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 待导入的 PDF 源文件(作为附件传入)
string[] attachmentPaths = new string[] { @"C:\DataImport\采购订单.pdf" };
// 导入结果文档保存路径
string savePath = @"C:\DataImport\采购订单数据.xlsx";
// SpireToken Key
string key = "sk-TF***************************r";
// 自然语言指令
string instruction =
"请按以下步骤处理:\n" +
"1. 将附件PDF文件转为Excel文档并添加合适的格式来提高可读性\n" +
"2. 将文件中的日期/销售额/电话号码格式进行统一\n" +
"3. 用红色背景标记错误和缺失的数据";
// AI 生成
AIResult result = ImportPdfData(instruction, savePath, key, attachmentPaths);
// AI 辅助 PDF 导入
static AIResult ImportPdfData(string instruction, string savePath, string key, string[] attachmentPaths)
{
// 设置 AI 处理选项
AIOptions options = new AIOptions();
options.SpireToken = key;
using (Workbook wb = new Workbook())
{
AIDocumentProcessor processor = wb.AI(options);
return processor.ExecuteInstruction(wb, instruction, savePath, attachmentPaths);
}
}
原始 PDF 数据和提取到 Excel 的表格数据

原因:CSV 分隔符可能是分号、制表符,或字段内包含被引号包裹的逗号、换行,自动分列时整行串位。
解决:在指令中说明分隔符,或让 AI 自动识别并正确处理引号包裹的字段。
原因:手机号、身份证号、账号等以 0 开头的值被当作数值类型导入,前导零被吞掉。
解决:在指令中指定"手机号、证件号等列为文本,保留前导零"。
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;
在财务与税务场景中,发票信息录入是最常见也最耗时的工作之一。每张发票上的发票号、日期、金额、税额、购买方,都需要人工逐张核对后录入 Excel 或财务系统;到了月中对账、月末报税或报销高峰期,积压的发票往往数以百计,录入手速就成了瓶颈。传统做法是逐页打开发票 PDF、找到对应字段、复制粘贴——不仅效率低下,而且极易发生漏项、错位、金额抄错等问题,任何一处偏差都会直接影响对账与报税准确性。发票版式又各不相同,字段位置五花八门,进一步加大了手工整理的出错风险。因此,把"逐张读发票、抄字段"这件重复劳动交给程序自动完成,是财务团队最迫切想解决的痛点之一。
同样是"从 PDF 发票提取字段并导出 Excel",传统 SDK 与 Spire.Agent.Office 走的是两条完全不同的路。传统方式要求你先把每张发票的字段位置、页面结构摸清,再为每个字段编写定位与提取代码,换一种版式就得改代码;而智能体方式只需要你用自然语言把"要提取什么、导出成什么"说清楚,剩下的事情由 AI 理解并编排完成:
| 传统 Spire.Office for .NET API | Spire.Agent.Office 处理 | |
|---|---|---|
| 驱动方式 | 编写循环 + 条件判断 + 异常处理代码,控制文档处理的每一步 | 用自然语言描述目标,AI 理解后自动编排执行路径 |
| 代码量 | 逐页解析通常需要 300-600 行 C# 代码(含页面遍历、字段定位、数据导出等) | 约 10 行调用代码 + 1 条自然语言指令 |
| 字段识别 | 需硬编码每个字段的页面位置与格式,版式变化需改代码 | AI 自动理解发票版式并定位发票号、日期、金额等字段 |
| 页面处理 | 需手动遍历每一页并逐个提取 | AI 自动逐页提取并汇总 |
| 数据导出 | 需手动编写 Excel 写入逻辑与列布局 | AI 自动生成结构化 Excel,字段对齐 |
| 需求变更 | 改动提取字段 → 改代码 → 编译 → 重新部署 | 修改指令,即刻生效 |
从对比可以看出,当发票版式、提取字段或导出结构频繁变化时,智能体只需改一句话,传统方案却要改代码、重新编译部署。
本文介绍如何使用 Spire.Agent.Office PDF AI 能力,自动提取 PDF 发票中每页的发票号、日期、金额、税额、购买方信息,并导出为 Excel,让财务票据数字化一步到位。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
发票信息自动提取的核心思路是:把多份发票 PDF 作为附件交给 AI 智能体,智能体读取各张发票后逐页理解版式,识别发票号码、开票日期、金额、税号、税额、购买方名称、抬头等字段,并汇总导出为结构化 Excel。整个处理大致分成三步——首先智能体读取各张发票 PDF 并定位每一页的发票字段,其次把各页识别出的字段按语义对齐(例如把"发票号码""Invoice No.""請求書番号"都归一到同一列),最后将结果汇总写入 Excel,并按要求自动美化(调整列宽、添加边框、数值保留两位小数并右对齐)。整个"逐页解析 → 字段识别 → 汇总美化"过程由 AI 按自然语言指令自动完成,无需为每张发票单独编写解析逻辑,也无需关心不同供应商发票版式之间的差异。
对于几十上百页的发票 PDF,传统做法需要为每一种版式编写一套定位规则,而智能体方式下,无论发票来源与版式如何变化,你始终只维护一条自然语言指令。字段口径(如金额取含税还是不含税)、列顺序、是否标注异常等需求,也都可以直接写进指令,随改随生效。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令自动提取 PDF 中每页发票信息并导出为 Excel:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Pdf;
// PDF 处理相关配置
string key = "**************************"; // 需要在官网页面申请 SpireToken Key
string inputDir = @"E:\invoices"; // 发票PDF目录,可放多个PDF
string[] pdfFiles = Directory.GetFiles(inputDir, "*.pdf", SearchOption.TopDirectoryOnly);
string savePath = @"E:\output\合并.xlsx"; // 结果文档路径(null 时自动生成到输出目录)
string instruction =
"读取附件文件并识别每张发票的信息,提取发票号码、开票日期、金额、税号、税额、购买方名称、抬头\n" +
"每张发票作为一行,汇总到同一个Excel表格中。\n" +
"导出为Excel时请对表格进行适当美化\n" +
"根据各列内容自动调整列宽,确保文字完整显示;为整个数据区域添加边框,使行列清晰易读;\n" +
"金额、税额等数值列保留两位小数并右对齐。最终保存为格式规范、便于阅读的Excel文件。";
// 调用PDF文档处理函数(附件为各张发票PDF)
AIResult result = ExecuteDemoPDF(instruction, savePath, key, pdfFiles);
// 执行PDF文档AI处理
static AIResult ExecuteDemoPDF(string instruction, string savePath, string key, string[] attachments)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
options.SpireToken = key; // 设置SpireToken Key
// 使用PdfDocument对象处理PDF文档
using (PdfDocument pdf = new PdfDocument())
{
// 创建AI文档处理器,附件即各张发票PDF
AIDocumentProcessor processor = pdf.AI(options);
return processor.ExecuteInstruction(pdf, instruction, savePath, attachments);
}
}
原发票PDF
提取并导出的Excel

原因:发票金额存在大小写两种写法,或含税/不含税口径不一致。
解决:在指令中明确提取口径(如"提取价税合计金额""提取不含税金额"),AI 智能体会按指定口径提取。若发票存在大小写两种金额,建议同时说明以哪一种为准,避免歧义。
原因:不同供应商的发票版式、字段位置各不相同。
解决:AI 智能体可自动理解发票版式并定位字段;如遇特殊版式,可在指令中补充字段说明(例如"发票号码位于右上角"),帮助智能体更准确地定位。
原因:AI 默认按识别顺序输出字段。
解决:在指令中明确字段名与顺序(如"按 发票号、日期、金额、税额、购买方 的顺序导出"),智能体会按你的要求排列输出列。
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;
在教育与教务场景中,每次考试后的成绩处理是最频繁也最耗时的工作。同一次考试成绩,往往需要从两个维度进行处理:面向班级学生与班主任,需要呈现本班的成绩明细、排名与学科强弱;面向教师与教务处,则需要进行全年级横向对比,判断哪些班级、哪些学科需要重点关注。
传统做法通常需要人工在 Excel 中编写公式、手动排序、逐项绘图,再撰写分析总结。面向不同对象还要重复整理两套数据,整套流程往往耗费半天到一天时间,且公式易错、图表样式不统一、分析口径难以保持一致。
| 传统 Spire.Office for .NET API | Spire.Agent.Office 处理 | |
|---|---|---|
| 驱动方式 | 编写 Excel 公式 + 拆分文件 + 排序 + 图表 + 条件格式代码,控制每一步处理 | 用自然语言描述目标,AI 理解后自动编排执行路径 |
| 代码量 | 成绩分析场景通常需要 500-1000 行 C# 代码(含按班拆分文件、公式计算、排名逻辑、图表配置等) | 约 10 行调用代码 + 一条自然语言指令 |
| 统计口径 | 需硬编码平均分/及格率/优秀率的计算公式和判定逻辑,口径调整需改代码 | AI 理解教育统计语义,自动按"≥60 及格、≥90 优秀"等口径计算 |
| 图表生成 | 需手动创建 Chart 对象、配置数据区域、设定图表类型和样式 | AI 根据数据语义自动选择雷达图、柱状图等最合适的图表类型 |
| 需求变更 | 新增统计维度需改代码 → 编译 → 部署 | 修改指令中的描述,即刻生效 |
本文介绍如何使用 Spire.Agent.Office 的 Excel AI 能力,分别面向班级学生与教师/教务处两类对象,实现成绩统计、排名与可视化分析的自动化,仅需几条自然语言指令即可完成。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
面向班级学生与班主任的成绩分析,重点在于本班:成绩明细、班级内排名、学科强弱。不同班级之间无需横向比较,因此每个班级单独生成一个 Excel 文件,可直接打印张贴、发送至班级群或用于家长会展示。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令自动按班级拆分数据,为每个班级生成独立的成绩分析 Excel 文件:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 原始成绩表(含班级、姓名、各科成绩列)
string inputPath = @"C:\ScoreAnalysis\学生成绩.xlsx";
// 结果文档路径(null 时使用输出文件夹路径)
string savePath = null;
// 输出目录(每个班级一个文件)
string OutDir = @"C:\ScoreAnalysis\ClassAnalysis";
// SpireToken Key
string key = "sk-TF***************************r";
// 自然语言指令
string instruction =
"请对输入文件进行以下处理:\r\n" +
"1. 读取文件,每个班级独立生成一个 Excel 成绩分析文件,文件名为'XX班成绩分析.xlsx'\r\n" +
"2. 每个班级文件包含:该班成绩明细、按总分的班级内排名、各科平均分/最高分/最低分/及格率(≥60 分)/优秀率(≥90 分)、分数段分布\r\n" +
"3. 选择合适的图表类型为班级成绩进行可视化展示\r\n" +
"4. 表格样式美观统一,总分排名前 10 名标绿、不及格科目标红";
// AI 生成
AIResult result = AnalyzeClassScores(instruction, inputPath, savePath, key, OutDir);
// AI 辅助成绩分析
static AIResult AnalyzeClassScores(string instruction, string inputpath, string savePath, string key, string output)
{
// 设置 AI 处理选项
AIOptions options = new AIOptions();
options.SpireToken = key;
options.WorkDir = output;
using (Workbook wb = new Workbook())
{
if (!string.IsNullOrEmpty(inputpath) && File.Exists(inputpath))
wb.LoadFromFile(inputpath);
AIDocumentProcessor processor = wb.AI(options);
return processor.ExecuteInstruction(wb, instruction, savePath);
}
}
原成绩数据和按班级生成的成绩分析文件

面向教师与教务处的成绩分析,重点在于整体:班级之间的差距、哪些学科整体薄弱、全年级排名分布。所有班级的数据需汇总到同一个工作表上,才能横向对比、统一口径、辅助决策。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令将全年级所有班级的数据汇总到同一个工作表,完成班级对比与可视化分析:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 原始成绩表(含班级、姓名、各科成绩列)
string inputPath = @"C:\ScoreAnalysis\学生成绩.xlsx";
// 全年级成绩分析文件保存路径
string savePath = @"C:\ScoreAnalysis\年级成绩分析.xlsx";
// SpireToken Key
string key = "sk-TF***************************r";
// 自然语言指令
string instruction =
"请对输入文件进行以下处理:\r\n" +
"1. 读取文件,按班级分别计算各科目的平均分、及格率(≥60 分)、优秀率(≥90 分),并生成汇总所有班级指标的'班级对比'工作表\r\n" +
"2. 根据总分生成全年级排名\r\n" +
"3. 为各科平均分生成雷达图:每个班级各生成一张雷达图展示本班学科强弱,并额外生成一张叠加所有班级的对比雷达图(每个班级作为一个系列),以便班级间直接对比\r\n" +
"4. 根据统计数据,分析全年级整体表现,指出各班级的优势与薄弱学科,并提出针对性提升建议";
// AI 生成
AIResult result = AnalyzeGradeScores(instruction, inputPath, savePath, key);
// AI 辅助成绩分析
static AIResult AnalyzeGradeScores(string instruction, string inputpath, string savePath, string key)
{
// 设置 AI 处理选项
AIOptions options = new AIOptions();
options.SpireToken = key;
using (Workbook wb = new Workbook())
{
if (!string.IsNullOrEmpty(inputpath) && File.Exists(inputpath))
wb.LoadFromFile(inputpath);
AIDocumentProcessor processor = wb.AI(options);
return processor.ExecuteInstruction(wb, instruction, savePath);
}
}
原成绩数据和全年级成绩分析结果

| 班级成绩统计与展示 | 全年级成绩汇总与分析 | |
|---|---|---|
| 面向对象 | 班级学生、班主任 | 教师、教务处 |
| 输出形态 | 每个班级一个独立 Excel 文件 | 所有班级汇总到一个 Excel 文件 |
| 核心内容 | 本班成绩明细、班级内排名、各科统计、学科强弱可视化图表 | 班级横向对比、全年级排名、雷达图、成绩分析结论 |
| 典型用途 | 打印张贴、家长会展示 | 教研汇报、教学决策、教务统计 |
原因:AI 选择的图表类型可能与用户的表达习惯不一致。
解决:在指令中明确指定图表类型偏好,如"班级优势学科使用雷达图,分数段分布使用柱状图,历次考试成绩趋势使用折线图"。
原因:多名学生总分相同属于正常情况,AI 默认的并列名次处理方式可能不符合要求。
解决:在指令中明确并列规则,如"总分相同时按语文成绩优先排序"。
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;
在日常办公中,经常需要在 Excel 电子表格和 OpenDocument 电子表格(ODS)之间进行数据交换。ODS 是一种开放标准的电子表格格式,广泛用于 LibreOffice、OpenOffice 等开源办公软件。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成 Excel 与 ODS 格式的双向转换,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。它提供了简单易用的 API,让格式转换更加便捷。
通过 Spire.XLS for JavaScript,您可以将 Excel 工作簿保存为 ODS 格式,从而与开源办公软件无缝协作,也可以将 ODS 文件导入并创建为格式完整的 Excel 工作簿。这使得数据在不同应用程序之间的迁移变得更加便捷高效。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
将 Excel 数据导出为 ODS 格式,便于在 LibreOffice、OpenOffice 等开源办公软件中直接打开和编辑。通过 Spire.XLS for JavaScript,您可以将整个工作簿保存为 ODS 文件,在保留表格结构、样式和数据的同时,实现跨平台的数据共享。具体操作步骤如下:
Workbook 对象并加载已有的 Excel 文件。SaveToFile() 方法,指定输出文件名和 FileFormat.ODS 文件格式。下面是一个完整的代码示例,展示了在 React 中将 Excel 转换为 ODS:
function App() {
const convertToODS = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 将示例 Excel 文件加载到 VFS
await window.spire.FetchFileToVFS('Sample.xlsx', '', `${process.env.PUBLIC_URL}data/`);
// 创建工作簿对象并加载 Excel 文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: 'Sample.xlsx' });
// 将工作簿保存为 ODS 文件
const outputFileName = 'ExcelToODS.ods';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.ODS });
workbook.Dispose();
// 从 VFS 读取文件并触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.oasis.opendocument.spreadsheet' });
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 转换为 ODS</h1>
<button onClick={convertToODS}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 将 Excel 转换为 ODS 文件

将 ODS 文件导入为 Excel 电子表格,可以充分利用 Excel 强大的格式化、计算和图表功能。Spire.XLS for JavaScript 支持通过 LoadFromFile() 方法直接加载 ODS 文件,并自动识别其文件格式,随后即可将工作簿保存为 Excel 格式。具体操作步骤如下:
Workbook 对象,调用 LoadFromFile() 方法加载 ODS 文件。下面是一个完整的代码示例,展示了在 React 中将 ODS 转换为 Excel:
function App() {
const convertToExcel = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 将 ODS 示例文件加载到 VFS
await window.spire.FetchFileToVFS('Sample.ods', '', `${process.env.PUBLIC_URL}data/`);
// 创建工作簿对象并加载 ODS 文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: 'Sample.ods' });
// 保存工作簿并释放资源
const outputFileName = 'ODSToExcel.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>将 ODS 转换为 Excel</h1>
<button onClick={convertToExcel}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 将 ODS 转换为 Excel 文件

原因:使用 SaveToFile() 方法保存工作簿时,若未通过 fileFormat 参数指定正确的输出文件格式,生成的文件格式可能与扩展名不匹配,导致无法正常打开。
解决方案:保存为 ODS 时指定具体的文件格式枚举值 xlsModule.FileFormat.ODS:
const outputFileName = 'ExcelToODS.ods';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.ODS });
原因:创建 Blob 时 MIME 类型设置不当,导致浏览器无法识别下载文件为 ODS 文档,可能以其他类型打开或显示乱码。
解决方案:下载时指定正确的 MIME 类型,并确保下载文件名以 .ods 结尾:
const blob = new Blob([fileArray], { type: 'application/vnd.oasis.opendocument.spreadsheet' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'ExcelToODS.ods';
a.click();
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
对账是企业财务中最频繁也最繁琐的工作之一。而这源数据往往各不相同,银行流水从网银导出的 CSV 文件,系统交易记录则可能是 PDF 格式的明细报表。两份表的列名不同、日期和金额格式不一,甚至夹杂空格、缺失值。本文介绍如何使用 Spire.Agent.Office Excel AI 能力自动读取 CSV 与 PDF 两种格式的数据源,识别并映射列名,清理数据最终生成Excel 对账明细。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
csv 格式的银行流水与PDF 格式的系统交易记录按流水号进行对账分析。
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 银行流水(CSV)与系统交易记录(PDF)数据源文件
string[] attachmentPaths = new string[]
{
@"bank-statement.csv",
@"system-records.pdf"
};
// Excel 处理相关配置
string inputPath = "";
string savePath = "out.xlsx";
// SpireToken Key
string key = "**************************";
string instruction =
"对附件中的银行流水(CSV)与系统交易记录(PDF)执行对账:" +
"1.按语义建立两表列映射:交易日期、金额、对方账户、摘要、流水号;" +
"2.清洗:文本去首尾及内部多余空格;日期统一写成yyyy-MM-dd文本;金额去货币符号和千分位转为数字;空摘要或空对方账户标'未知',空金额标'金额缺失';" +
"3.以流水号为唯一键逐笔匹配,标记状态:'已匹配'/'金额不一致'/'仅银行流水'/'仅系统记录';" +
"4.生成'对账明细'工作表:每笔含银行金额、系统金额、差额、对账状态、备注;" +
"5.差异行高亮:金额不一致黄色、仅银行流水橙色、仅系统记录蓝色;" +
"最终保存为Excel文件";
// 调用Excel文档处理函数
AIResult result = ExecuteDemoExcel(instruction, inputPath, savePath, key, attachmentPaths);
// 执行Excel文档AI处理
static AIResult ExecuteDemoExcel(string instruction, string inputPath, string savePath, string key, string[] attachmentPaths)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
options.SpireToken = key;
// 使用Workbook对象处理Excel文档
using (Workbook workbook = new Workbook())
{
// 从文件加载Excel模板
if (!string.IsNullOrEmpty(inputPath) && File.Exists(inputPath))
{
workbook.LoadFromFile(inputPath);
}
// 创建AI文档处理器
AIWorkbookProcessor processor = workbook.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(workbook, instruction, savePath, attachmentPaths);
}
}
原银行流水CSV
原系统交易PDF
Excel AI对账后的对账明细

当数据源不含唯一流水号,可以改用"交易日期 + 金额"的组合作为匹配键进行对账:先按日期分组,再在相同日期内用金额逐笔配对。
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Xls;
// 不含流水号的银行流水(CSV)与系统交易记录(PDF)数据源文件
string[] attachmentPaths = new string[]
{
@"bank-statement-noId.csv",
@"system-records-noId.pdf"
};
// Excel 处理相关配置
string inputPath = "";
string savePath = "out.xlsx";
// SpireToken Key
string key = "**************************";
string instruction =
"对附件中的银行流水(CSV)与系统交易记录(PDF)执行对账:" +
"1.按语义建立两表列映射:交易日期、金额、对方账户、摘要;" +
"2.清洗:文本去多余空格;日期统一写成yyyy-MM-dd文本;金额转为数字;缺失值标'未知'或'金额缺失';" +
"3.以'交易日期+金额'组合为键对账:先按日期分组,再在相同日期内按金额逐笔配对,标记状态:'已匹配'/'金额不一致'/'仅银行流水'/'仅系统记录';" +
"4.生成'对账明细'工作表(银行金额、系统金额、差额、状态);" +
"5.差异行高亮:金额不一致黄色、仅银行流水橙色、仅系统记录蓝色;" +
"最终保存为Excel文件";
// 调用Excel文档处理函数
AIResult result = ExecuteDemoExcel(instruction, inputPath, savePath, key, attachmentPaths);
// 执行Excel文档AI处理
static AIResult ExecuteDemoExcel(string instruction, string inputPath, string savePath, string key, string[] attachmentPaths)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
options.SpireToken = key;
// 使用Workbook对象处理Excel文档
using (Workbook workbook = new Workbook())
{
// 从文件加载Excel模板
if (!string.IsNullOrEmpty(inputPath) && File.Exists(inputPath))
{
workbook.LoadFromFile(inputPath);
}
// 创建AI文档处理器
AIWorkbookProcessor processor = workbook.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(workbook, instruction, savePath, attachmentPaths);
}
}
原银行流水CSV
原系统交易PDF
Excel AI对账后的对账明细

| 传统 Spire.Office for .NET API | Spire.Agent.Office 处理 | |
|---|---|---|
| 驱动方式 | 需编写 CSV/PDF 解析、列映射、数据清洗、匹配与异常逻辑等大量代码 | 用自然语言描述对账规则,AI 理解后自动编排执行 |
| 数据格式 | CSV 与 PDF 需分别用不同组件解析、格式各异 | 直接附加 CSV 与 PDF,AI 自动理解内容 |
| 字段映射 | 硬编码列名对应关系,列名或格式变更需改代码 | AI 根据列名与内容语义自动映射 |
| 异常处理 | 需手写差异判定、告警文案与样式逻辑 | AI 自动识别差异并给出处理建议 |
原因:网银导出的 CSV 中,日期可能有 2026-07-01、2026/7/1 等写法,金额可能带 ¥、千分位或前后空格,导致匹配时误判。
解决:在指令中显式要求"将日期统一为 yyyy-MM-dd、金额统一为数字格式并去除空格",AI 会在对账前自动完成标准化。
原因:PDF 明细报表可能存在分页、重复页眉或页脚注释,影响 AI 对表格数据的读取。
解决:在指令中添加"忽略页眉页脚与重复的表头行,只读取表格数据行"的描述。
原因:按"日期+金额"组合对账时,同一天可能存在多笔金额相同的交易,无法确定具体对应关系。
解决:优先使用流水号精确对账;若确实无流水号,可在指令中要求"将同日无法一一对应的记录标记为'金额不一致'"。
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;
Spire.PDF for Java 12.8.6 现已正式发布。该版本主要增强了 PDF 到 Word 的转换效果。详情请查阅以下内容。
问题修复:
在企业法务和合规管理场景中,合同审查是最耗时也最容易遗漏疏漏的工作之一。每一份合同都涉及大量的权利与义务条款——违约金、付款条件、免责条款、违约责任、争议解决等,任何一个对己方不利或表述含糊的条款,都可能在未来引发法律纠纷或造成经济损失。传统方式依赖法务人员逐条阅读、手工标注,一份几十页的合同往往需要数小时,且不同人员的审查标准也不统一。
| 传统 Spire.Office for .NET API | Spire.Agent.Office | |
|---|---|---|
| 驱动方式 | 编写代码逐条解析条款:加载文档→遍历段落→正则匹配关键词→判断风险→高亮批注,每步需代码控制 | 自然语言描述审查目标,AI 自动识别并标注风险条款 |
| 代码量 | 需大量代码维护条款风险规则库、关键词匹配和批注逻辑 | 仅需配置代码 + 1 条自然语言指令 |
| 风险规则 | 风险判断依赖硬编码关键词,新风险类型需改代码 | AI 基于语义理解条款,可识别规则未覆盖的新型风险 |
| 审查立场 | 每类合同的审查逻辑需单独开发 | 指令中一句"站在我方角度"即可切换审查立场 |
| 维护性 | 风险规则库需持续人工维护 | 审查范围和规则可用自然语言随时调整 |
本文介绍如何使用 Spire.Agent.Office Word AI 能力对合同进行条款审查与风险标注。您可以自由选择在原合同上高亮标注并添加批注,也可以批量审查后输出结构化风险审查报告,满足不同规模、不同场景的合同审查需求。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
风险条款高亮标注适合对重要合同进行深度审查。其核心思路是:让 AI 逐条审查合同条款,识别对己方不利或存在法律风险的条款,在原位置高亮标黄并添加批注,法务人员直接在合同上查看风险点即可。
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Doc;
// 待审查合同文件路径
string inputPath = "E:\\输入\\软件系统采购及技术服务合同.docx";
// 保存路径
string savePath = "E:\\输出\\审查.docx";
// 输出目录
string OutDir = "E:\\输出";
// SpireToken Key
string key = "xxxxx";
// 自然语言指令
string instruction =
"审查当前合同文档中的所有条款,识别其中对采购方不利或存在法律风险的条款,包括但不限于:" +
"违约金金额过高、付款条件严苛、免责条款范围过大、缺少违约责任约定、管辖法院约定不利、知识产权归属不清等。" +
"对每处风险条款执行以下操作:1. 将风险条款文本高亮标黄;2. 在原位置添加批注,注明风险点、风险等级(高/中/低)和修改建议。" +
"处理完成后保证同原文档布局样式,字体等,最终保存输出DOCX格式";
// 调用Word文档处理函数
AIResult result = ExecuteDemoWord(instruction, inputPath, savePath, key, OutDir, null);
// 执行Word文档AI处理
static AIResult ExecuteDemoWord(string instruction, string inputPath, string savePath, string key, string output, string[] attachmentPaths)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
// 设置工作目录为输出目录
options.WorkDir = output;
// 设置SpireToken Key
options.SpireToken = key;
// 使用Document对象处理Word文档
using (Document doc = new Document())
{
// 从文件加载合同文档
if (!string.IsNullOrEmpty(inputPath) && File.Exists(inputPath))
{
doc.LoadFromFile(inputPath);
}
// 创建AI文档处理器
AIDocumentProcessor processor = doc.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(doc, instruction, savePath, attachmentPaths);
}
}
AI 高亮标注并添加批注后的合同

审查后的合同中,风险条款被高亮标黄,批注中清楚写明风险点和修改建议,法务人员无需逐条阅读原文,直接定位到高亮位置即可快速复核,并可直接基于批注内容与业务方沟通修改方案。
对于大批量合同的快速筛查(如合同续签、供应商资质审查),更适合批量审查并输出结构化审查报告。其核心思路是:让 AI 逐份审查多份合同,将每份合同的风险条款汇总为一张风险清单,输出为 MD 报告,便于统计、跟踪和分级处理。
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Doc;
// 多个待审查合同文件路径
string[] attachments = new string[] {
"E:\\输入\\采购合同.docx", // 采购合同
"E:\\输入\\销售合同.docx", // 销售合同
"E:\\输入\\劳动合同.docx" // 劳动合同
};
// 保存路径(此处为null,将使用下面设置的输出文件夹路径)
string savePath = "E:\\输出\\结构性审查输出.md";
// 输出目录
string OutDir = "E:\\输出";
// SpireToken Key
string key = "xxxxx";
// 自然语言指令
string instruction =
"逐份审查附件中的合同文档,提取风险条款,输出为 Markdown 审查报告:" +
"报告包含一张表,列固定为:合同名称 | 条款序号 | 条款原文 | 风险等级(高/中/低) | 风险类型 | 风险说明 | 修改建议。" +
"按风险等级从高到低排列,条款原文取合同原句,超 20 字截断加…,不得臆造。";
// 调用Word文档处理函数
AIResult result = ExecuteDemoWord(instruction, savePath, key, OutDir, attachments);
// 执行Word文档AI处理
static AIResult ExecuteDemoWord(string instruction, string savePath, string key, string output, string[] attachments)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
// 设置工作目录为输出目录
options.WorkDir = output;
// 设置SpireToken Key
options.SpireToken = key;
// 使用Document对象处理Word文档
using (Document doc = new Document())
{
// 创建AI文档处理器
AIDocumentProcessor processor = doc.AI(options);
// 执行AI指令
return processor.ExecuteInstruction(doc, instruction, savePath, attachments);
}
}
AI 输出的合同风险审查报告

审查报告中每行对应一条风险条款,包含条款原文、风险等级、风险类型和修改建议,法务人员可按风险等级排序优先处理高风险条款,也可将报告导出用于合同管理系统的风险台账跟踪。
原因:AI 对"不利条款"的判断依赖审查立场,同一条款站在己方和对方角度,风险判断可能完全相反。
解决:在指令中明确审查立场,如"站在采购方角度审查",并补充关注的风险类型清单,AI 将严格按此立场和范围执行。
原因:AI模型处理时,自动修改或添加了内容。
解决:在指令中添加"保证同原文档布局样式,字体等"的描述。
原因:条款序号不统一,或同一条款内容分散在合同多处,导致报告中的条款原文与合同对不上。
解决:在指令中要求 AI 引用条款原文,并注明条款序号来源,便于人工核对定位。
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;
Spire.PDF 12.8.3 现已发布。该版本修复了多个问题,包括 PDF 转图片时程序抛出异常,以及提取 PDF 文本时字符重叠的问题。详情如下。
问题修复:
在 Web 应用中,将 Excel 文件以流(Stream)的形式进行操作,开发者可以动态地创建、加载、修改和保存 Excel 文件,从而实现灵活高效的数据处理。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成 Excel 文件的流式读写,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。它提供了简单易用的 Stream API,让通过流创建和保存 Excel 文件变得更加便捷。
通过流操作,可以在很大程度上减少直接的磁盘 I/O 操作,不仅提升应用的性能,还增强了响应能力,尤其适用于实时数据处理或存储受限的场景。借助 Spire.XLS for JavaScript,您可以在浏览器中动态创建 Excel 文件并保存到流,从流中加载并读取工作簿数据,或在流中修改内容后保存为新的 Excel 文件,从而简化数据交换和系统集成。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
利用 Spire.XLS for JavaScript,您可以在浏览器中动态创建 Excel 文件,填充数据并设置格式后,通过 SaveToStream() 方法将工作簿保存到文件流。这种方法可以省去直接对磁盘进行文件存储的需求,同时提升应用的性能和响应速度。具体操作步骤如下:
Workbook 实例以生成新的 Excel 工作簿,清除默认工作表并添加新工作表。Worksheets.get() 方法访问特定的工作表。Range.get_Item() 方法获取单元格并逐一设置值。Stream 对象,使用 SaveToStream() 方法将工作簿保存到文件流。保存后的流可直接用于进一步处理,例如下载为文件或通过网络进行传输。下面是一个完整的代码示例,展示了在 React 中动态创建 Excel 文件并保存到流:
function App() {
const createAndSaveToStream = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 创建新的工作簿实例
const workbook = new xlsModule.Workbook();
// 清除默认工作表并添加新工作表
workbook.Worksheets.Clear();
const sheet = workbook.Worksheets.Add('Data');
// 定义要写入工作表的示例数据(二维数组)
const headers = ['编号', '姓名', '年龄', '国家', '工资 (¥)'];
const data = [
[1, '张伟', 29, '中国', 8000],
[2, '李娜', 35, '中国', 12000],
[3, '王强', 42, '中国', 15000],
[4, '杰克', 26, '美国', 9500],
[5, '陈思', 31, '中国', 11000],
[6, '石原安子', 28, '日本', 8800]
];
// 将表头写入第一行
for (let col = 0; col < headers.length; col++) {
sheet.Range.get_Item({ row: 1, column: col + 1 }).Text = headers[col];
}
// 将数据写入后续行
for (let row = 0; row < data.length; row++) {
for (let col = 0; col < data[row].length; col++) {
sheet.Range.get_Item({ row: row + 2, column: col + 1 }).Text = String(data[row][col]);
}
}
// 格式化表头行
sheet.Range.get('A1:E1').Style.Color = xlsModule.Color.get_LightSkyBlue();
sheet.Range.get('A1:E1').Style.Font.FontName = 'Arial';
sheet.Range.get('A1:E1').Style.Font.Size = 12;
sheet.Range.get('A1:E1').Style.Font.IsBold = true;
// 格式化数据行
for (let i = 2; i <= data.length + 1; i++) {
const dataRange = sheet.Range.get({
row: i, column: 1,
lastRow: i, lastColumn: headers.length
});
dataRange.Style.Color = xlsModule.Color.get_LightGray();
dataRange.Style.Font.FontName = 'Arial';
dataRange.Style.Font.Size = 11;
}
// 为表头和所有数据单元格添加边框
const usedRange = sheet.Range.get({
row: 1, column: 1,
lastRow: data.length + 1,
lastColumn: headers.length
});
usedRange.Borders.LineStyle = xlsModule.LineStyleType.Thin;
usedRange.Borders.Color = xlsModule.Color.get_LightSteelBlue();
// 调整列宽以适应内容
for (let col = 1; col <= headers.length; col++) {
sheet.AutoFitColumn(col);
}
// 创建流并将工作簿保存到流
const outputFileName = 'CreateExcelToStream.xlsx';
const fileStream = new xlsModule.Stream(outputFileName);
workbook.SaveToStream(fileStream, xlsModule.FileFormat.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={createAndSaveToStream}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 动态创建 Excel 文件并保存到流

通过 Spire.XLS for JavaScript,您可以使用 LoadFromStream() 方法直接从流中加载 Excel 文件。加载完成后,可以轻松读取流中 Excel 文件的单元格数据,实现快速灵活的数据处理,而无需进行文件 I/O 操作。具体操作步骤如下:
Stream 对象。Workbook 对象,调用 LoadFromStream() 方法从流中加载文件。Worksheets.get() 方法获取第一个工作表。Range.get() 方法提取单元格数据。下面是一个完整的代码示例,展示了在 React 中从流中加载并读取 Excel 文件:
import React, { useState } from 'react';
function App() {
const [extractedData, setExtractedData] = useState('');
const loadAndReadFromStream = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 将示例 Excel 文件加载到 VFS
await window.spire.FetchFileToVFS('Sample.xlsx', '', `${process.env.PUBLIC_URL}data/`);
// 创建工作簿对象并从流中加载 Excel 文件
const workbook = new xlsModule.Workbook();
const fileStream = new xlsModule.Stream('Sample.xlsx');
workbook.LoadFromStream(fileStream, xlsModule.FileFormat.Auto);
// 获取工作簿中的第一个工作表
const sheet = workbook.Worksheets.get(0);
// 遍历工作表的行和列,提取单元格数据
const data = [];
for (let row = sheet.FirstRow; row <= sheet.LastRow; row++) {
const line = [];
for (let col = sheet.FirstColumn; col <= sheet.LastColumn; col++) {
line.push(sheet.Range.get({ row: row, column: col }).Text);
}
data.push(line.join(' | '));
}
// 释放工作簿对象以释放资源
workbook.Dispose();
// 在页面上显示提取的数据
setExtractedData(data.join('\n'));
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>从流中加载并读取 Excel 数据</h1>
<button onClick={loadAndReadFromStream}>
读取
</button>
<pre style={{ marginTop: '20px', textAlign: 'left' }}>{extractedData}</pre>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 从流中加载并读取 Excel 文件

借助 Spire.XLS for JavaScript,您可以在内存中修改 Excel 文件。首先通过 LoadFromStream() 方法将流中的 Excel 文件加载到 Workbook 对象中,完成修改(例如更改单元格样式或内容)后,再使用 SaveToStream() 方法将文件保存回流。无需依赖直接的文件存储操作即可实现实时的 Excel 文件数据更改。具体操作步骤如下:
Stream 对象,并通过 LoadFromStream() 方法从流中加载文件。Worksheets.get() 方法访问工作表。CellRange.Style 属性完成。AutoFitColumn() 方法自动调整列宽以适应内容。Stream 对象,使用 SaveToStream() 方法将修改后的工作簿保存到流,并从 VFS 读取结果文件触发下载。下面是一个完整的代码示例,展示了在 React 中修改流中的 Excel 文件并保存:
function App() {
const modifyAndSaveInStream = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 将示例 Excel 文件加载到 VFS
await window.spire.FetchFileToVFS('Sample.xlsx', '', `${process.env.PUBLIC_URL}data/`);
// 创建工作簿对象并从流中加载 Excel 文件
const workbook = new xlsModule.Workbook();
const fileStream = new xlsModule.Stream('Sample.xlsx');
workbook.LoadFromStream(fileStream, xlsModule.FileFormat.Auto);
// 获取工作簿中的第一个工作表
const sheet = workbook.Worksheets.get(0);
// 修改表头行的样式
const headerRow = sheet.Range.get({
row: sheet.FirstRow, column: sheet.FirstColumn,
lastRow: sheet.FirstRow, lastColumn: sheet.LastColumn
});
headerRow.Style.Font.FontName = 'Arial';
headerRow.Style.Font.Size = 12;
headerRow.Style.Font.IsBold = true;
headerRow.Style.Color = xlsModule.Color.get_LightSkyBlue();
// 修改数据行的样式,并交替着色(偶数行)
for (let i = sheet.FirstRow + 1; i <= sheet.LastRow; i++) {
const dataRow = sheet.Range.get({
row: i, column: sheet.FirstColumn,
lastRow: i, lastColumn: sheet.LastColumn
});
dataRow.Style.Font.FontName = 'Arial';
dataRow.Style.Font.Size = 10;
dataRow.Style.Color = xlsModule.Color.get_LightGray();
if (i % 2 === 0) {
dataRow.Style.Color = xlsModule.Color.get_DarkGray();
}
}
// 自动调整列宽以适应内容
for (let col = sheet.FirstColumn; col <= sheet.LastColumn; col++) {
sheet.AutoFitColumn(col);
}
// 设置边框颜色
sheet.AllocatedRange.Borders.Color = xlsModule.Color.get_White();
// 将修改后的工作簿保存到新的流
const outputFileName = 'ModifyExcelInStream.xlsx';
const outStream = new xlsModule.Stream(outputFileName);
workbook.SaveToStream(outStream, xlsModule.FileFormat.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={modifyAndSaveInStream}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 在流中修改并保存 Excel 文件

原因:使用 SaveToStream() 方法保存工作簿时,若未通过 FileFormat 参数指定正确的输出文件格式,生成的文件格式可能与扩展名不匹配,导致无法正常打开。
解决方案:保存到流时指定具体的文件格式枚举值,例如 xlsModule.FileFormat.Version2010:
const fileStream = new xlsModule.Stream(outputFileName);
workbook.SaveToStream(fileStream, xlsModule.FileFormat.Version2010);
原因:LoadFromStream() 方法需要根据流中数据的实际格式来识别文件类型,若格式参数设置不正确,可能导致加载失败或数据解析错误。
解决方案:加载时使用 xlsModule.FileFormat.Auto,让库自动检测流中文件的格式:
const fileStream = new xlsModule.Stream('Sample.xlsx');
workbook.LoadFromStream(fileStream, xlsModule.FileFormat.Auto);
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
在日常办公中,经常需要在 Excel 电子表格和 Markdown 文件之间进行数据交换。Markdown 是一种轻量级标记语言,广泛用于文档撰写、博客和技术说明。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成 Excel 与 Markdown 格式的双向转换,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。它提供了简单易用的 API,让格式转换更加便捷。
通过 Spire.XLS for JavaScript,您可以将 Excel 工作表中的数据导出为结构清晰、易于阅读的 Markdown 表格,也可以将包含表格语法的 Markdown 文件导入并创建为格式完整的 Excel 工作簿。这使得数据在不同应用程序之间的迁移变得更加便捷高效。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
将 Excel 数据导出为 Markdown 表格,便于在文档、博客或版本控制系统中直接阅读和分享表格数据。通过 Spire.XLS for JavaScript,您可以将整个工作簿保存为 Markdown 文件,生成的表格结构清晰、易于维护。具体操作步骤如下:
Workbook 对象并加载已有的 Excel 文件。SaveToFile() 方法,指定输出文件名和 FileFormat.Markdown 文件格式。下面是一个完整的代码示例,展示了在 React 中将 Excel 转换为 Markdown:
function App() {
const convertToMarkdown = 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('Sample.xlsx', '', `${process.env.PUBLIC_URL}data/`);
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 创建工作簿对象并加载 Excel 文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: 'Sample.xlsx' });
// 将工作簿保存为 Markdown 文件
const outputFileName = 'ExcelToMarkdown.md';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.Markdown });
workbook.Dispose();
// 从 VFS 读取文件并触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'text/markdown' });
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 转换为 Markdown</h1>
<button onClick={convertToMarkdown}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 将 Excel 转换为 Markdown 文件

将 Markdown 文件导入为 Excel 电子表格,可以充分利用 Excel 的格式化、计算和图表功能。Spire.XLS for JavaScript 支持通过 LoadFromMarkdown() 方法直接加载 Markdown 文件,并将其中的表格数据转换为工作表中的单元格。具体操作步骤如下:
Workbook 对象,调用 LoadFromMarkdown() 方法加载 Markdown 文件。下面是一个完整的代码示例,展示了在 React 中将 Markdown 转换为 Excel:
function App() {
const convertToExcel = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 加载字体文件以确保文本正确渲染
await window.spire.FetchFileToVFS('ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`);
// 将 Markdown 示例文件加载到 VFS
await window.spire.FetchFileToVFS('Sample.md', '', `${process.env.PUBLIC_URL}data/`);
// 创建工作簿对象并加载 Markdown 文件
const workbook = new xlsModule.Workbook();
workbook.LoadFromMarkdown('Sample.md');
// 保存工作簿并释放资源
const outputFileName = 'MarkdownToExcel.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>将 Markdown 转换为 Excel</h1>
<button onClick={convertToExcel}>
生成
</button>
</div>
);
}
export default App;
使用 Spire.XLS for JavaScript 将 Markdown 转换为 Excel 文件

原因:WASM 虚拟文件系统(VFS)中若未加载字体文件,导出的 Markdown 内容或导入的单元格文本可能无法正确渲染,尤其是在包含中文等非 ASCII 字符时。
解决方案:转换前通过 FetchFileToVFS 将字体文件加载到 VFS:
await window.spire.FetchFileToVFS(
'ARIAL.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}font/`
);
原因:创建 Blob 时 MIME 类型设置不当,导致浏览器无法识别下载文件为 Markdown 文本,可能以其他类型打开或显示乱码。
解决方案:下载时指定正确的 MIME 类型,并确保下载文件名以 .md 结尾:
const blob = new Blob([fileArray], { type: 'text/markdown' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'ExcelToMarkdown.md';
a.click();
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。