Как работать с таблицами в .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, затем соберите Aspose.Words.sln в конфигурации Release с помощью SDK .NET и подключите полученную сборку Aspose.Words к вашему проекту. Библиотека нацелена на .NET Standard 2.0, поэтому она работает на .NET Framework 4.6.2+ и .NET 6/8/10.


Шаг 2: Импортируйте необходимые классы

Добавьте директиву using Aspose.Words; для основных классов документа (Document, DocumentBuilder) и директиву 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: Форматировать ячейки и строки по мере построения

Установите DocumentBuilder.CellFormat и DocumentBuilder.RowFormat перед вызовом InsertCell() или EndRow(), чтобы применить форматирование к ячейкам и строкам, которые построитель собирается создать — эти два свойства работают как шаблон для нового содержимого, а не как ретроспективное изменение уже вставленных ячеек. 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 сообщает, какого типа значение (Auto, Percent или Points) содержит данный PreferredWidth. Присвойте результат либо Table.PreferredWidth для всей таблицы, либо CellFormat.PreferredWidth для одной ячейки.


Шаг 7: Объединить ячейки

Отметьте ячейки как объединённые, установив CellFormat.HorizontalMerge или CellFormat.VerticalMerge (оба вводятся как CellMerge) на ячейках, которые должны участвовать в объединении. Если ячейки выглядели объединёнными только за счёт совпадения их ширины, а не были явно помечены, вызовите Table.ConvertToHorizontallyMergedCells(), чтобы преобразовать эту визуальную компоновку в ячейки с реальным состоянием CellMerge. CellVerticalAlignment управляет вертикальным выравниванием содержимого в ячейке, независимо от любого объединения.


Шаг 8: Читать таблицы из существующего документа

Чтобы работать с таблицами, уже присутствующими в загруженном документе, читайте Body.Tables (или свойство Tables любого другого Story) — это 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() для закрытия таблицы.

Как получить таблицы, уже существующие в загруженном документе?

Прочитайте свойство Tables (это TableCollection) у Body раздела, который вас интересует, или у любого другого Story, например, в заголовке или нижнем колонтитуле.

Как задать таблице ширину в процентах от ширины страницы вместо фиксированной ширины?

Назначьте Table.PreferredWidth = PreferredWidth.FromPercent(value), а не PreferredWidth.FromPoints(value).

В чём разница между установкой границ с помощью SetBorders и SetBorder?

Table.SetBorders() применяет один стиль линии, ширину и цвет ко всем границам таблицы одновременно; Table.SetBorder() задаёт отдельную сторону, позволяя разным сторонам иметь разное форматирование.

Как сбросить форматирование ячейки или строки перед их повторным использованием?

Вызовите CellFormat.ClearFormatting() для CellFormat ячейки, либо RowFormat.ClearFormatting() для RowFormat строки.

См. также:

 Русский