概览
Spreadsheet documents 是以表格形式(行和列)存放数据的文档,也称为 workbooks(工作簿)。电子表格文档的格式很多——Office Open XML(如 XLSX、XLSM 等)、Microsoft Excel 二进制文件格式(XLS、XLT)、OpenDocument 电子表格格式(ODS、FODS、OTS)、基于文本的分隔符格式(CSV、TSV 等)等等。这些统称为 Spreadsheet formats family(电子表格格式族)。GroupDocs.Viewer 几乎支持所有电子表格格式的导入,并可将其渲染(转换)为 HTML、PDF、PNG、JPEG。本文将说明如何实现以及可用的选项、何时以及为何使用它们。
基本用法
首先需要了解选项。公共 API 中有一个专门的类:SpreadsheetOptions,位于 GroupDocs.Viewer.Options 命名空间。该类专门用于调节电子表格格式族的渲染行为。它可以通过四种视图选项的 SpreadsheetOptions 属性进行访问:
- HtmlViewOptions.SpreadsheetOptions — 将电子表格渲染为 HTML 时使用,
- PdfViewOptions.SpreadsheetOptions — 将电子表格渲染为 PDF 时使用,
- PngViewOptions.SpreadsheetOptions — 将电子表格渲染为 PNG 时使用,
- JpgViewOptions.SpreadsheetOptions — 将电子表格渲染为 JPEG 时使用。
如果未显式指定,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)的形式呈现。某些电子表格格式只能包含单个工作表,例如所有基于文本的分隔符格式(CSV、TSV 等)。
默认情况下,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 的默认行为:仅当相邻单元格为空时,文本才会向其溢出;若相邻单元格已有内容,文本会被截断。
示例中单元格 B2 的长文本被截断,因为 C2 非空;而 C3 的长文本则溢出了 D2、E2(它们为空)。
Overlay
Overlay 表示更激进的方式:长文本无论相邻单元格是否有内容都会向右溢出,覆盖掉相邻单元格的原有数据。
如图所示,B2 的文本覆盖了 C2、D2、E2、F2,导致后者的原始内容被清除。
HideText
HideText 与 Overlay 相反:无论相邻单元格是否空闲,超出边界的文本都会被直接截断,不会出现溢出。
图中 C3 的文本被截断,即使 D3 及后续单元格是空的。
AutoFitColumn
AutoFitColumn 通过自动扩大所在列宽度来容纳文本。无论文本多长,列宽都会被调大,以完整显示字符串。
该方式在文本过长时可能导致页面极宽,出现难看的水平滚动条。
渲染隐藏的行和列
Excel 等程序允许隐藏特定的行或列。默认情况下,GroupDocs.Viewer 不会渲染这些隐藏的行列。可以通过将以下属性设为 true 来显示:
ViewOptions.SpreadsheetOptions.RenderHiddenRowsViewOptions.SpreadsheetOptions.RenderHiddenColumns
渲染隐藏的工作表
与隐藏行列类似,电子表格文件也可能包含隐藏的工作表。默认情况下,这些工作表不被渲染。可以使用 RenderHiddenPages(位于 BaseViewOptions 基类)并设为 true 来强制渲染。
跳过空行和空列
某些电子表格非常稀疏,包含大量空白的行/列。开启此功能后,空行和/或空列会被从渲染结果中剔除。对应的布尔属性为:
SpreadsheetOptions.SkipEmptyRowsSpreadsheetOptions.SkipEmptyColumns
图中可见两项均已启用。
渲染或隐藏单元格批注
工作表中的单元格可以包含批注。默认情况下,所有批注都会被渲染。若希望隐藏批注,可将 BaseViewOptions.RemoveComments 设为 true。该属性同样位于 BaseViewOptions 基类。
图示为使用默认选项将带批注的 XLSX 渲染为 PNG,E2 单元格的批注仍然可见。
在输出的 PDF 页面中设置工作表页边距
将工作表渲染为 PDF 时,可以控制页面边距(即内容与页面边缘的距离,单位为厘米)。提供了四个属性分别控制上、右、下、左四个方向的边距:
SpreadsheetOptions.TopMarginSpreadsheetOptions.RightMarginSpreadsheetOptions.BottomMarginSpreadsheetOptions.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);
}
渲染结果如下图所示:
结论
电子表格格式极其复杂,文档内容种类繁多、长度各异。很多情况下,单纯使用默认选项难以得到满意的渲染效果。因此 GroupDocs.Viewer 提供了如此丰富的属性集合,用户可以根据自身需求灵活调节渲染行为,达到理想的效果。
另请参阅
免费试用
您可以从 releases.groupdocs.com 下载 GroupDocs.Viewer for .NET 的免费试用版。也可以在 此处 获取临时许可证,免费体验全部功能和特性。