概览

Spreadsheet documents 是以表格形式(行和列)存放数据的文档,也称为 workbooks(工作簿)。电子表格文档的格式很多——Office Open XML(如 XLSX、XLSM 等)、Microsoft Excel 二进制文件格式(XLS、XLT)、OpenDocument 电子表格格式(ODS、FODS、OTS)、基于文本的分隔符格式(CSVTSV 等)等等。这些统称为 Spreadsheet formats family(电子表格格式族)。GroupDocs.Viewer 几乎支持所有电子表格格式的导入,并可将其渲染(转换)为 HTML、PDF、PNG、JPEG。本文将说明如何实现以及可用的选项、何时以及为何使用它们。

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

下面来谈谈 工作表(worksheets)。每个电子表格至少包含一个工作表。在大多数表格处理软件(如 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 行,而更新的 XLSX (Office Open XML Workbook) 以及 Microsoft Excel 本身则支持最高 16384 列、1048576 行。“将工作表适配到页面”是使用 GroupDocs.Viewer 渲染电子表格的关键环节。为实现此目的,GroupDocs.Viewer 执行 工作表拆分——即将工作表划分为多个矩形块,每块放置在单独的页面上。下面列出并说明了 5 种不同的拆分方式。

需要说明的是,这些拆分方式均通过相同的方式指定——调用对应的 静态工厂方法来创建一个 SpreadsheetOptions 实例。

将整个工作表渲染在单页上

SpreadsheetOptions.ForOnePagePerSheet()

这是最简单的方式——关闭拆分功能,并调整页面尺寸以容纳完整工作表的内容。当已知工作表体积较小时可使用此选项。但如果工作表非常大,可能导致严重问题。例如,在渲染为 HTML 时,生成的文档体积可能达到数十甚至数百 MiB,在浏览器中打开会非常吃力。渲染为 JPEG 时,如果宽度或高度超过 65535 像素的上限,甚至会出现错误。因此请谨慎使用此模式。

将工作表渲染在单页上

按分页符拆分工作表

SpreadsheetOptions.ForRenderingByPageBreaks()

Microsoft Excel 会根据纸张大小、方向、页边距等设置自动插入分页符。切换到 “视图” 选项卡并进入 “分页预览” 模式时,可看到蓝色线条将工作表划分为矩形块,每块标记为 “Page 1”、 “Page 2” 等。这就是 Excel “建议”的拆分方式。

使用此方法,GroupDocs.Viewer 会遵循 Excel 的分页符进行拆分。

需要说明的是,按分页符拆分BaseViewOptions.SpreadsheetOptions 的默认选项。因此在创建视图选项实例时,默认已选中 ForRenderingByPageBreaks()

仅渲染打印区域

SpreadsheetOptions.ForRenderingPrintArea()

除了分页符,Excel 还有 “打印区域” 的概念。打印区域是工作表中一个或多个用于打印的单元格范围,位于打印区域之外的内容将不被打印。要将某个范围加入打印区域,可在 “页面布局” 选项卡中点击 “打印区域” → “设置打印区域”。若要向已有打印区域添加新范围,先选中新范围,再点击 “打印区域” → “添加到打印区域”。在 “分页预览” 模式下,可看到所有打印区域的范围。

仅渲染打印区域

渲染打印区域并按分页符拆分

SpreadsheetOptions.ForRenderingPrintAreaAndPageBreaks()

GroupDocs.Viewer 提供了一个独特的功能:在同一模式下兼顾打印区域和分页符。即同时考虑打印区域的所有单元格范围以及分页符,对工作表进行拆分。

下图中红线表示打印区域,蓝线表示分页符。

渲染打印区域并按分页符拆分

手动按行/列拆分工作表为页面

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

有时上述拆分方式均不适用,或电子表格格式本身不支持分页符和打印区域(如基于文本的 CSV)。此时可以手动指定每页应包含的行数或列数。下面的截图展示了仅按行拆分与按行+列拆分的区别。

如果使用 ForSplitSheetIntoPages 的第一个重载(单参数),则仅按行拆分;使用第二个重载(双参数)则按行+列拆分。

手动按行和列拆分工作表为页面

调整其他选项

上述内容已经足以完成电子表格的基本渲染,但 GroupDocs.Viewer 还提供了许多非必需的附加选项,帮助用户进一步微调渲染结果。

这些选项有的以 SpreadsheetOptions 类的属性形式出现(通过视图选项的 SpreadsheetOptions 属性访问),有的则位于所有视图选项共享的抽象基类 ViewOptions 中。

渲染行列标题

打开电子表格时,Excel 等表格处理程序会在左侧显示行号、顶部显示列字母(A、B、C、AA、AB …)。默认情况下,GroupDocs.Viewer 不会渲染这些标题,因为它们属于界面元素而非文档本身。可以通过布尔属性 RenderHeadings 来开启。默认值为 false;设为 true 后,行列标题将出现在输出文档中,如下图所示。

渲染行列标题

渲染单元格网格线

此选项的概念类似。默认情况下,GroupDocs.Viewer 不显示单元格之间的网格线,因为网格线同样是表格处理程序的 UI 组成部分。使用布尔属性 RenderGridLines 并设为 true,即可在输出文档中看到网格线。

渲染工作表网格线

控制单元格文本溢出

当单元格内的文本长度超出单元格边界时,需要决定如何显示。SpreadsheetOptions 提供了属性 TextOverflowMode 来处理。该属性的类型同名为 TextOverflowMode,是一个包含 4 个枚举值的枚举,含义如下。

OverlayIfNextIsEmpty

默认值为 OverlayIfNextIsEmpty,模拟 Excel 的默认行为:仅当相邻单元格为空时,文本才会向其溢出;若相邻单元格已有内容,文本会被截断。

OverlayIfNextIsEmpty 枚举值

示例中单元格 B2 的长文本被截断,因为 C2 非空;而 C3 的长文本则溢出了 D2E2(它们为空)。

Overlay

Overlay 表示更激进的方式:长文本无论相邻单元格是否有内容都会向右溢出,覆盖掉相邻单元格的原有数据。

Overlay 枚举值

如图所示,B2 的文本覆盖了 C2、D2、E2、F2,导致后者的原始内容被清除。

HideText

HideTextOverlay 相反:无论相邻单元格是否空闲,超出边界的文本都会被直接截断,不会出现溢出。

HideText 枚举值

图中 C3 的文本被截断,即使 D3 及后续单元格是空的。

AutoFitColumn

AutoFitColumn 通过自动扩大所在列宽度来容纳文本。无论文本多长,列宽都会被调大,以完整显示字符串。

AutoFitColumn 枚举值

该方式在文本过长时可能导致页面极宽,出现难看的水平滚动条。

渲染隐藏的行和列

Excel 等程序允许隐藏特定的行或列。默认情况下,GroupDocs.Viewer 不会渲染这些隐藏的行列。可以通过将以下属性设为 true 来显示:

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

渲染隐藏的工作表

与隐藏行列类似,电子表格文件也可能包含隐藏的工作表。默认情况下,这些工作表不被渲染。可以使用 RenderHiddenPages(位于 BaseViewOptions 基类)并设为 true 来强制渲染。

跳过空行和空列

某些电子表格非常稀疏,包含大量空白的行/列。开启此功能后,空行和/或空列会被从渲染结果中剔除。对应的布尔属性为:

  • SpreadsheetOptions.SkipEmptyRows
  • SpreadsheetOptions.SkipEmptyColumns
跳过空行和空列

图中可见两项均已启用。

渲染或隐藏单元格批注

工作表中的单元格可以包含批注。默认情况下,所有批注都会被渲染。若希望隐藏批注,可将 BaseViewOptions.RemoveComments 设为 true。该属性同样位于 BaseViewOptions 基类。

渲染或隐藏单元格批注

图示为使用默认选项将带批注的 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 的免费试用版。也可以在 此处 获取临时许可证,免费体验全部功能和特性。