概覽

試算表文件 是以表格形式——在列與欄之間——儲存資料的文件。它們也被稱為 活頁簿。試算表文件有許多格式——Office Open XML(如 XLSX、XLSM 等)、Microsoft Excel 二進位檔案格式(XLS、XLT)、OpenDocument 試算表格式(ODS、FODS、OTS)、基於文字的分隔符格式(CSVTSV 等)……所有這些皆屬於所謂的 試算表格式家族。GroupDocs.Viewer 幾乎支援所有試算表格式的匯入,並允許將它們轉換為 HTML、PDF、PNG 與 JPEG。本文說明如何執行此操作、有哪些可用的選項,以及何時、為何應使用它們。

將在 Microsoft Excel 中開啟的活頁簿渲染為 HTML 格式

基本用法

首先必須談談選項。在公共 API 中有一個獨立的類別:SpreadsheetOptions,屬於 GroupDocs.Viewer.Options 命名空間。此類別專為調整試算表格式家族的渲染而設計。它可透過四種檢視選項的 SpreadsheetOptions 屬性取得:

如果未明確指定,SpreadsheetOptions 屬性會使用 SpreadsheetOptions 類別的預設隱含實例,本文稍後會說明。

總體而言,使用 GroupDocs.Viewer 渲染試算表文件非常簡單且與其他格式相同——建立一個 ViewOptions 實例、建立一個指向指定輸入試算表文件的 Viewer 實例,然後呼叫 Viewer.View(viewOptions) 方法。以下程式碼示範將單一輸入試算表檔渲染為四種輸出格式:HTML、PDF、PNG 與 JPEG。請注意,除了建立選項類別的實例外,並未進行任何與試算表相關的調校,因此所有試算表選項均採用預設值。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

HtmlViewOptions htmlOptions = HtmlViewOptions.ForEmbeddedResources("worksheet_{0}.html");
PdfViewOptions pdfOptions = new PdfViewOptions("Output_spreadsheet.pdf");
PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
JpgViewOptions jpegOptions = new JpgViewOptions("worksheet_{0}.jpeg");

using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(htmlOptions);
    viewer.View(pdfOptions);
    viewer.View(pngOptions);
    viewer.View(jpegOptions);
}

現在來談談 工作表。每個試算表至少有一個工作表。在大多數表格處理軟體(如 Microsoft Excel)中,工作表以 分頁(tab)的形式呈現。有些試算表格式僅支援單一工作表,例如所有基於文字的分隔符格式(CSVTSV 等)。

預設情況下,GroupDocs.Viewer 會渲染給定試算表中的所有工作表。但這個行為是可以變更的。Viewer.View() 方法有一個重載,接受第二個參數 Int32[] pageNumbers(頁碼集合)。使用此參數時,僅會渲染指定的頁(即工作表)。此參數為通用參數,適用於所有支援「頁」的格式;在試算表格式家族中,它具體代表要檢視的工作表編號。

請注意,頁碼與工作表編號皆採 1 為起始,而非 0。

下例示範如何將擁有 3 個工作表的試算表中,第 1 與第 3 個工作表渲染為 PNG。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(pngOptions, 1, 3);
}

將工作表分割成頁面

GroupDocs.Viewer 會將文件渲染為「頁」——此處的「頁」指的是相對較小的矩形區域,類似顯示螢幕或 A4 紙張的尺寸。另一方面,工作表本身可能非常龐大。例如,已淘汰的 XLS 格式支援「最多 256 欄與 65536 列」(https://superuser.com/questions/366468/what-is-the-maximum-allowed-rows-in-a-microsoft-excel-xls-or-xlsx),而較新的 XLSX(Office Open XML 活頁簿) 以及 Microsoft Excel 均支援「最多 16384 欄與 1048576 列」(https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3)。將工作表「適配」到頁面是使用 GroupDocs.Viewer 渲染試算表的關鍵步驟。為了將工作表適配到頁面,GroupDocs.Viewer 會執行 工作表分割——將工作表切成多個矩形區塊,並將每個區塊放置於單獨的頁面上。下面列出並說明 5 種不同的分割方式。

重要說明——所有這些分割方法皆以相同的方式指定——使用特定的靜態方法(工廠方法)建立 SpreadsheetOptions 類別的實例。

在單一頁面上渲染整個工作表

SpreadsheetOptions.ForOnePagePerSheet()

最簡單的做法——關閉分割,並調整頁面尺寸以容納整個工作表的全部內容。當已知工作表尺寸較小時,這是理想選擇。但若工作表非常龐大,則可能產生極差的結果。尤其在渲染為 HTML 時,最終的 HTML 檔案可能非常龐大,達數十甚至上百 MiB,在瀏覽器中檢視時會出現問題。若渲染為 JPEG,當寬度或高度超過 65535 像素的上限時,情況會更糟。因此請謹慎使用此模式。

在單一頁面上渲染工作表

依頁面分隔符分割工作表

SpreadsheetOptions.ForRenderingByPageBreaks()

Microsoft Excel 會根據紙張大小與頁面設定(如方向與邊距)自動插入頁面分隔符。切換至「檢視」標籤,進入「分頁預覽」模式,即可看到藍色分隔線將整個工作表區域切成矩形區塊,分別標示為「第 1 頁」、「第 2 頁」等。這正是 Microsoft Excel 建議的工作表分頁方式。

使用此方法,GroupDocs.Viewer 會遵循 Microsoft Excel 的頁面分隔符,將工作表依同樣方式分割。

值得說明的是,這個「依頁面分隔符分割」的選項是 BaseViewOptions.SpreadsheetOptions 屬性的預設設定。因此在建立檢視選項類別實例時,預設已選取 ForRenderingByPageBreaks()

僅渲染列印區域

SpreadsheetOptions.ForRenderingPrintArea()

除了頁面分隔符外,Microsoft Excel 還有「列印區域」的概念。列印區域實際上是一或多個工作表中的儲存格範圍,指定為列印對象;列印區域外的內容則不會被列印。若要將儲存格範圍加入列印區域,請切換至「頁面佈局」標籤,點擊「列印區域」按鈕後選取「設定列印區域」項目(見下圖)。若要再加入其他範圍,選取新範圍後點擊「列印區域」按鈕,接著選取「新增至列印區域」項目。在「分頁預覽」模式下即可看到列印區域內的所有儲存格範圍。

僅渲染列印區域

渲染列印區域並依頁面分隔符分割

SpreadsheetOptions.ForRenderingPrintAreaAndPageBreaks()

GroupDocs.Viewer 獨有的功能——同時結合列印區域與頁面分隔符。在此模式下,GroupDocs.Viewer 會同時考慮列印區域的所有儲存格範圍以及工作表中的頁面分隔符,並共同用於將工作表分割成多頁。

下圖中紅線代表列印區域,藍線則為頁面分隔符。

渲染列印區域並依頁面分隔符分割

依行與列手動分割工作表為多頁

SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage)
SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage, int countColumnsPerPage)

有時上述分割方式皆不符合需求,或是試算表格式本身不支援頁面分隔符與列印區域(例如文字型 CSV)。對於此類情況,GroupDocs.Viewer 允許手動指定每頁應顯示的行數與/或列數。簡言之,下圖說明了「僅依行分割」與「依行與列同時分割」的差異。

若使用 ForSplitSheetIntoPages 的第一個重載(僅一個參數),則啟用「僅依行分割」;若使用兩個參數的第二個重載,則啟用「行與列同時分割」。

依行與列手動分割工作表為多頁

調整其他選項

上述內容已足以完成基本的試算表渲染,但 GroupDocs.Viewer 還提供了許多非必須、卻能進一步微調渲染結果的選項。

其中一些選項以 SpreadsheetOptions 類別的屬性形式出現,該類別可透過檢視選項類別的 SpreadsheetOptions 屬性存取;另一些則位於所有四種渲染模式共用的抽象類別 ViewOptions 中。

渲染列與欄標題

當 MS Excel 或類似的表格處理程式開啟試算表文件時,會顯示列與欄的標題:欄以字母標示(A、B、C、AA、AB…),列則以數字標示(1、2、3…、1048576)。在渲染時,GroupDocs.Viewer 預設不顯示這些標題,因為它們屬於表格處理程式的介面,而非文件本身。但可透過布林屬性 RenderHeadings 進行切換。預設為 false(關閉),若設定為 true,則在輸出文件中會保留列與欄的標題,如下圖所示。

渲染列與欄標題

渲染工作表格線

此選項的概念與前者相似。預設情況下,GroupDocs.Viewer 不會顯示儲存格之間的格線,因為格線屬於表格處理程式的視覺呈現方式,而非文件內容本身。若將布林屬性 RenderGridLines 設為 true,即可模擬 MS Excel 的行為,格線將出現在輸出檔案中,如下圖所示。

渲染工作表格線

控制儲存格文字溢位

在某些情況下,儲存格內的文字過長,無法完整容納於儲存格邊界。要如何正確呈現這類文字?GroupDocs.Viewer 提供了特殊屬性 SpreadsheetOptions.TextOverflowMode 來解決此問題。TextOverflowMode 屬性屬於同名的列舉型別 TextOverflowMode,有四種可能的取值,說明如下。

OverlayIfNextIsEmpty

預設情況下,SpreadsheetOptions.TextOverflowModeOverlayIfNextIsEmpty,模仿 Microsoft Excel 的預設行為。此模式允許文字溢位到相鄰儲存格,前提是相鄰儲存格沒有任何資料;若相鄰儲存格已被填寫,則文字會被截斷。

OverlayIfNextIsEmpty 列舉值

上圖顯示以 OverlayIfNextIsEmpty 方式渲染的 HTML 檔案。注意儲存格 B2 內文字過長且被截斷,因為相鄰的 C2 已有內容。C3 儲存格的長文字則會溢位至 D2E2,因為這兩格為空。

Overlay

TextOverflowMode.Overlay 與前者稍有相似,但更為激進:無論相鄰儲存格是否已有內容,長文字都會溢位,並覆寫相鄰儲存格的資料。

Overlay 列舉值

上圖展示了此行為。B2 的長文字溢位至 C2D2E2F2,結果 C2F2 原有的內容被抹除。

HideText

TextOverflowMode.HideText 與前面的 Overlay 相反——不會溢位,直接截斷超出儲存格邊界的文字,無論相鄰儲存格是否有空位。

HideText 列舉值

上圖中 C3 儲存格即使相鄰 D3 為空,也會被無條件截斷。

AutoFitColumn

TextOverflowMode.AutoFitColumn 透過調整欄寬以容納文字的方式解決問題。無論儲存格內文字多長,該儲存格所在欄的寬度都會被自動放寬,以容納完整字串。

AutoFitColumn 列舉值

如上圖所示,文字長度會直接導致欄寬變寬。此方式在文字過長時可能導致頁面過寬,產生不友善的水平捲動條。

渲染隱藏的列與欄

Microsoft Excel 與其他表格處理程式允許隱藏特定的列或欄。預設情況下,GroupDocs.Viewer 不會渲染這些隱藏項目,但可透過設定以下屬性為 true 來改變行為:

  • ViewOptions.SpreadsheetOptions.RenderHiddenRows
  • ViewOptions.SpreadsheetOptions.RenderHiddenColumns

啟用後,隱藏的列與欄會出現在 HTML、PDF、PNG 或 JPEG 的輸出檔案中。

渲染隱藏的工作表

與前述的隱藏列/欄類似,試算表檔案也可能包含一或多個隱藏的工作表。預設 GroupDocs.Viewer 不會渲染這些工作表,但可透過將 RenderHiddenPages 設為 true 來顯示。需要注意的是,RenderHiddenPages 不屬於 SpreadsheetOptions,而是屬於所有檢視選項共用的抽象類別 BaseViewOptions

跳過空白的列與欄

有些試算表非常「稀疏」——大量空白儲存格會佔用過多空間。GroupDocs.Viewer 提供了跳過空白列與欄的功能,啟用後,空白列與/或欄會從最終的 HTML、PDF、PNG、JPEG 中排除。以下布林屬性負責此功能:

  • SpreadsheetOptions.SkipEmptyRows
  • SpreadsheetOptions.SkipEmptyColumns
跳過空白列與欄

上圖顯示同時啟用 SkipEmptyRowsSkipEmptyColumns 的效果。

渲染或隱藏儲存格註解

試算表中的儲存格可能帶有註解,預設情況下 GroupDocs.Viewer 會全部渲染。若希望不渲染註解,可將 BaseViewOptions.RemoveComments 設為 true。此屬性位於 BaseViewOptions 類別,而非 SpreadsheetOptions

渲染或隱藏儲存格註解

上圖示範了使用預設選項將帶註解的 XLSX 渲染為 PNG,結果 E2 儲存格的註解仍在輸出檔案中。

為 PDF 輸出頁面設定工作表邊距

在將工作表渲染為 PDF 時,可控制頁面的邊距(頁面邊緣至內容的距離,單位為公分)。共四個屬性分別對應上、右、下、左邊距:

  • SpreadsheetOptions.TopMargin
  • SpreadsheetOptions.RightMargin
  • SpreadsheetOptions.BottomMargin
  • SpreadsheetOptions.LeftMargin

預設情況下,這四個屬性皆為負值,表示使用 GroupDocs.Viewer 的預設邊距。若需自行設定,請以正值覆寫。需特別說明:頁面邊距僅在目標格式為 PDF 時生效。

以下程式碼示範如何建立 PdfViewOptions、設定四個邊距,並渲染文件:

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

PdfViewOptions pdfViewOptions = new PdfViewOptions("Output.pdf");
pdfViewOptions.SpreadsheetOptions = SpreadsheetOptions.ForOnePagePerSheet();
pdfViewOptions.SpreadsheetOptions.TopMargin = 2;
pdfViewOptions.SpreadsheetOptions.BottomMargin = 4;
pdfViewOptions.SpreadsheetOptions.LeftMargin = 8;
pdfViewOptions.SpreadsheetOptions.RightMargin = 0;

using (var viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(pdfViewOptions);
}

以下圖片示範了設定邊距後的結果:

在 PDF 輸出頁面設定工作表邊距

結論

試算表格式相當複雜,且文件的內容類型與長度多變。在許多情況下,僅使用預設選項無法將複雜的試算表正確渲染為目標格式,這就是為什麼 GroupDocs.Viewer 提供如此完整的屬性集合;透過這些屬性,使用者便能依需求微調渲染結果。

參見

取得免費試用

您可以從 releases.groupdocs.com 下載 GroupDocs.Viewer for .NET 的免費試用版。也可以前往 此處 取得臨時授權,以在無限制的情況下體驗全部功能與特性。