Как работать с таблицами в .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 строки.