如何在 .NET 中使用表格

如何在 .NET 中使用表格

本指南展示了如何以编程方式在 Aspose.Words FOSS 用于 .NET,使用的 Table, Row,以及 Cell 类位于 Aspose.Words.Tables 命名空间以及 DocumentBuilder。它涵盖了从头构建表格、在构建过程中格式化单元格和行、控制整表布局和 AutoFit、设置首选宽度、合并单元格,以及读取已加载文档中已有的表格。

分步指南

步骤 1:安装包

Aspose.Words FOSS for .NET 尚未发布 NuGet 包——请从源码构建库。克隆 https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git,然后使用 .NET SDK 在 Release 配置下构建 Aspose.Words.sln,并在项目中引用生成的 Aspose.Words 程序集。该库目标为 .NET Standard 2.0,因此可在 .NET Framework 4.6.2+ 和 .NET 6/8/10 上运行。


步骤 2:导入所需类

为核心文档类(Document、DocumentBuilder)添加 using Aspose.Words; 指令,并为本指南涉及的特定表格类添加 using Aspose.Words.Tables; 指令——Table、Row、Cell、CellFormat、RowFormat、PreferredWidth 以及相关枚举。


步骤 3:使用 DocumentBuilder 构建新表格

创建一个 Document 和一个绑定到它的 DocumentBuilder,然后调用 DocumentBuilder.StartTable() 在光标处开始表格。对于行中的每个单元格,调用 DocumentBuilder.InsertCell(),然后使用 DocumentBuilder.EndRow() 关闭该行。按照表格所需的行数重复此操作,并使用 DocumentBuilder.EndTable() 关闭整个表格。每个 StartTable() 都需要对应的 EndTable(),每行也需要对应的 EndRow(),否则构建器的内部状态——以及生成的文档树——会出现错误。


步骤 4:在构建过程中格式化单元格和行

在调用 InsertCell() 或 EndRow() 之前设置 DocumentBuilder.CellFormat 和 DocumentBuilder.RowFormat,以对构建器即将创建的单元格和行应用格式——这两个属性充当新内容的模板,而不是对已插入单元格的事后更改。CellFormat 暴露 Borders、Shading、Width、WrapText、FitText、HorizontalMerge、VerticalMerge、VerticalAlignment、PreferredWidth,以及四个填充属性(LeftPadding、RightPadding、TopPadding、BottomPadding),这些属性都可以通过 SetPaddings() 一次性设置。RowFormat 暴露 Borders、Height、HeightRule、AllowBreakAcrossPages 和 HeadingFormat。在为下一行或单元格设置新值之前,调用 CellFormat.ClearFormatting() 或 RowFormat.ClearFormatting() 将任一项重置为默认值。


步骤 5:设置全表布局和 AutoFit

表格创建后,直接在 Table 对象上设置布局属性:Alignment(TableAlignment)、Bidi、LeftIndent、PreferredWidth、Style、StyleIdentifier、StyleName、StyleOptions(TableStyleOptions)以及 TextWrapping。调用 Table.SetBorders() 可在整个表格上应用统一的边框样式、宽度和颜色,或使用 Table.SetBorder() 设置单侧边框;ClearBorders() 和 ClearShading() 可将其重置。Table.AutoFit(AutoFitBehavior) 根据所选行为调整表格及其单元格的大小——在任何结构性编辑后再次调用它,因为它仅在运行时刻反映表格的状态,而不是持续更新。


步骤 6:设置首选宽度和单元格宽度

使用静态工厂方法 PreferredWidth.FromPercent() 创建宽度值,以实现适应可用页面宽度的布局,或使用 PreferredWidth.FromPoints() 创建固定宽度;PreferredWidthType 会报告给定 PreferredWidth 所持有的值类型(Auto、Percent 或 Points)。将结果分配给 Table.PreferredWidth 以用于整个表格,或分配给 CellFormat.PreferredWidth 以用于单个单元格。


步骤 7:合并单元格

通过在应参与合并的单元格上设置 CellFormat.HorizontalMerge 或 CellFormat.VerticalMerge(两者均为 CellMerge)来标记单元格为已合并。如果单元格仅通过匹配宽度而看起来被合并,而未显式标记,则调用 Table.ConvertToHorizontallyMergedCells() 将该视觉排列转换为具有真实 CellMerge 状态的单元格。CellVerticalAlignment 控制单元格内内容的垂直对齐方式,独立于任何合并。


步骤 8:从现有文档读取表格

要处理已加载文档中的表格,请读取 Body.Tables(或任意其他 Story 上的 Tables 属性)——一个 TableCollection——而不是新建表格。Table.Rows 返回一个 RowCollection,Row.Cells 返回一个 CellCollection;这三种集合类型都支持 Add()、Insert()、Remove()、RemoveAt()、Contains() 和 IndexOf(),用于编程编辑。删除行或单元格后,调用 Table.EnsureMinimum()、Row.EnsureMinimum() 或 Cell.EnsureMinimum(),使节点保持 Word 所期望的最小有效结构——分别为一个空行、一个空单元格或一个空段落。

常见问题与解决方案

已保存的文档出现格式错误,或者在保存时发生错误 行或整个表格从未关闭。始终配对 DocumentBuilder.StartTable() 与最终的 EndTable(),并在每行结束时使用 EndRow() 在移动到下一行或结束表格之前。

新单元格不会继承我设置的格式 CellFormat and RowFormat 已在 DocumentBuilder 在受影响的单元格已插入之后被更改。设置 DocumentBuilder.CellFormat / RowFormat 在 InsertCell() or EndRow() 调用创建您想要格式化的内容。

表格在我编辑其内容后不会按我预期的方式调整大小 Table.AutoFit(AutoFitBehavior) 仅在调用时反映表格的结构。若进行任何结构性编辑——添加或删除行、单元格或内容——且需要重新调整布局,请再次调用。

看起来已合并的单元格在回读时仍表现为独立单元格。 这些单元格仅按宽度匹配,未标记为 CellMerge. 调用 Table.ConvertToHorizontallyMergedCells(),或设置 CellFormat.HorizontalMerge / VerticalMerge 显式地在应合并的单元格上。

删除行或单元格会使表格处于无效状态 Word 期望每个 Table, Row,并且 Cell 以保持最小的有效结构。以编程方式删除内容后,调用 EnsureMinimum() 在刚刚修改的节点上。

常见问题

如何从头创建表格,而不是编辑已有表格?

使用 DocumentBuilder:调用 StartTable(),然后对行中的每个单元格调用 InsertCell(),使用 EndRow() 结束该行,重复以添加更多行,最后使用 EndTable() 结束表格。

如何获取已加载文档中已有的表格?

读取感兴趣章节的 Body 上的 Tables 属性(一个 TableCollection),或在任何其他如页眉或页脚的 Story 上读取该属性。

如何将表格设置为页面宽度的百分比,而不是固定宽度?

分配 Table.PreferredWidth = PreferredWidth.FromPercent(value) 而不是 PreferredWidth.FromPoints(value)。

使用 SetBorders 和 SetBorder 设置边框有什么区别?

Table.SetBorders() 一次性为表格中的所有边框应用相同的线条样式、宽度和颜色;Table.SetBorder() 则设置单侧边框,允许不同侧使用不同的格式。

在重新使用单元格或行之前,如何重置其格式?

对单元格的 CellFormat 调用 CellFormat.ClearFormatting(),或对行的 RowFormat 调用 RowFormat.ClearFormatting()。

另请参阅

 中文