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

改进的模板语言,性能更佳

在我们最近的努力中,我们承担了重构 GcExcel 模板的任务,主要着重于提升性能和稳定性。我们的目标是满足更广泛的用户需求和使用场景,确保用户拥有流畅高效的体验。最近的改进包括:

  • 对于缺少的数据源,将视为Null
  • 启用固定布局功能,使其在分页和非分页模式下无缝运行
  • 增强模板处理功能,支持图片和形状
  • 提升了在处理具有合并单元格的模板时的性能
  • 确保从旧模板设计中无缝继续功能,而不引入任何破坏性变化

欢迎查看我们的演示以获得更佳的体验。

Help .NET| Help Java| Demo .NET| Demo Java

自定义排序顺序和多列排序

GcExcel 模板长期以来一直支持使用语法定义模板单元格中的排序方向来对模板数据进行排序。但实际上场景中,需要根据其他单元格的值对单元格进行排序,且进一步需求使用多个单元格值对数据进行排序的能力。为了满足这种需求,GcExcel 扩展了语法,使其能够同时包含多个排序条件,而不是使用不同的排序条件多次进行模板填充。

支持的多种情况包括:

  • 根据其他列的顺序对当前列进行排序
  • 根据多个其他列的顺序对当前列进行排序
  • 自定义排序顺序

以下示例中,将按日期(列C)升序排序列A中的数据,然后按销售额(列D)降序排序。

在下面的资源中详细阅读增强的排序语法和支持的场景。

Help .NET| Help Java| Demo .NET| Demo Java

取消执行中的 ProcessTemplate 方法

在某些情况下,由于数据量大或者对基本原因不明确,导致 ProcessTemplate 方法的执行时间延长,展示填充的数据会有延迟。因此,如果有一种方法可以中断 processTemplate 方法并恢复到未填充数据模板的初始状态,以便用户选择限制数据源的数量并重新处理模板将会很有用。

GcExcel 现在支持通过调用带有 CancellationToken 参数的 Workbook.ProcessTemplate(CancellationToken) 重载来中断 processTemplate 方法。您可以通过以下三种方式中断模板处理:

  • 使用 CancellationTokenSource.Cancel 立即请求取消
  • 使用 CancellationTokenSource.CancelAfter 在指定延迟时间后请求取消
  • 使用 CancellationTokenSource.Dispose (.NET) 或 close (Java) 释放资源

当取消成功时(ProcessTemplate 执行中且通过CancellationTokenSource请求取消),Workbook.ProcessTemplate 方法将抛出 OperationCanceledException(.NET System 类的情况)或 CancellationException(Java Platform SE 8 的情况)。

在处理异常时,workbook 对象处于一个中间状态(数据可能仅填充了一部分)。此时,需要决定是否继续使用该 workbook 对象。如果希望使用模板填充前的 workbook,则需要在模板填充前,对workbook进行备份,在操作取消后进行还原。 以下代码在当前线程中使用 workbook 并在另一个线程中取消:

                                
C#
using (CancellationTokenSource cancellation = new CancellationTokenSource())
{
    void cancelHandler(object sender, ConsoleCancelEventArgs e)
    {
        // Exit process gracefully
        e.Cancel = true;
        cancellation.Cancel();
    };
    Console.CancelKeyPress += cancelHandler;
    cancellation.CancelAfter(TimeSpan.FromSeconds(10));
    Console.WriteLine("Start ProcessTemplate.");
    try
    {
        workbook.ProcessTemplate(cancellation.Token);
        Console.WriteLine("ProcessTemplate finished.");
    }
    catch (OperationCanceledException ex) when (ex.CancellationToken == cancellation.Token)
    {
        Console.WriteLine("ProcessTemplate was canceled.");
    }
}
                                
                            

欢迎查看以下资源来了解更多关于该功能的内容。

Help .NET| Help Java| Demo .NET| Demo Java

CalculationMode 选项

此功能专门为 SpreadJS 用户设计,他们在后端使用 GcExcel 生成大量的 Excel 文件。有些情况下,用户希望避免自动计算以减少打开工作表所需的时间。此外,在某些场景中,用户只想导出特定的工作表而不是整个工作簿。值得注意的是,Excel 文件可能包含跨工作表的公式,用户希望在导出过程中这些公式保持未计算状态。因此,用户正在寻找一个选项来启用/禁用手动计算,以更好地控制这些方面。

为了解决这个问题,GcExcel 引入了 Workbook.Options.Formulas.CalculationMode 属性。该属性允许在工作表上设置公式的计算模式,从而在打开工作表时控制公式的计算。该属性支持以下枚举值:

  • Automatic:自动
  • Semiautomatic:除模拟运算表外,自动重算
  • Manual:手动

该属性在 Excel I/O、SpreadJS I/O 和 SSJSON I/O 中受支持。

以下代码演示了将计算模式更改为 Manual,其中在 MS Excel 中打开导出的 XLSX 文件时不会自动计算公式。

                                
C#
IWorksheet worksheet = workbook.Worksheets[0];
worksheet.Range["A1:F7"].Value = data;
worksheet.Range["A:F"].ColumnWidth = 15;

//add table.
worksheet.Tables.Add(worksheet.Range["A1:F7"], true);

//show totals
worksheet.Tables[0].ShowTotals = true;
worksheet.Tables[0].Columns[4].TotalsCalculation = TotalsCalculation.Average;
worksheet.Tables[0].Columns[5].TotalsCalculation = TotalsCalculation.Average;

var comment = worksheet.Range["F8"].AddComment("Please press F9 to calculate the formula.");
comment.Visible = true;

//set calculation mode to manual
workbook.Options.Formulas.CalculationMode = CalculationMode.Manual;
        
// Save to an excel file
workbook.Save("CalculationOptions.xlsx");
                                
                            

Help .NET| Help Java| Demo .NET| Demo Java

以流(stream)的方式为导出任务注册自定义字体 - 仅 GcExcel Java 支持

此前,GcExcel Java 提供了 Workbook.FontsFolderPath 接口,允许用户指定保存所需字体文件的目录。需要注意的是,FontsFolderPath 必须表示一个绝对磁盘路径。然而,某些环境存在限制,阻止用户直接在磁盘上存储字体。在这种情况下,用户只能提供字体流。例如,当用户将其应用程序部署为 Java 中的 war 包时,字体被打包在 war 包中。因此,在这些情况下,GcExcel 必须提供一个能够适应字体流的接口。

在 GcExcel 的 Workbook 类中,已经加入了 Workbook.FontProvider 字段,以便用户通过字体流提供字体,用于自适应、PDF 导出和图像导出等任务。用户可以实现 IFontProvider 接口及其方法, getFontFilePaths 和 getFont,来实现注册字体。

getFontFilePaths 方法用于检索所有字体文件路径。另一方面,getFont 方法负责返回与给定字体文件路径对应的字体流。当用户使用 FontProvider 类时,GcExcel 将专门在字体流中搜索字体路径。如果没有实现 FontProvider ,GcExcel 将默认搜索 FontsFolderPath 中的字体。

以下示例展示了如何通过字体流设置字体:

                                
Java
// Create a new workbook.
Workbook workbook = new Workbook();
IWorksheet sheet = workbook.getWorksheets().get(0);

// Set style of the font.
sheet.getRange("A1").setValue("Sheet1");
sheet.getRange("A1").getFont().setName("Arial");
sheet.getRange("A1").getFont().setColor(Color.GetRed());
sheet.getRange("A1").getInterior().setColor(Color.GetGreen());

// Implement FontProvider.
Workbook.FontProvider = new IFontProvider() {
    @Override
    public List getFontFilePaths() {
        return new ArrayList<>(Arrays.asList(
                "fonts\\arial.ttf",
                "fonts\\arialbd.ttf",
                "fonts\\ariali.ttf"
        ));
    }

    @Override
    public InputStream getFont(String fontFilePath) {
        return getClass().getClassLoader().getResourceAsStream(fontFilePath);
    }
};
// Save the workbook.
workbook.save("FontStreaming.pdf", SaveFileFormat.Pdf);
                                
                            

Help Java| Demo Java

在跨工作簿公式中支持表格引用

在大型和复杂的 Excel 文件中,通常公式会引用其他工作簿中的数据,无论是内部还是外部。传统的方法会通过复制的方式,将数据整理到同一个工作簿中。但一种更有效的方法是直接使用跨工作簿公式引用外部工作簿中的数据。因此为了增强该场景下的易用性,在 v7.1 版本中,GcExcel 支持在跨工作簿公式中使用表格引用。

                                
Plain Text
workbook.Worksheets[0].Range["B1"].Formula = "=SUM('[Sales.xlsx]'!Table1[Sales])";
                                
                            

Help .NET| Help Java

忽略范围内的错误

为了能让用户在导出Excel时,不显示单元格中左上角的绿色三角,GcExcel 在 IRange 接口中引入了 IgnoredError 属性以及 IgnoredErrorType 枚举,允许用户在 Excel 中有选择地忽略诸如无效的公式结果、以文本形式存储的数字、相邻单元格中不一致的公式等错误。

                                
C#
worksheet.Range["A8:F11"].IgnoredError = IgnoredErrorType.All;
                                
                            

Help .NET| Help Java| Demo .NET| Demo Java

在 Excel 文件中导出条形码为图片

在保存 Excel 文件时,您可以选择保留包含从 SpreadJS 或 GcExcel 生成的条形码。GcExcel 添加了 Workbook.ConvertBarcodeToPicture(ImageType) 方法,在保存为Excel之前,使用该方法可以将条形码转换为图像,并应用于所有工作表,以便在 Excel 文件中无缝存储,消除了出现 "#Ref" 值的情况。在没有显式指定 ImageType 参数的情况下,默认设置为 SVG 图像类型。

Help .NET| Help Java| Demo .NET| Demo Java

搜索带有标签的单元格

GcExcel 提供有 Tag 属性,该属性可与 SpreadJS 配合使用。该属性可以包含指定类型的数据并将其附加在单元格,行,列或者工作表上。此外,您可以使用 SSJSON 导入/导出带有简单数据的标签。在 v7.1 版本中,GcExcel 引入了 SpecialCellType.Tags 和 IRange.SpecialCells(SpecialCellType.Tags) 重载,便于对指定范围内带有标签的单元格进行识别。

以下代码用于查找带有标签的单元格并将它们设置为红色:

                                
C#
IRange allTagCells = worksheet.UsedRange.SpecialCells(SpecialCellType.Tags);
allTagCells.Font.Color = Color.Blue;

foreach (var area in allTagCells.Areas)
{
    for (int i = 0; i < area.Cells.Count; i++)
    {

        if (area.Cells[i] != null && area.Cells[i].Tag is string && int.Parse(area.Cells[i].Tag as string) % 10 == 0)
        {
            area.Cells[i].Interior.Color = Color.Red;
        }
    }
}
                                
                            

Help .NET| Help Java| Demo .NET| Demo Java

SpreadJS 兼容特性

GcExcel 整合了额外的 SpreadJS 特性,提升了与客户端端的 SpreadJS 产品的兼容性。需要强调的是,这些新特性仅与 SpreadJS 配合使用,不兼容 Microsoft Excel。

 

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

向 PDF 文档添加丰富的媒体

通过无缝地将音频和视频等丰富的媒体元素整合到 PDF 文档中,增强您的 PDF 文档。通过添加丰富的媒体,您可以提升用户参与度,并在 PDF 中创建动态、交互式内容。通过使用新的 RichMediaAnnotation 类,可以将多媒体支持以编程方式整合到您的 PDF 文档中。

其包含有以下功能:

1、嵌入多媒体内容:RichMedia 注释使得可以将包括音频、视频和动画在内的多媒体资产整合到 PDF 文件中。这可以增强演示文稿、教育材料或交互式表单等内容。
2、注释属性:RichMedia 注释具有定义多媒体内容如何呈现的属性。这些属性可能包括激活条件、可见性设置以及注释的外观。
3、激活和停用:激活条件确定多媒体内容何时开始或停止播放。例如,您可以设置当用户单击注释或包含剪辑的页面变为可见时播放内容。
4、呈现样式:RichMedia 注释支持两种呈现样式 - 嵌入式和窗口式。
5、控制导航:RichMedia 注释允许您控制导航选项设置为 True 或 False。

以下代码向 PDF 文档添加了一个 RichMediaAnnotation:

                                    
C#
GcPdfDocument doc = new GcPdfDocument();

var p = doc.NewPage();

// add video when page becomes visible
RichMediaAnnotation rma = new RichMediaAnnotation();
rma.SetVideo(GetFile(doc, "Wetlands.mp4"));
rma.PresentationStyle = RichMediaAnnotationPresentationStyle.Embedded;
rma.ActivationCondition = RichMediaAnnotationActivation.PageBecomesVisible;
rma.DeactivationCondition = RichMediaAnnotationDeactivation.PageBecomesInvisible;
rma.ShowNavigationPane = true;
rma.Page = p;
rma.Rect = new _Rect(10, 10, 300, 200);

 doc.Save("doc.pdf");
                                    
                                

下面的视频展示了一个使用GcPDF以编程方式添加RichMedia注释的PDF文件。

Help| Demo Basic| Demo - Insert Video in existing PDF

合并 PDF 时删除重复图片

现在,在合并 PDF 文档时可以移除重复的图片。GcPDF 在合并文档时提供了两个选项来移除重复的图片:

1、新的 GcPdfDocument.RemoveDuplicateImages() 方法用于移除重复图片
2、设置 MergeDocumentOptions.RemoveDuplicateImages 布尔属性为 true/false

以下是实现 GcPdfDocument.RemoveDuplicateImages() 方法的代码示例:

                                    
C#
static void MergeDoc(GcPdfDocument dstDoc, string fileName)
{
    GcPdfDocument d = new GcPdfDocument();
    var fs = new FileStream(fileName, FileMode.Open);
    d.Load(fs);
    dstDoc.MergeWithDocument(d);
}

static void Main(string[] args)
{
    GcPdfDocument doc = new GcPdfDocument();
    MergeDoc(doc, @"..\..\..\Individual_PDF1.pdf");
    MergeDoc(doc, @"..\..\..\Individual_PDF2.pdf");
    doc.RemoveDuplicateImages();
    doc.Save("doc.pdf");
}
                                    
                                

Help | Demo

在未旋转的矩形边界内绘制旋转文本

在未旋转的矩形边界内绘制旋转文本具有诸多优势,如更好地利用空间、布局一致性、在响应式设计中提高效率而不对设计造成重大干扰等。GcPDF 现在支持在未旋转的矩形边界内绘制旋转文本。通过 GcPDF,用户现在可以在 GcGraphics 类中使用 DrawRotatedText 和 MeasureRotatedText 方法来绘制在未旋转的矩形边界内旋转文本,类似于 MS Excel 在无边框单元格内绘制旋转文本。DrawRotatedText 有助于在指定矩形内以一定角度绘制文本,而 MeasureRotatedText 则计算文本的边界,以便准确放置文本。GcPDF 还允许用户使用 RotatedTextAlignment 枚举设置旋转文本的对齐方式,该枚举是上述方法中的一个参数。这些新方法适用于所有派生自 GcGraphics 的类,包括用于绘制 PDF、SVG 和位图的类。

以下代码使用以下参数在未旋转的矩形边界内以负角度绘制旋转文本:

旋转角度:-45°,文本对齐:Leading,旋转文本对齐:BottomLeft,是否垂直堆叠:False

                                    
C#
var doc = new GcPdfDocument();
var page = doc.Pages.Add();
var g = page.Graphics;
Draw(g, new RectangleF(10,10,100,100), angle: -45, false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading);

static void Draw(GcGraphics g, RectangleF rect, int angle, bool verticalStacking, RotatedTextAlignment rotatedAlign, TextAlignment textAlign)
 {
            // Draw a legend stating the current DrawRotatedText arguments' values:
            var tlLegend = g.CreateTextLayout();
            
            // The target rectangle for the DrawRotatedText call:
            var d = tlLegend.ContentHeight + 12;
            rect.Y += d;
            rect.Height -= d;
 
            // Text layout to draw:
            var tl = g.CreateTextLayout();
            tl.DefaultFormat.FontName = "Calibri";
            tl.DefaultFormat.FontSize = 12;
            tl.Append("The quick brown fox jumps over the lazy dog. ");
            tl.Append("The quick brown fox jumps over the lazy dog.");
            tl.TextAlignment = textAlign;
 
            // Outline the target rectangle in green:
            g.DrawRectangle(rect, new GCDRAW::Pen(Color.PaleGreen, 3));
            // Outline the actual text rectangle in red:
            var tlCopy = tl.Clone(true);
            var tlRect = g.MeasureRotatedText(tlCopy, angle, verticalStacking, rect, rotatedAlign);
            g.DrawRectangle(tlRect, new GCDRAW::Pen(Color.Red, 1));
 
            // Draw rotated text:
            g.DrawRotatedText(tl, angle, verticalStacking, rect, rotatedAlign);
}
                                    
                                

当将上面的代码保存为图像时,将生成以下输出:

在倾斜矩形内绘制文本

文本也可以在倾斜的矩形内旋转,类似于 MS Excel 在带有边框的单元格中绘制旋转文本。为了实现这种布局,GcPDF 还添加了特殊方法 - DrawSlantedText 方法,与 DrawRotatedText 方法非常相似,只是 SlantedTextAlignment 类型的最后一个参数指定了目标矩形内倾斜文本的对齐方式。这个枚举类型有六种模式:

BelowRotatedInside、BelowRotatedOutside、AboveRotatedInside、AboveRotatedOutside、CenterInsideOutside、CenterOutsideInside。

以下是如何使用 DrawSlantedText 方法在 PDF 文档中绘制倾斜矩形中的文本的基本代码(参见后面的图片)。SlantedTextAlignment.CenterInsideOutside 枚举选项使文本在以相同角度旋转的矩形边界中间显示。文本上方的边界向内旋转到矩形内部。

                                    
C#
static void RText(GcGraphics g, int angle, float x1, float y1, float x2, float y2, string s)
{
    var tl = g.CreateTextLayout();
    tl.TextAlignment = TextAlignment.Center;
    tl.Append(s, new TextFormat
    {
        FontName = "Segoe UI",
        FontSize = 27,
        FontSizeInGraphicUnits = true,
        FontBold = true
    });
    var rc = new RectangleF(x1, y1, x2 - x1, y2 - y1);
    g.DrawSlantedText(tl, angle, false, rc, SlantedTextAlignment.CenterInsideOutside);
}
                                    
                                

请查看我们的演示,了解如何在未旋转的矩形边界内绘制旋转文本,或在倾斜矩形中绘制文本,并使用 DrawRotatedText 和 SlantedTextAlignment 枚举的各种选项。

GcPDF

Help

 

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

在 Word 文档中添加在线视频

将在线视频整合到 Word 文档中增强了动态视觉元素,使复杂概念更加清晰。此外,它促进了多样化内容的创建,为各种目的提供互动和信息丰富的文档,从教育材料到商业报告。GcWord 提供了 WebVideoProperties 类,让用户可以自定义视频播放器的 HTML 内容并定义其尺寸。这有助于将在线视频无缝整合到 Word 文档中,实现直接在文档内播放视频,获得更丰富的多媒体体验。该类提供了 SetUrl 方法及其三个重载,允许用户指定视频的输入 URL、标题、高度和宽度。该方法在内部生成适当的 EmbeddedHTML 字符串,为用户定义这些参数提供了方便的方式,避免了直接编写可能较为复杂的部分。

以下代码向 Word 文档添加在线视频:

                                    
C#
var gcdoc = new GcWordDocument();
gcdoc.Load("wetlands.docx");
var pic = gcdoc.Body.Paragraphs[3].AddRun().AddPicture();
// Poster frame image.
byte[] imageBytes = File.ReadAllBytes("Wetlands.jpg");
pic.ImageData.SetImage(imageBytes, contentType: "image/jpeg");
pic.ImageData.WebVideoProperties.SetUrl("https://www.youtube.com/watch?v=k9UbKlBc3W4", "title", 60, 60);
                                    
                                

Help | Demo

历史版本

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