服务端表格组件 GrapeCity Documents for Excel 更新说明

V9.0 版本性能改进

作为一款服务器端电子表格引擎,GcExcel 专为速度而生,尤其是在公式计算和大规模数据处理方面。在 V9.0 版本中,我们大幅提升了众多常用操作的性能,包括复制大范围数据、更新图表链接值、处理动态数组公式、查找操作、自动调整大小功能以及导出包含大量数据透视表的工作簿。这些改进使 GcExcel 在企业级工作负载和高容量自动化场景下运行速度更快、效率更高。

快速复制包含复杂公式的大范围数据

现在复制包含复杂公式(例如
MATCH
SUMIFS
multi-cell
表达式)的区域执行速度显著提升。多个实际客户案例表明,速度提升了 89% 到 98%,40,000 行区域的处理时间从 26.8 秒缩短至 0.57 秒

减少频繁获取/设置操作的开销

现在,由图表更新或动态数组重新计算等操作引起的大量调用工作流
Range.GetValue
、速度
Range.SetValue
显著提升。在 V9.0 版本中,GcExcel 仅在需要时更新图表数据,并跳过不必要的动态数组状态更新,从而实现了 95% 到 99% 的性能提升。

更快地复制动态数组公式范围

以前复制包含溢出公式的区域会导致重复的内部状态检查。现在,通过新的优化更新机制,复制大型行区域的速度提高了 98%,将原本需要 78 秒的操作缩短到仅 1 秒多一点。

改进混合数据类型下的查找函数性能

查找类型函数(例如,
XLOOKUP
MATCH
LOOKUP
)现在即使在范围包含混合的数值和文本值时也会应用优化的缓存。这带来了显著的性能提升,在计算数十万个查找公式时,速度最多可提升 96%。

自动调整性能和内存优化

AutoFit 现在采用更高效的内部策略,在应用于大型 (300×300) 范围时,处理时间缩短了近一半,内存使用量减少了 60% 以上。

[Java] 加快导出包含大量数据透视表的工作簿的速度

对于 Java 开发人员来说,将包含大量数据透视表的 Excel 工作簿导出到 Excel 的速度现在显著提升。一个典型的测试用例表明,导出包含数十个数据透视表的大型文件时,速度提升了 52%(。NET 在这方面无需优化)。

凭借这些改进,GcExcel 9.0 全面提升了性能,使其更加流畅、快速且更具可扩展性,从而使您的应用程序能够更高效地处理更大的工作簿、更多的公式和更繁重的工作负载。以下是这些性能改进的直观展示。

AI 功能:查询、翻译和文本情感分析

GcExcel V9.0 引入了一系列全新的 AI 函数,可将强大的语言模型功能直接集成到类似 Excel 的公式中。这些函数内置了对模型查询、文本翻译和情感分析的支持,开发者现在可以将 AI 驱动的工作流直接集成到计算引擎中,无需单独的批处理作业或粘合脚本。这些函数可用于模板、公式扩展或自动化场景,并由可插拔的请求处理程序提供支持,因此您可以连接到您选择的 AI 提供商。

由于人工智能模型是非确定性的,因此重新计算人工智能公式可能会随着时间的推移产生不同的结果。GcExcel 还会将常见的与人工智能相关的问题以电子表格错误代码的形式显示出来(例如,
#BUSY!
请求正在处理中、
#CONNECT!
网络/处理程序故障、
#VALUE!
执行问题以及
#NA!
未配置处理程序时)。

可插拔 AI 模型请求处理器

新 AI 功能的核心是 IAIModelRequestHandler 接口。GcExcel 并没有内置特定的 AI 供应商,而是将所有模型调用委托给一个全局处理程序:

  • .NET:
    Workbook.AIModelRequestHandler
  • Java:
    Workbook.setAIModelRequestHandler(...)
您需要实现 IAIModelRequestHandler(或使用类似示例
OpenAIModelRequestHandler
)来:
  • 构建并向您选择的 AI API(OpenAI、Azure OpenAI、DeepSeek、Qwen 等)发送请求。
  • 管理 API 密钥、端点和模型名称
  • 加强安全、日志记录和合规性
  • 返回一个
    AIModelResponse
    内容为 JSON 二维数组的对象,该数组可以清晰地映射到单元格中。

//C#

// Configure once for the entire app
Workbook.AIModelRequestHandler =new OpenAIModelRequestHandler("https://api.openai.com/v1", "sk-xxxx", "gpt-4.1");


//Java

Workbook.setAIModelRequestHandler(new OpenAIModelRequestHandler("https://api.openai.com/v1", "sk-xxxx", "gpt-4.1"));

设置完成后,任何工作簿中的所有 AI 公式都会通过此处理程序路由其请求。

AI.QUERY – 从您的网格向模型提问

AI.QUERY
允许您根据单元格值和范围构建提示,然后将其发送到 AI 模型并将结果返回到工作表中。


=AI.QUERY(prompt1, [data1], [prompt2], [data2], ...)

  • 提示:描述任务或问题的必填文本
  • 数据:可选的单元格或范围,作为上下文传递

GcExcel 会将所有提示参数和数据参数合并成一条消息。例如:


=AI.QUERY("evaluate these reviews ", A6:A13, " based on these categories ", B5:C5)

这将生成一个类似于 “根据以下类别 [B5:C5 中的值] 评估 [A6:A13 中的值] ”的提示,并将模型的响应作为溢出范围返回。


//C#

var wb = new Workbook();var ws = wb.Worksheets[0];
ws.Range["A1"].Value = "Country";
ws.Range["A2:A4"].Value = new object[,] { { "China" }, { "USA" }, { "UK" } };
ws.Range["B1"].Value = "What is the capital of country?";
ws.Range["B2"].Formula2 = "=AI.QUERY(B1, A2:A4, \"Only need capital\")";
wb.Calculate();
wb.WaitForCalculationToFinish();


//Java

Workbook wb = new Workbook();IWorksheet ws = wb.getWorksheets().get(0);
ws.getRange("A1").setValue("Country");
ws.getRange("A2:A4").setValue(new Object[][] { { "China" }, { "USA" }, { "UK" } });
ws.getRange("B1").setValue("What is the capital of country?");
ws.getRange("B2").setFormula2("=AI.QUERY(B1,A2:A4,\"Only need capital\")");
wb.calculate();
wb.waitForCalculationToFinish();

AI.TRANSLATE – 将范围翻译成目标语言

AI.TRANSLATE
使用配置的模型将文本翻译成指定的语言。

句法


=AI.TRANSLATE(array, language)

  • 数组:需要翻译的范围或数组
  • 语言:必需的语言标识符(例如 en-US、zh-CN、ja-JP 等区域设置名称,或 English、Chinese 等明确的语言名称)

=AI.TRANSLATE(A6, B6)

这将把 A6 中的值翻译成 B6 中指定的目标语言(简体中文),并将结果输出到相应的输出范围。


//C#

var wb = new Workbook();var ws = wb.Worksheets[0];
ws.Range["A1"].Value = "Country";
ws.Range["B1"].Value = "Translation";
ws.Range["A2:A4"].Value = new object[,] { { "China" }, { "USA" }, { "UK" } };
ws.Range["B2"].Formula2 = "=AI.TRANSLATE(A2:A4, \"zh-cn\")";
wb.Calculate();
wb.WaitForCalculationToFinish();


//Java

Workbook wb = new Workbook();IWorksheet ws = wb.getWorksheets().get(0);
ws.getRange("A1").setValue("Country");
ws.getRange("B1").setValue("Translation");
ws.getRange("A2:A4").setValue(new Object[][] { { "China" }, { "USA" }, { "UK" } });
ws.getRange("B2").setFormula2("=AI.TRANSLATE(A2:A4, \"zh-cn\")");
wb.calculate();
wb.waitForCalculationToFinish();

AI.TEXTSENTIMENT – 将文本情感分类为正面/负面/中性

AI.TEXTSENTIMENT 分析文本,并根据情感是积极的、消极的还是中性的返回自定义值。

句法


=AI.TEXTSENTIMENT(array, positive, negative, [neutral])

  • 数组:必填输入文本范围
  • 正面值:当情绪为正面时返回的值
  • 负面:当情绪为负面时要返回的值
  • 中性:当情绪为中性时返回的可选值

例子:


=AI.TEXTSENTIMENT(A6:A13, "Positive", "Negative", "Neutral")

GcExcel 将 A6:A13 中的文本发送到您的 AI 处理程序,然后将相应的情感标签写回结果范围。


//C#

var wb = new Workbook();var ws = wb.Worksheets[0];
ws.Range["A1"].Value = "Review";
ws.Range["B1"].Value = "TEXTSENTIMENT";
ws.Range["A2:A6"].Value = new object[,] {
    {"The restaurant offers a beautiful ambiance and attentive service, perfect for family gatherings."}, 
    {"The food is delicious, but the prices are slightly high, which affects the overall value."}, 
    {"It was noisy with poor service and slow food delivery, making for a disappointing experience."},{"Loved the unique dishes and inviting atmosphere!Definitely planning to come back." },{"Great flavors and a cozy setting, although the waiting time was a bit too long." }};
ws.Range["B2"].Formula2 = "=AI.TEXTSENTIMENT(A2:A6, \"Positive\",\"Negative\",\"Neutral\")";
wb.Calculate();
wb.WaitForCalculationToFinish();


//Java

Workbook wb = new Workbook();IWorksheet ws = wb.getWorksheets().get(0);
ws.getRange("A1").setValue("Review");
ws.getRange("B1").setValue("TEXTSENTIMENT");
ws.getRange("A2:A6").setValue(new Object[][] {{"The restaurant offers a beautiful ambiance and attentive service, perfect for family gatherings."},{"The food is delicious, but the prices are slightly high, which affects the overall value."},{"It was noisy with poor service and slow food delivery, making for a disappointing experience."},{"Loved the unique dishes and inviting atmosphere!Definitely planning to come back." },{"Great flavors and a cozy setting, although the waiting time was a bit too long." }});
ws.getRange("B2").setFormula2("=AI.TEXTSENTIMENT(A2:A6, \"Positive\",\"Negative\",\"Neutral\")");
wb.calculate();

借助 AI.QUERY、AI.TRANSLATE 和 AI.TEXTSENTIMENT,以及灵活的
IAIModelRequestHandler
抽象功能,GcExcel V9.0 将电子表格变成支持 AI 的计算表面,让您可以直接将智能分类、翻译和分析嵌入到现有的 Excel 自动化工作流程中。

新增文本转换函数:VALUETOTEXT 和 ARRAYTOTEXT

GcExcel V9.0 新增了对两个 Excel 新函数 VALUETOTEXTARRAYTOTEXT 的支持,使用户能够更轻松地将值和数组转换为文本,同时保持与 Excel 行为的完全兼容性。当需要将混合数据类型(数字、布尔值、错误、文本)规范化为字符串,以便进行字符串连接、日志记录、审计或动态公式生成时,这些函数尤其有用。

这两个函数都支持 format 参数,用于控制结果是易于理解的简洁表示,还是带有引号和转义字符的更严格的、与公式栏兼容的字符串。

VALUETOTEXT – 将任何值转换为其文本表示形式

VALUETOTEXT
将单个值、数组或范围引用转换为其文本形式。

句法


=VALUETOTEXT(value, [format])

  • – 必填。可以是数字、文本、布尔值、错误、空单元格、数组、LAMBDA 函数或范围引用。
  • 格式(可选)。

    - 0(默认):简洁格式,与单元格在“常规”下的显示方式一致。
    - 1:严格格式,适用于公式栏解析。文本用引号括起来,内部引号已转义。

例如:

  • =VALUETOTEXT(A2, 0)
    → 你好
  • =VALUETOTEXT(A2, 1)
    → “你好”


//C#

Workbook wb = new Workbook();IWorksheet activeSheet = wb.ActiveSheet;
activeSheet.Range["A1:E1"].Value = new object[] { "0", "1", 2, 3, 4 };
activeSheet.Range["A3"].Formula2 = "VALUETOTEXT(A1:E1)"; // "0","1","2","3","4"
activeSheet.Range["A3"].Formula2 = "VALUETOTEXT(A1:E1,1)"; // "\"0\"","\"1\"","2","3","4"
activeSheet.Range["A4"].Formula2 = "ValueToText(A1:E1,\"\")"; // #VALUE!, #VALUE!, #VALUE!, #VALUE!, #VALUE!

以值形式传递的错误(例如
false#VALUE!
或 `false`
10/0
)将保留为错误文本,而无效或格式错误的参数将导致标准的 Excel 样式#VALUE!错误行为或错误传播行为。`false`
value
和`false` 都
format
可以是数组,允许您通过一次调用将溢出区域转换为相应的文本网格。

ARRAYTOTEXT – 将数组和范围转换为文本字符串

ARRAYTOTEXT 将整个数组或范围转换为单个文本字符串。

句法


=ARRAYTOTEXT(array, [format])

  • 数组 – 必填。要转换的范围或数组。
  • 格式(可选)。

    - 0(默认):简洁格式,与通用显示相匹配。
    - 1:使用行分隔符和引号的严格格式,以便可以将结果作为数组字面量粘贴回公式栏(例如 {200;"Tom";;""}) 。

例如:

  • =ARRAYTOTEXT(A2, 0)
    → 真
  • =ARRAYTOTEXT(A2, 1)
    → {TRUE}
  • =ARRAYTOTEXT(A5, 1)
    → {"你好"}
与 Excel 类似,
ARRAYTOTEXT
不支持 3D 引用(例如,
Sheet2:Sheet3!A1:C3
)以这种方式使用时会返回错误
#VALUE!
。非 0/1 格式的值遵循 Excel 的强制转换规则(数值范围映射到 0 或 1;无效字符串返回错误
#VALUE!
;布尔TRUE/FALSE值映射到 1/0)。


//C#

var workbook = new Workbook(); 
IWorksheet activeSheet = workbook.ActiveSheet;
sheet.Range["A1"].Value = 200;
sheet.Range["A2"].Value = "Tom";
sheet.Range["A4"].Value = "";
sheet.Range["C2"].Formula2 = "=ARRAYTOTEXT(A1:A4,1)"; // {200;"Tom";;""}

GcExcel .NET 和 Java V9.0.0 现在支持 VALUETOTEXT 和 ARRAYTOTEXT,您可以构建更强大的文本处理和检查工作流,同时与现代 Excel 函数行为完全保持一致,无需新的 API 调用。

控制 XLSX 文件中的共享公式导出

GcExcel V9.0 版本引入了一个新选项,使开发人员能够完全控制公式在导出的 XLSX 文件中的写入方式。对于将 GcExcel 与外部 Excel 处理库(例如 Python 的 openpyxl)混合使用的工作流程而言,此增强功能尤为重要,因为 openpyxl 对 Excel 共享公式结构的支持有限。

共享公式是 Excel 的一种节省空间的机制,它允许将重复的公式存储一次,并在多个单元格中应用。虽然这种方式很高效,但某些第三方工具无法正确解析共享公式,导致公式在后续处理过程中丢失或被错误读取。为了解决这个问题,GcExcel 现在提供了一种导出单个公式而非共享公式的方法。

开发者可以使用新属性启用此功能
XlsxSaveOptions.ExportSharedFormula
。设置为 false 时,GcExcel 在写入 XLSX 文件时会将每个共享公式展开为其完整的单元格特定版本,从而确保与 openpyxl 等工具的最大兼容性。但这样做会增加文件大小,因此仅当需要实现互操作性时才应使用此设置。

//C#

var workbook = new Workbook();var sheet = workbook.ActiveSheet;
sheet.Range["B1:B10"].Formula = "=A1";var options = new XlsxSaveOptions { ExportSharedFormula = false };
workbook.Save("testNoSharedFormula.xlsx", options);


//Java

Workbook workbook = new Workbook();IWorksheet sheet = workbook.getActiveSheet();
sheet.getRange("B1:B10").setFormula("=A1");XlsxSaveOptions options = new XlsxSaveOptions();
options.setExportSharedFormula(false);
workbook.save("testNoSharedFormula.xlsx", options);

通过此次更新,GcExcel V9.0 可以更轻松地在混合技术栈中集成 Excel 自动化,同时可靠地保持公式行为。

为 SpreadJS 报表表保留“显示隐藏的行和列”选项

在许多 SpreadJS 报表设计场景中,设计人员希望在设计模板时,某些行和列虽然在最终报表中技术上是隐藏的,但仍然可见且可编辑。SpreadJS 通过在编辑器中显示隐藏的行和列,并在预览/运行时才将其隐藏,从而支持这种设计时体验。在 GcExcel V9.0 中,我们增强了与 SpreadJS 的集成,以便在服务器上处理 SJS/SSJSON 文件时,也能始终保持这种行为。

GcExcel 现在为使用“设计时显示隐藏行和列”行为的报表表模板提供无损的 SJS/SSJSON I/O 功能。打开 SJS 或 SSJSON 文件时,所有与隐藏行和列相关的报表表配置都会被保留。保存或转换工作簿时,这些设置会原封不动地写入,确保 SpreadJS UI 中的设计时可见性功能继续按预期工作。


//C#

var workbook = new Workbook();
workbook.Open("HiddenRowsColumns.sjs");using (var fs = File.Create("export.json")){
workbook.ToJson(fs);} // End Using
workbook.Save("export.sjs");


//Java

workbook = new Workbook();
workbook.open("HiddenRowsColumns.sjs");
workbook.toJson(new FileOutputStream("exportJava.json"));
workbook.save("exportJava.sjs");

通过此次更新,GcExcel 。NET 和 Java V9.0 可以更好地与 SpreadJS ReportSheet 的设计时体验保持一致,同时在预览或运行时仍能提供准确的隐藏行/列行为。

无损保存 Excel Power Query 表

Power Query 是现代 Excel 报表功能的核心组成部分,它允许用户将数据库、文件、Web API 和其他外部来源的数据加载到表格、数据透视表和图表中。在之前的版本中,当包含查询表和外部数据连接的工作簿通过 GcExcel 打开和保存时,底层与查询相关的 XML 部分不会被保留。这意味着,经过 GcExcel 的往返转换后,Power Query 表在 Excel 中可能会丢失其刷新功能和元数据。

在 GcExcel V9.0 中,我们为处理 XLSX 文件时对 Excel 外部数据和查询表添加了无损 I/O 支持
/xl/queryTables/queryTableX.xml
。GcExcel 现在可以读取和写入相关的 OOXML 部分(例如表头和关联的表属性),而不会更改或丢弃它们。因此,当您在 Excel 中重新打开文件并刷新数据时,Power Query 表将保留其配置、字段映射和连接。

此增强功能专为数据保存而设计,而非编辑。GcExcel 不会尝试解释或修改查询定义;它只是在 XLSX 打开/保存操作中原封不动地保留查询定义。通过此更改,GcExcel 。NET 和 Java V9.0.0 可以安全地参与依赖于 Excel Power Query 的工作流,同时保留原始工作簿中的所有查询定义和外部数据连接。

 

服务端 PDF 组件 GrapeCity Documents for PDF 更新说明

新文档优化 API(优化)

V9.0 版本引入了一项备受期待的 PDF 文件大小缩减和清理增强功能:一个全新的统一类
Optimize()
方法
GcPdfDocument

该 API 将图像去重、字体处理、流压缩和对象流使用等多种现有优化功能整合到一个可自定义的入口点中。开发人员现在只需一次调用即可压缩和优化 PDF 文件,从而显著提高工作效率并减小输出文件大小。

为什么需要统一优化方法?

GcPDF 长期以来都包含多个用于减小文档大小的 API,但开发人员通常需要根据具体情况手动组合使用这些 API。新的优化流程简化了这一过程,具体如下:

  • 整合压缩和清理作业
  • 提供单个
    OptimizeDocumentOptions
    对象来配置行为
  • 确保优化和节省同时发生(某些选项需要这样做
    PdfStreamHandling
  • 简化自动化处理和批量 PDF 优化工作流程的脚本编写
这使得新
Optimize()
方法非常适合涉及归档、上传、客户端交付和服务器端文档管道的应用。

一行优化 PDF

GcPDF V9.0 API 新增了两个重载:


public void Optimize(Stream stream, OptimizeDocumentOptions options)public void Optimize(string fileName, OptimizeDocumentOptions options)

每个程序都会执行所有已配置的优化,然后保存结果,确保影响 PDF 结构的优化仅在保存时生效。

高度可配置的优化选项

OptimizeDocumentOptions
类可以完全控制优化的激进程度或保守程度。开发人员可以进行微调:
压缩与流行为 CompressionLevel – 覆盖文档的默认压缩方式。
PdfStreamHandling – 控制如何重写现有流(对先前加载的 PDF 特别有用)
UseObjectStreams– 支持单个或多个对象流,从而显著减小文件大小。
字体优化 OptimizeFontsOptions– 缩小嵌入式字体并删除未使用的字形
RemoveEmbeddedFonts– 删除所有嵌入字体以最大程度地减小文件大小(请谨慎使用,因为外观可能会发生变化)。
图像优化 RemoveDuplicateImages– 合并相同的图像流以减小文件大小。
文档清理 DiscardEmbeddedPageThumbnails
DiscardOutlines
DiscardSubmitImportResetActions
DiscardJavaScriptActions DiscardEmbeddedFiles
一键最大压缩 对于仅以最小尺寸为唯一优先事项的场景,例如归档或带宽受限的环境,该SetForMinimumSize()方法可以实现所有激进的优化,包括不建议在一般情况下使用的优化。

示例:在保持内容清晰的同时减小 PDF 文件大小


var doc = new GcPdfDocument();using var stream = new FileStream("test.pdf", FileMode.Open);
doc.Load(stream);var options = new OptimizeDocumentOptions{
    DiscardEmbeddedPageThumbnails = true};
doc.Optimize("optimized.pdf", options);

采用新
Optimize()
方法后,GcPDF V9.0 使高质量的自动化 PDF 优化比以往任何时候都更加容易和强大。

 

服务端 Word 组件 GrapeCity Documents for Word 更新说明

支持文档字段更新中的 RD(参考文档)字段

V9.0 版本扩展了 GcWord 的字段处理引擎,全面支持 RD(参考文档)字段,这对于处理大型多文件 Word 项目(如法律文件、报告、学术材料和出版工作流程)的客户来说是一项重要的功能。

RD 域允许 Word 文档在构建目录 (TOC)、参考文献目录 (TOA)索引时引用其他 DOCX 文件,从而使作者能够在多个文档中生成统一的参考文献。在 V9.0 版本中,GcWord 现在会在域更新期间自动识别 RD 域,检索引用的条目,并将标题、引文和索引条目正确合并到父文档中。

为什么研发领域支持至关重要

许多企业和法律 Word 文档都是基于一个包含多个子文档的主文档构建的,每个子文档都包含自己的标题、引文和索引条目。RD 字段可以实现以下功能:

  • 将长文档拆分成更小、更易于管理的文件
  • 生成单一的综合目录、总目录或索引
  • 跨多个文件的参考标题和条目
  • 创建可自动更新的动态文档

GcWord V9.0 将此功能引入了自动化工作流程和服务器端文档生成。

新的 RD 字段 API:RdFieldOptions

开发人员可以从两者中创建、读取、修改或保存 RD 字段
SimpleField
ComplexField
结构,从而使 GcWord 能够无缝集成到文档组装管道中。

相对 RD 字段的文档路径感知

V9.0 更新还添加了一个新属性
GcWordDocument

public string Path { get; set; }

此属性使 GcWord 能够在更新字段时解析相对 RD 文件路径。加载或保存包含文件路径的文档时,此属性会自动填充;但从流加载时,必须手动设置。

这项改进确保能够正确地收集参考文献中的标题、引文和索引词。

示例:合并多个文件中的目录、目录表和索引条目


// Create referenced sub-documents...// (each containing headings, authorities, and index entries)// Create the main documentvar doc = new GcWordDocument();
doc.Path = Path.Combine(Directory.GetCurrentDirectory(), @"rd-new.docx");// Add TOC, TOA, and Index fieldsvar toc = new TocFieldOptions(doc);
doc.Body.AddParagraph("Table of Content", doc.Styles[BuiltInStyleId.Title]).AddComplexField(toc);var toa = new ToaFieldOptions(doc);
doc.Body.AddParagraph("Table of Authorities", doc.Styles[BuiltInStyleId.Title]).AddComplexField(toa);var index = new IndexFieldOptions(doc);
index.PageNumbers.Separator = "\t";
doc.Body.AddParagraph("Index", doc.Styles[BuiltInStyleId.Title]).AddComplexField(index);// Reference the sub-documents using RD fieldsfor (int i = 1; i <= 2; i++){var rd = new RdFieldOptions(doc){
        FilePath = $"sub{i}.docx",
        Relative = true}; 
    doc.Body.AddParagraph().AddComplexField(rd);}// Update all fields (TOC, TOA, Index + RD)
doc.UpdateFields();
doc.Save(doc.Path);

UpdateFields()
现在调用 GcWord 时:

  • 加载每个引用的子文档
  • 摘录标题、引文条目和索引标记
  • 将它们合并到父文档的目录、标题和索引中。
  • 生成完全整合的参考结构

借助 RD 字段支持,GcWord V9.0 使开发人员能够更深入地控制复杂的 Word 文档结构,从而更容易生成合并输出并自动执行专业级文档组装工作流程。

帮助 | 演示

使用 Word 兼容格式更新日期和时间字段

在 V9.0 版本中,GcWord 新增了对以编程方式更新日期和时间字段的全面支持,包括丰富的格式选项,这些选项与 Microsoft Word 的行为高度一致。这项增强功能使得在服务器生成的文档中插入“当前日期/时间”字段并保持其同步变得轻而易举,只需调用相应的函数即可
UpdateFields()
,无需手动编辑。

无论您是生成合同、报告、信函还是带时间戳的导出文件,现在都可以控制日期和时间在各种语言和日历系统中的显示方式。

通过选项类实现丰富的日期/时间格式

为了支持灵活的、类似 Word 的格式设置,GcWord 引入了两个新的基类:

  • TimeFormatOptions – 日期/时间字符串的常用格式化选项
  • DateFormatOptions – 扩展 TimeFormatOptions,使其包含特定于日历的设置
这些类公开一个
DateTimeFormat
字符串,该字符串支持类似于 Word 使用的格式标记集(例如,日期
d
dd
日期、
MMM
日期、
MMMM
日期、
YYYY
日期、
hh:mm
日期、
AM/PM
本地化时代和日历标记等等)。这使您可以模拟用户在 Word 中插入日期/时间字段时看到的格式。
DateFormatOptions
它还允许您针对特定的日历系统:
  • UseHijriLunarCalendar
  • UseSakaEraCalendar
  • UseUmAlQuoraCalendar

这些选项结合起来,可以让你对不同地区和语言环境下的日期和时间的呈现方式进行精细控制。

注:目前支持的语言包括:

“ar-SA”、“bn-BD”、“cs-CZ”、“de-DE”、“el-GR”、“en-US”、“es-ES”、“fa-IR”、“fr-FR”、“he-IL”、“hi-IN”、“id-ID”、“it-IT”、“ja-JP”、“ko-KR”、“nl-NL”、“pl-PL”、“pt-PT”、 “ro-RO”、“ru-RU”、“sv-SE”、“th-TH”、“tr-TR”、“uk-UA”、“vi-VN”、“zh-CN”、“zh-HK”、“zh-MO”、“zh-SG”、“zh-TW”.

此版本不支持编号项目格式。

新增字段选项类:TimeFieldOptions 和 DateFieldOptions

GcWord V9.0 在格式化基础类的基础上,增加了两种特定于字段的类型:

  • TimeFieldOptions
    – 对于时间字段

    - TIME 字段定义当前日期和时间,重点在于时间格式。

  • DateFieldOptions
    – 对于日期字段
    - DATE 字段还定义了当前日期和时间,通常用于文档标题、签名和打印日期。
    - 包括
    UseLastCreatedFormat
    在插入新的 DATE 字段时,遵循宿主应用程序上次使用的日期时间格式。
这些类旨在与现有的 GcWord 字段 API 无缝集成,并且可以从
GcWordDocument
SimpleField
或 中创建
ComplexField
,因此它们既可用于新建文档,也可用于更新现有文档。

示例:插入和更新日期和时间字段

以下示例展示了如何创建默认格式字段和自定义格式字段,然后将其更新为当前日期和时间:


GcWordDocument doc = new GcWordDocument();// TIME field with default settings
var time = new TimeFieldOptions(doc);
doc.Body.AddParagraph("Time: ").AddComplexField(time);// DATE field with default settings
var date = new DateFieldOptions(doc);
doc.Body.AddParagraph("Date: ").AddComplexField(date);// DATE field with custom date-time format
date.DateTimeFormat = "'Today is ' d MMMM yyyy HH:mm:ss";
doc.Body.AddParagraph("Custom date-time format: ").AddComplexField(date);// Update all fields to show the current date and time
doc.UpdateFields();
doc.Save("date-time.docx");

借助此 API,您可以:

  • 在模板中插入日期/时间字段,并在服务器端更新它们。
  • 根据文档语言本地化日期和时间输出
  • 在自动化工作流程中匹配现有的 Word 格式规范

GcWord V9.0 让您能够更轻松地在所有生成的 Word 文档中保持日期和时间的准确性、一致性和区域感知性。

历史版本

查看更多关于 GrapeCity Documents 服务端表格组件的历史版本。