冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

在跨行业的数据处理场景中,把 CSV、PDF 中的数据导入 Excel 是最常见也最容易出错的环节——财务核对银行导出的 CSV 流水,电商整理多平台导出的订单文件,行政处理供应商发来的 PDF 对账单。这些文件的格式五花八门:CSV 分隔符不统一、字段内含有逗号、日期以各种形式出现、手机号、身份证号等以 0 开头的编号被默认当作数字处理而丢失前导零;PDF 表格无法直接编辑,复制到 Excel 后行、列、合并单元格全部错位。

传统做法通常是手工分列、逐列设置格式、靠眼睛寻找错误单元格。一个几百行的 CSV 往往要花上半小时反复调整;PDF 表格更是只能逐行复制粘贴。传统方式还容易出现分列错位、日期串位、数字变文本等隐患,一旦数据量增大,人工处理几乎不可行。

以财务核对银行流水为例,拿到 CSV 后往往要经历:先用文本编辑器确认编码 → 在 Excel 中分列 → 逐列设置日期与金额格式 → 肉眼排查异常值。字段内含逗号会导致整行串位,以 0 开头的账号被吞掉前导零,几经周折才能得到一份可用的表格。PDF 对账单更是只能逐行复制粘贴,行、列、合并单元格几乎全部错位,还原一份往往要耗费小半天。

对比传统 SDK API 处理

传统 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 智能分列导入

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 数据和智能分列导入结果 原始 CSV 数据 智能分列导入结果


PDF 表格导入 Excel

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 的表格数据 原始 PDF 数据 PDF 表格提取结果


常见问题

CSV 分隔符不统一 / 字段内含逗号导致分列错位

原因:CSV 分隔符可能是分号、制表符,或字段内包含被引号包裹的逗号、换行,自动分列时整行串位。

解决:在指令中说明分隔符,或让 AI 自动识别并正确处理引号包裹的字段。

以 0 开头的编号丢失前导零

原因:手机号、身份证号、账号等以 0 开头的值被当作数值类型导入,前导零被吞掉。

解决:在指令中指定"手机号、证件号等列为文本,保留前导零"。


获取 SpireToken Key

  • 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥

在代码中配置:

AIOptions options = new AIOptions();
options.SpireToken = key;

在财务与税务场景中,发票信息录入是最常见也最耗时的工作之一。每张发票上的发票号、日期、金额、税额、购买方,都需要人工逐张核对后录入 Excel 或财务系统;到了月中对账、月末报税或报销高峰期,积压的发票往往数以百计,录入手速就成了瓶颈。传统做法是逐页打开发票 PDF、找到对应字段、复制粘贴——不仅效率低下,而且极易发生漏项、错位、金额抄错等问题,任何一处偏差都会直接影响对账与报税准确性。发票版式又各不相同,字段位置五花八门,进一步加大了手工整理的出错风险。因此,把"逐张读发票、抄字段"这件重复劳动交给程序自动完成,是财务团队最迫切想解决的痛点之一。

对比传统SDK API处理

同样是"从 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 原发票PDF 提取并导出的Excel 提取并导出的Excel


常见问题

提取到的金额或税额不正确

原因:发票金额存在大小写两种写法,或含税/不含税口径不一致。

解决:在指令中明确提取口径(如"提取价税合计金额""提取不含税金额"),AI 智能体会按指定口径提取。若发票存在大小写两种金额,建议同时说明以哪一种为准,避免歧义。

不同版式的发票如何识别

原因:不同供应商的发票版式、字段位置各不相同。

解决:AI 智能体可自动理解发票版式并定位字段;如遇特殊版式,可在指令中补充字段说明(例如"发票号码位于右上角"),帮助智能体更准确地定位。

提取结果列顺序/字段名与预期不符

原因:AI 默认按识别顺序输出字段。

解决:在指令中明确字段名与顺序(如"按 发票号、日期、金额、税额、购买方 的顺序导出"),智能体会按你的要求排列输出列。


获取SpireToken Key

  • 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥

在代码中配置:

AIOptions options = new AIOptions();
options.SpireToken = key;

在教育与教务场景中,每次考试后的成绩处理是最频繁也最耗时的工作。同一次考试成绩,往往需要从两个维度进行处理:面向班级学生与班主任,需要呈现本班的成绩明细、排名与学科强弱;面向教师与教务处,则需要进行全年级横向对比,判断哪些班级、哪些学科需要重点关注。

传统做法通常需要人工在 Excel 中编写公式、手动排序、逐项绘图,再撰写分析总结。面向不同对象还要重复整理两套数据,整套流程往往耗费半天到一天时间,且公式易错、图表样式不统一、分析口径难以保持一致。

对比传统SDK API处理

传统 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 默认的并列名次处理方式可能不符合要求。

解决:在指令中明确并列规则,如"总分相同时按语文成绩优先排序"。


获取SpireToken Key

  • 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥

在代码中配置:

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 文件

将 Excel 数据导出为 ODS 格式,便于在 LibreOffice、OpenOffice 等开源办公软件中直接打开和编辑。通过 Spire.XLS for JavaScript,您可以将整个工作簿保存为 ODS 文件,在保留表格结构、样式和数据的同时,实现跨平台的数据共享。具体操作步骤如下:

  • 创建 Workbook 对象并加载已有的 Excel 文件。
  • 调用工作簿的 SaveToFile() 方法,指定输出文件名和 FileFormat.ODS 文件格式。
  • 释放工作簿资源并从 VFS 读取结果文件触发下载。

下面是一个完整的代码示例,展示了在 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 文件

使用 Spire.XLS for JavaScript 将 Excel 转换为 ODS 文件


将 ODS 文件转换为 Excel 工作簿

将 ODS 文件导入为 Excel 电子表格,可以充分利用 Excel 强大的格式化、计算和图表功能。Spire.XLS for JavaScript 支持通过 LoadFromFile() 方法直接加载 ODS 文件,并自动识别其文件格式,随后即可将工作簿保存为 Excel 格式。具体操作步骤如下:

  • 将字体文件和 ODS 示例文件加载到 VFS 虚拟文件系统。
  • 创建 Workbook 对象,调用 LoadFromFile() 方法加载 ODS 文件。
  • 保存工作簿为 Excel 文件并触发下载。

下面是一个完整的代码示例,展示了在 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 文件

使用 Spire.XLS for JavaScript 将 ODS 转换为 Excel 文件


常见问题

为什么生成的 ODS 文件无法正常打开?

原因:使用 SaveToFile() 方法保存工作簿时,若未通过 fileFormat 参数指定正确的输出文件格式,生成的文件格式可能与扩展名不匹配,导致无法正常打开。

解决方案:保存为 ODS 时指定具体的文件格式枚举值 xlsModule.FileFormat.ODS:

const outputFileName = 'ExcelToODS.ods';
workbook.SaveToFile({ fileName: outputFileName, fileFormat: xlsModule.FileFormat.ODS });

下载的 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 原银行流水CSV 原系统交易PDF 原系统交易PDF Excel AI对账后的对账明细 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 原银行流水CSV 原系统交易PDF 原系统交易PDF Excel AI对账后的对账明细 Excel AI对账后的对账明细


对比传统SDK API处理

传统 Spire.Office for .NET API Spire.Agent.Office 处理
驱动方式 需编写 CSV/PDF 解析、列映射、数据清洗、匹配与异常逻辑等大量代码 用自然语言描述对账规则,AI 理解后自动编排执行
数据格式 CSV 与 PDF 需分别用不同组件解析、格式各异 直接附加 CSV 与 PDF,AI 自动理解内容
字段映射 硬编码列名对应关系,列名或格式变更需改代码 AI 根据列名与内容语义自动映射
异常处理 需手写差异判定、告警文案与样式逻辑 AI 自动识别差异并给出处理建议

常见问题

银行流水 CSV 中的日期和金额格式不统一

原因:网银导出的 CSV 中,日期可能有 2026-07-01、2026/7/1 等写法,金额可能带 ¥、千分位或前后空格,导致匹配时误判。

解决:在指令中显式要求"将日期统一为 yyyy-MM-dd、金额统一为数字格式并去除空格",AI 会在对账前自动完成标准化。

系统交易 PDF 表格跨页或带页眉页脚

原因:PDF 明细报表可能存在分页、重复页眉或页脚注释,影响 AI 对表格数据的读取。

解决:在指令中添加"忽略页眉页脚与重复的表头行,只读取表格数据行"的描述。

同一笔金额在同一天多次出现导致误匹配

原因:按"日期+金额"组合对账时,同一天可能存在多笔金额相同的交易,无法确定具体对应关系。

解决:优先使用流水号精确对账;若确实无流水号,可在指令中要求"将同日无法一一对应的记录标记为'金额不一致'"。


获取SpireToken Key

  • 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥

在代码中配置:

AIOptions options = new AIOptions();
options.SpireToken = key;

Spire.PDF for Java 12.8.6 现已正式发布。该版本主要增强了 PDF 到 Word 的转换效果。详情请查阅以下内容。

问题修复:


获取 Spire.PDF for Java 12.8.6 请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-JAVA.html

在企业法务和合规管理场景中,合同审查是最耗时也最容易遗漏疏漏的工作之一。每一份合同都涉及大量的权利与义务条款——违约金、付款条件、免责条款、违约责任、争议解决等,任何一个对己方不利或表述含糊的条款,都可能在未来引发法律纠纷或造成经济损失。传统方式依赖法务人员逐条阅读、手工标注,一份几十页的合同往往需要数小时,且不同人员的审查标准也不统一。

对比传统SDK API处理

传统 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 引用条款原文,并注明条款序号来源,便于人工核对定位。


获取SpireToken Key

  • 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥

在代码中配置:

AIOptions options = new AIOptions();
options.SpireToken = key;

Spire.PDF 12.8.3 现已发布。该版本修复了多个问题,包括 PDF 转图片时程序抛出异常,以及提取 PDF 文本时字符重叠的问题。详情如下。

问题修复:


获取 Spire.PDF 12.8.3 请点击:

https://www.e-iceblue.cn/Downloads/Spire-pdf-net.html

在 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 模块初始化。


动态创建 Excel 文件并保存到流

利用 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 动态创建 Excel 文件并保存到流


从流中加载并读取 Excel 文件

通过 Spire.XLS for JavaScript,您可以使用 LoadFromStream() 方法直接从流中加载 Excel 文件。加载完成后,可以轻松读取流中 Excel 文件的单元格数据,实现快速灵活的数据处理,而无需进行文件 I/O 操作。具体操作步骤如下:

  • 创建指向待加载 Excel 文件的 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 文件


在流中修改并保存 Excel 文件

借助 Spire.XLS for JavaScript,您可以在内存中修改 Excel 文件。首先通过 LoadFromStream() 方法将流中的 Excel 文件加载到 Workbook 对象中,完成修改(例如更改单元格样式或内容)后,再使用 SaveToStream() 方法将文件保存回流。无需依赖直接的文件存储操作即可实现实时的 Excel 文件数据更改。具体操作步骤如下:

  • 创建指向 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 文件

使用 Spire.XLS for JavaScript 在流中修改并保存 Excel 文件


常见问题

为什么保存到流的文件无法在 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 文件

将 Excel 数据导出为 Markdown 表格,便于在文档、博客或版本控制系统中直接阅读和分享表格数据。通过 Spire.XLS for JavaScript,您可以将整个工作簿保存为 Markdown 文件,生成的表格结构清晰、易于维护。具体操作步骤如下:

  • 创建 Workbook 对象并加载已有的 Excel 文件。
  • 调用工作簿的 SaveToFile() 方法,指定输出文件名和 FileFormat.Markdown 文件格式。
  • 释放工作簿资源并从 VFS 读取结果文件触发下载。

下面是一个完整的代码示例,展示了在 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 文件

使用 Spire.XLS for JavaScript 将 Excel 转换为 Markdown 文件


将 Markdown 文件转换为 Excel 工作簿

将 Markdown 文件导入为 Excel 电子表格,可以充分利用 Excel 的格式化、计算和图表功能。Spire.XLS for JavaScript 支持通过 LoadFromMarkdown() 方法直接加载 Markdown 文件,并将其中的表格数据转换为工作表中的单元格。具体操作步骤如下:

  • 将字体文件和 Markdown 示例文件加载到 VFS 虚拟文件系统。
  • 创建 Workbook 对象,调用 LoadFromMarkdown() 方法加载 Markdown 文件。
  • 保存工作簿为 Excel 文件并触发下载。

下面是一个完整的代码示例,展示了在 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 文件

使用 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/`
);

下载的 Markdown 文件被当作其他类型打开或显示乱码?

原因:创建 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 天的临时许可证。