Excel 文档解决方案 (DsExcel) .NET和Java版本在 v7.2 版本中继续提供令人兴奋的新功能和增强功能。此更新引入了对许多高级 Microsoft Excel 功能的支持,为用户提供了更强大、更灵活的工具。DsExcel 模板的重大改进增强了模板创建的功能集和性能。此外,此版本还提供了与 SpreadJS 集成的新功能,包括用于处理 SJS JSON 文件的新方法重载。该版本还为客户端文档 解决方案数据查看器 (DsDataViewer)添加了高级功能,扩展了其数据提取功能并整合了搜索功能,这是任何数据查看器的共同要求。请在下面了解此最新版本中主要功能的详细信息。
重要信息:从“GrapeCity Documents”转变为“Document Solutions”
GrapeCity Documents 经历了营销品牌重塑,因此 2024 年 11 月发布的 v7.2 维护版本将标志着旧 GrapeCity Documents 产品品牌下的最终版本。
从 8.0.0 版本开始,软件包将仅使用新的软件包名称发布,并且 GrapeCity 软件包将被逐步淘汰。
强烈建议您尽快更新这些新软件包。通过文档迁移工具可以简化向新软件包的转换,该工具方便地包含在各个产品可用的产品试用版下载 zip 文件中。
请注意,尽管采用了新的包名称,但 API、命名空间和类型名称保持不变。您无需修改代码。只有包名称和 DLL 名称发生了变化;它们只需要更新新的包引用。
现有订阅将继续接收新软件包更新。如果您对此更新有任何疑问或需要任何帮助,请联系我们的支持团队。
将目标搜索添加到电子表格
Excel 的目标搜索功能使用户能够确定实现所需结果所需的输入值。通过设置目标输出,目标搜索功能会自动调整输入值,直到达到所需结果。此功能对于 Excel 建模中的情景分析和决策非常有用。
DsExcel 添加了一个新的 API,以编程方式将 Goal Seek 函数添加到您的电子表格中。新的IRange.GoalSeek(double goal, IRange changingCell)方法(布尔值)尝试通过修改指定的changingCell来从 IRange 所表示的单元格中公式的计算结果中实现指定的目标。goal参数指定所需的目标输出,而changingCell参数指定其值将发生变化以实现目标值的单元格。
以下代码使用新的GoalSeek方法来查找个人需要获得的利率(changingCell参数)以满足其目标贷款目标(goal参数)。
//create a new workbook
var workbook = new GrapeCity.Documents.Excel.Workbook();
//Set MaximumIterations and MaximumChange
workbook.Options.Formulas.MaximumIterations = 1000;
workbook.Options.Formulas.MaximumChange = 0.000001;
var activeSheet = workbook.ActiveSheet;
activeSheet.Range["A1:A4"].Value = new string[] { "Loan Amount", "Term in Months", "Interest Rate", "Payment" };
// This is the amount that you want to borrow.
activeSheet.Range["B1"].Value = 100000;
activeSheet.Range["B1"].NumberFormat = "$#,##0";
// This is the number of months that you want to pay off the loan.
activeSheet.Range["B2"].Value = 180;
// This is the number of interest rate.
activeSheet.Range["B3"].NumberFormat = "0.00%";
// This formula calculates the payment amount.
activeSheet.Range["B4"].Formula = "=PMT(B3/12,B2,B1)";
activeSheet.Range["B4"].NumberFormat = "$#,##0";
// Use goal seek to calculate the value of cell B3.
activeSheet.Range["B4"].GoalSeek(-900, activeSheet.Range["B3"]);
activeSheet.Range["A1:B4"].AutoFit();
// Save to an excel file
workbook.Save("GoalSeek.xlsx");
数据透视表中的标签和值过滤器
在 v7.2 版本中,DsExcel 增强了其数据透视表过滤器支持,使开发人员能够以编程方式在数据透视表中优化和管理大型数据集。DsExcel 中添加的新过滤器选项有助于缩小数据范围以关注特定标准,从而使分析更加精确和相关。
DsExcel 支持在数据透视表中添加标签(包括日期过滤器)和值过滤器的新 API。标签过滤器 API 有助于根据行或列字段中的标签过滤数据,而值过滤器 API 仅显示值符合特定条件的数据。DsExcel 提供了 IPivotField 接口的 PivotFilters 属性,使用户能够使用 PivotFilterType 枚举将标签、值或日期过滤器添加到数据透视表字段,该枚举可以作为IPivotFilters接口的Add方法中的参数传递。新 API 添加还包括AllowMultipleFilters属性,该属性有助于在字段上同时添加标签和值过滤器,从而使开发人员能够在字段上添加多个过滤器。新 API 添加中还包括ClearLabelFilter、ClearValueFilter和ClearAllFilters方法来删除过滤器。
以下代码显示如何在标题文本包含“mi”的“产品”数据字段上应用标签过滤器。
//config pivot table's fields
var field_Category = pivottable.PivotFields["Category"];
field_Category.Orientation = PivotFieldOrientation.ColumnField;
var field_Product = pivottable.PivotFields["Product"];
field_Product.Orientation = PivotFieldOrientation.RowField;
var field_Amount = pivottable.PivotFields["Amount"];
field_Amount.Orientation = PivotFieldOrientation.DataField;
field_Amount.NumberFormat = "$#,##0.00";
// Filter for products where the product name contains 'mi'.
field_Product.PivotFilters.Add(PivotFilterType.CaptionContains, "mi");
worksheet.Range["A:D"].EntireColumn.AutoFit();
// Save to an excel file
workbook.Save("PivotLabelFilter.xlsx");
DsExcel 模板中的多项增强功能
过滤来自单个或多个数据源的数据
在业务场景中,开发人员需要整合来自多个数据源的数据。在这样的应用中,数据之间存在关系。DsExcel 现在支持通过在 Excel 模板中定义过滤器来表示这些关系。单个模板单元格可以对应数据源中的多个记录,开发人员可以相应地过滤扩展的数据。模板中的过滤器也可以轻松修改,使报告能够动态适应不断变化的数据。可以从.NET 中的System.Data.DataTable或ITableDataSource数据源以及Java 中的java.sql.ResultSet或ITableDataSource数据源过滤数据。
DsExcel 增加了使用F或Filter属性定义条件和切片过滤器的功能。过滤器语法可以添加到 Excel 模板文件的所需单元格中。条件过滤器的语法是F/Filter = (field1 > 1 and field2 = 2 or field3 <> 3),可增强数据操作和从多个表生成报告的功能。条件过滤器允许用户使用运算符和关键字(如 AND、OR、NOT 和 LIKE)来优化数据。
同时,切片过滤器通过指定从一个索引到另一个索引的范围来启用数据提取。可以使用以下语法将切片过滤器添加到 Excel 模板文件的所需单元格中:
F/过滤器 = [开始:停止:步骤]
还支持将条件过滤器和切片过滤器组合在一起,首先过滤具有条件过滤器的记录,然后根据应用的切片过滤器过滤记录:
F/Filter = [开始:停止:步骤](字段 1 > 1 且字段 2 = 2 或字段 3 <> 3)
以下示例展示了一个复杂的业务场景,通过在相应的单元格中应用两个过滤条件从两个表中提取数据。
将 Excel 模板与 JSON 数据源绑定
Excel 模板现在可以直接与 JSON 文件绑定。此外,上述过滤支持还适用于来自多个 JSON 数据源的数据。
异步 IMAGE 函数
Excel 中的 IMAGE 函数允许用户将图像直接插入单元格,增强电子表格的视觉吸引力,并使其更容易说明要点、添加徽标或将相关视觉效果与文本数据合并。在最新版本中,DsExcel 现在包含 IMAGE 函数,允许用户在单元格中添加图像。支持的图像类型与ImageType枚举中的图像类型相同 ,可以通过 URL 显示来自在线来源的图像。DsExcel 还添加了 Workbook.WebRequestHandler接口,允许用户自定义发送网络请求的方式。该接口允许异步处理 Web 请求,并提供一种将 GET 请求发送到指定 URI 的方法。
以下代码以编程方式在电子表格的单元格上设置图像。
// The user needs to set a custom web request handling class,
// and all network requests in GcExcel will use this class to send network requests.
Workbook.WebRequestHandler = new WebRequestHandler();
var workbook = new Workbook();
var sheet = workbook.ActiveSheet;
// Set image function
sheet.Range["A1"].Formula = "=IMAGE(\"https://support.content.office.net/en-us/media/926439a2-bc79-4b8b-9205-60892650e5d3.jpg\")";
// Calculate all formulas so the asynchronous image function will run.
workbook.Calculate();
// Block the current thread until all asynchronous functions have finished.
// If this method is not called, the exported file may contain #BUSY! error.
workbook.WaitForCalculationToFinish();
workbook.Save("D:\\res.pdf");
异步计算增强
在 v7 版本中,我们引入了 AsyncCustomFunction 类,使从此类派生的用户定义函数能够支持异步计算。在 v7.2 版本中,我们通过添加Workbook.WaitForCalculationToFinish()方法增强了此功能。此方法允许用户确保在继续执行依赖于计算结果的任何其他操作之前完成所有必要的计算。
SpreadJS 集成支持的多种功能
使过滤工作与 SpreadJS 类似的选项
DsExcel 添加了在过滤数据时将第一行数据视为数据而不是标题的选项。API 引入了新的Range.AutoFilter()重载,这将有助于使 DsExcel 过滤器行为类似于 SpreadJS。重载包括isFirstRowData参数,该参数指示选择区域的第一行是否参与过滤。此功能仅在SpreadJS中体现。
请参阅以下示例代码,使用AutoFilter 方法的isFirstRowData参数向包含数据的第一行添加过滤器:
// Create a new workbook.
var workbook = new Workbook();
IWorksheet worksheet = workbook.Worksheets[0];
// Add data to the range.
object[,] data = new object[,]{
{"Luigi", "New York", new DateTime(1998, 4, 7), "Blue", 67, 165},
{"Richard", "New York", new DateTime(1968, 6, 8), "Blue", 67, 165},
{"Nia", "New York", new DateTime(1972, 7, 3), "Brown", 62, 134},
{"Jared", "New York", new DateTime(1964, 3, 2), "Hazel", 72, 180},
{"Natalie", "Washington", new DateTime(1972, 8, 8), "Blue", 66, 163},
{"Damon", "Washington", new DateTime(1986, 2, 2), "Hazel", 76, 176},
{"Angela", "Washington", new DateTime(1993, 2, 15), "Brown", 68, 145}
};
worksheet.Range["A1:F7"].Value = data;
// Set column width.
worksheet.Range["A:F"].ColumnWidth = 15;
// Apply filter to first row.
worksheet.Range["A1:F7"].AutoFilter(true, 4, "<72");
// Create a file stream to export ssjson file.
FileStream outputStream = new FileStream("HeadersAsData.ssjson", FileMode.Create);
// Export the ssjson file.
workbook.ToJson(outputStream);
// Close the stream.
outputStream.Close();
新的 Sparkline 函数
DsExcel 现在支持通过相应的新功能添加线、柱和盈亏迷你图。迷你图是嵌入单元格的紧凑、简单的图表,用于可视化数据趋势。可以在 DsExcel 中使用以下语法添加迷你图:
=LINESPARKLINE(数据,数据方向,[日期轴数据],[日期轴方向],[设置])
=COLUMNSPARKLINE(数据,数据方向,[日期轴数据],[日期轴方向],[设置])
=WINLOSSSPARKLINE(数据,数据方向,[日期轴数据],[日期轴方向],[设置])
要了解有关每个参数的更多信息,请参阅文档。'setting' 参数用于设置各种 sparkline 设置。
注意:支持向电子表格添加迷你图是SpreadJS的一项功能,并且函数的结果将在 SpreadJS SSJSON I/O、SJS I/O、PDF、图像和 HTML 导出的文件中可见。
worksheet.Range["G3:G5"].Formula = "=COLUMNSPARKLINE(B3:F3,1,,,\"{showMarkers:TRUE}\")";
worksheet.Range["G3:G5"].Formula = "=LINESPARKLINE(B3:F3,1,,,\"{showMarkers:TRUE,lineWeight:1.5,markersColor:#7030a0}\")";
worksheet.Range["G3:G5"].Formula2 = "=WINLOSSSPARKLINE(B3:F3-300000,1,,,\"{showNegative:TRUE}\")";
下图显示了在 SpreadJS 中添加到电子表格的列迷你图。
查看演示来了解如何设置 Sparkline 函数。
SpreadJS 无损 I/O 支持的多种功能
随着 v7.2 版本的发布,我们增强了 DsExcel 与SpreadJS 17.1 版本的 .sjs 和 SSJSON 文件格式的兼容性(无损导入/导出)。SJS/SSJSON I/O 上已支持多项功能。查看受支持的 SpreadJS 功能的完整列表。
PDF 和图像导出中的基于像素的渲染
为了增强将电子表格内容导出为 PDF 和图像的功能并使其呈现类似于 SpreadJS,DsExcel 添加了WorkbookOptions类,该类提供属性 - PixelBasedColumnWidth。如果为 true,则工作簿将在将电子表格呈现为 PDF 和图像时使用基于像素的列宽。此外,此选项将使其他 API 行为(如自动调整列和 PDF 和图像渲染的其他结果)更类似于 SpreadJS。
以下代码在工作簿中将PixelBasedColumnWidth设置为true,并将工作簿导出为PDF,呈现类似于SpreadJS的结果。
// Create a new workbook with workbook options
WorkbookOptions workbookOptions = new WorkbookOptions();
// Enable pixel-based column width for the workbook
workbookOptions.PixelBasedColumnWidth = true;
var workbook = new Workbook(workbookOptions);
var fileStream = this.GetResourceStream("sjs\\Event budget.sjs");
workbook.Open(fileStream, OpenFileFormat.Sjs);
// Save to a pdf file
workbook.Save("SavePDFWithPixelBasedColumnWidth.pdf");
支持 FromSJSJson API 加载单个 JSON SJS 文件
DsExcel 在 Workbook 类和 IWorkbook 接口中都添加了FromSjsJson方法,允许用户加载从 .sjs 文件生成的 JSON 文件字符串或流。
//create a new workbook
var workbook = new GrapeCity.Documents.Excel.Workbook();
workbook.Open("source.sjs");
// Generate a JSON string containing the contents of .sjs file format.
SjsSaveOptions saveOptions = new SjsSaveOptions();
string sjsJson = workbook.ToSjsJson(saveOptions);
// Generates a workbook from the JSON string containing the contents of .sjs file format.
SjsOpenOptions openOptions = new SjsOpenOptions();
workbook.FromSjsJson(sjsJson, openOptions);
在导出为 PDF 时自定义边框样式
DsExcel 现在允许您使用PdfSaveOptions 类的新BorderOptions属性导出具有自定义边框样式的 PDF 文档。此属性使用 CustomBorderStyle 类的BorderWidth和Dashes属性以及BorderLineStyle枚举来定义边框宽度、虚线长度和线条样式。BorderWidth属性在导出 PDF 文档时设置边框宽度,而Dashes属性确定虚线中每段的长度。
以下代码自定义导出为PDF时的边框样式。
// Create a pdf file stream
FileStream outputStream = new FileStream("CustomBorder.pdf", FileMode.Create);
//create a new workbook
var workbook = new GrapeCity.Documents.Excel.Workbook();
var templateFile = this.GetResourceStream("xlsx\\CustomBorderStyle.xlsx");
workbook.Open(templateFile);
// Customizing the border style for exporting to PDF.
var pdfSaveOptions = new PdfSaveOptions();
var thinBorderSetting = new CustomBorderStyle { BorderWidth = 0.4 };
var middleBorderSetting = new CustomBorderStyle { BorderWidth = 1.5 };
var dashBorderSetting = new CustomBorderStyle { BorderWidth = 0.4, Dashes = new List<double> { 0.8, 0.8 } };
pdfSaveOptions.BorderOptions.Add(BorderLineStyle.Thin, thinBorderSetting);
pdfSaveOptions.BorderOptions.Add(BorderLineStyle.Medium, middleBorderSetting);
pdfSaveOptions.BorderOptions.Add(workbook.ActiveSheet.Range["B13"].Borders[BordersIndex.EdgeTop].LineStyle, dashBorderSetting);
//Save the workbook into pdf file.
workbook.Save(outputStream, pdfSaveOptions);
// Close the pdf stream
outputStream.Close();
文档解决方案数据查看器 (DsDataViewer)
高级搜索选项
使用新版本的 DsDataViewer,使用特定搜索词或模式搜索大型电子表格变得更加容易。搜索按钮现在默认位于左侧边栏中。您可以使用以下高级选项在电子表格中搜索单词:
- “查找内容”字段代表要搜索的字符串
- “在...内”选项允许您选择是否在当前工作表或所有工作表中进行搜索。
- “匹配大小写”决定是否忽略大小写。选中后,将执行区分大小写的搜索。
- “精确匹配”决定是否进行精确匹配。选中后,将搜索精确匹配。
- “使用通配符”决定是否使用?、*、~等通配符,勾选后可以使用通配符进行匹配。
以编程方式添加搜索面板的关键是“SearchPanel”。
为了让用户能够自定义侧边栏的显示,DsDataViewer 提供了以下 API:
- DsDataViewer.showSidebar(boolean): 是否显示侧边栏。
- DsDataViewer.sidebarLayout(string[]): 指示显示哪些侧边栏。
下面的代码使用这些选项来定制左侧边栏:
const viewer = new DsDataViewer("#root")
// Remove all sidebar menu.
viewer.sidebarLayout = ['']
// Hide sidebar.
viewer.showSidebar(false);
以编程方式从任意/选定单元格提取数据
现在,您可以以编程方式提取任何/选定单元格的未格式化/格式化值。DsDataViewer 提供了一个新 API,可帮助您快速提取特定数据,而无需浏览大型电子表格。然后可以合并提取的数据以进行进一步分析。
DsDataViewer 引入了以下新方法从单元格中提取数据:
- getSheet(index):根据索引获取指定工作表。
- getSheetFromName(name):获取具有指定名称的工作表。
- getActiveSheet():获取活动工作表。
下列新方法已添加到WorkSheet对象:
- getSelections():检索当前工作表中的选择。
- getText(row, column):根据所需的行和列索引检索单元格中的格式化文本。
- getValue(row, column): 根据所需的行和列索引从指定单元格中检索未格式化的数据。
以下视频展示了我们的在线示例,演示了从选定单元格中提取数据的代码。