掘金 后端 ( ) • 2024-04-28 14:36

系列文章:

《创新工具:2024年开发者必备的一款表格控件》

前言

在现代工作环境中,信息的处理和管理是至关重要的。表格是一种常见的数据呈现和整理工具,被广泛应用于各行各业。然而,随着技术的不断发展,市场对表格控件的需求也越来越高。随着工作效率的重要性日益凸显,一款高效的表格控件成为了开发者们的首选,因此本文小编将从葡萄城公司的服务端表格组件GrapeCity Documents for Excel (以下简称GcExcel)的视角出发,为大家介绍如何充分利用这一控件来提升开发效率和用户体验。

产品介绍

GrapeCity Documents for Excel (简称:GcExcel)是一款基于 .NET 平台和 Java 平台的支持批量创建、编辑、打印、导入/导出Excel文件的服务端表格组件,能够高性能处理和高度兼容 Excel。GcExcel 可助您快速高效地处理 Java 平台中各类 Excel 表格业务需求,从而提高您的开发效率和产品质量,实现更高的商业价值。

GcExcel 原生支持多种格式的文件生成(如PDF、EXCEL、HTML、CSV及图片格式等),无需依赖第三方工具即可轻松满足批量生成的需求。其内置类 Excel 的样式和打印设置,完美应对多样的打印导出需求。同时,条件格式、多种图表类型、数据透视表、迷你图等多样的数据展示功能,能够满足各种报表展示要求。通过二次开发和扩展,您还能利用 GcExcel 实现 PDF 的异步导出和进度追踪,进一步拓展系统应用能力,为数据导出需求提供更高效、更多样化的选择。

GcExcel 可与纯前端表格控件 SpreadJS 前后端兼容,为您开发的应用程序提供在线文档的前后端数据同步、在线填报与服务端批量导出与打印,以及类 Excel 报表模板设计与服务端高性能处理等一整套类 Excel 全栈解决方案。

产品特性介绍:

1. 以流(stream)的方式为导出任务注册自定义字体

此前,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<String> 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

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

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

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

Demo .NET | Demo Java

3. 忽略范围内的错误

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

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

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

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

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

支持的多种情况包括:

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

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

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

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

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

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

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

服务端 PDF 组件

1. 向 PDF 文档添加丰富的媒体

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

其包含有以下功能:

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

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

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

2. 合并 PDF 时删除重复图片

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

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

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

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

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

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

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

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

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);
}

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

4. 在倾斜矩形内绘制文本

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

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

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);
}

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

Help