創新工具:2024年開發者必備的一款表格控件(二)

系列文章:

《創新工具: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章