Работа со столбцами и строками
Чтобы лучше контролировать работу таблиц, узнайте, как манипулировать столбцами и строками.
Найдите индекс элемента таблицы
Управление столбцами, строками и ячейками осуществляется путем обращения к выбранному узлу документа по его индексу. Поиск индекса любого узла включает в себя сбор всех дочерних узлов типа element из родительского узла, а затем использование метода IndexOf для поиска индекса нужного узла в коллекции.
Найдите индекс таблицы в документе
Иногда вам может потребоваться внести изменения в определенную таблицу в документе. Для этого вы можете обратиться к таблице по ее индексу.
В следующем примере кода показано, как получить индекс таблицы в документе:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true); | |
NodeCollection allTables = doc.getChildNodes(NodeType.TABLE, true); | |
int tableIndex = allTables.indexOf(table); |
Поиск индекса строки в таблице
Аналогичным образом, вам может потребоваться внести изменения в определенную строку в выбранной таблице. Для этого вы также можете обратиться к строке по ее индексу.
В следующем примере кода показано, как получить индекс строки в таблице:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
int rowIndex = table.indexOf(table.getLastRow()); |
Поиск индекса ячейки в строке
Наконец, вам может потребоваться внести изменения в определенную ячейку, и вы также можете сделать это с помощью индекса ячейки.
В следующем примере кода показано, как получить индекс ячейки в строке:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
int cellIndex = row.indexOf(row.getCells().get(4)); |
Работа с колонками
В объектной модели документа Aspose.Words (DOM) узел Table состоит из Row узлов, а затем из Cell узлов. Таким образом, в объектной модели документа Document
из Aspose.Words, как и в документах Word, отсутствует понятие столбца.
По замыслу, строки таблицы в Microsoft Word и Aspose.Words полностью независимы, а основные свойства и операции содержатся только в строках и ячейках таблицы. Это дает таблицам возможность иметь некоторые интересные атрибуты:
- Каждая строка таблицы может содержать совершенно разное количество ячеек
- По вертикали ячейки каждой строки могут иметь разную ширину
- Можно объединять таблицы с разными форматами строк и количеством ячеек
Любые операции, выполняемые со столбцами, на самом деле являются “сокращениями”, которые выполняют операцию путем коллективного изменения ячеек строк таким образом, что это выглядит так, как будто они применяются к столбцам. То есть вы можете выполнять операции со столбцами, просто повторяя индекс одной и той же ячейки строки таблицы.
Следующий пример кода упрощает такие операции, демонстрируя класс facade, который собирает ячейки, составляющие “столбец” таблицы:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
/// <summary> | |
/// Represents a facade object for a column of a table in a Microsoft Word document. | |
/// </summary> | |
static class Column | |
{ | |
private Column(Table table, int columnIndex) { | |
if (table != null) { | |
mTable = table; | |
} else { | |
throw new IllegalArgumentException("table"); | |
} | |
mColumnIndex = columnIndex; | |
} | |
/// <summary> | |
/// Returns a new column facade from the table and supplied zero-based index. | |
/// </summary> | |
public static Column fromIndex(Table table, int columnIndex) | |
{ | |
return new Column(table, columnIndex); | |
} | |
private ArrayList<Cell> getCells() { | |
return getColumnCells(); | |
} | |
/// <summary> | |
/// Returns the index of the given cell in the column. | |
/// </summary> | |
public int indexOf(Cell cell) | |
{ | |
return getColumnCells().indexOf(cell); | |
} | |
/// <summary> | |
/// Inserts a brand new column before this column into the table. | |
/// </summary> | |
public Column insertColumnBefore() | |
{ | |
ArrayList<Cell> columnCells = getCells(); | |
if (columnCells.size() == 0) | |
throw new IllegalArgumentException("Column must not be empty"); | |
// Create a clone of this column. | |
for (Cell cell : columnCells) | |
cell.getParentRow().insertBefore(cell.deepClone(false), cell); | |
// This is the new column. | |
Column column = new Column(columnCells.get(0).getParentRow().getParentTable(), mColumnIndex); | |
// We want to make sure that the cells are all valid to work with (have at least one paragraph). | |
for (Cell cell : column.getCells()) | |
cell.ensureMinimum(); | |
// Increase the index which this column represents since there is now one extra column in front. | |
mColumnIndex++; | |
return column; | |
} | |
/// <summary> | |
/// Removes the column from the table. | |
/// </summary> | |
public void remove() | |
{ | |
for (Cell cell : getCells()) | |
cell.remove(); | |
} | |
/// <summary> | |
/// Returns the text of the column. | |
/// </summary> | |
public String toTxt() throws Exception | |
{ | |
StringBuilder builder = new StringBuilder(); | |
for (Cell cell : getCells()) | |
builder.append(cell.toString(SaveFormat.TEXT)); | |
return builder.toString(); | |
} | |
/// <summary> | |
/// Provides an up-to-date collection of cells which make up the column represented by this facade. | |
/// </summary> | |
private ArrayList<Cell> getColumnCells() | |
{ | |
ArrayList<Cell> columnCells = new ArrayList<Cell>(); | |
for (Row row : mTable.getRows()) | |
{ | |
Cell cell = row.getCells().get(mColumnIndex); | |
if (cell != null) | |
columnCells.add(cell); | |
} | |
return columnCells; | |
} | |
private int mColumnIndex; | |
private Table mTable; | |
} |
В следующем примере кода показано, как вставить пустой столбец в таблицу:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Tables.docx"); | |
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true); | |
Column column = Column.fromIndex(table, 0); | |
// Print the plain text of the column to the screen. | |
System.out.println(column.toTxt()); | |
// Create a new column to the left of this column. | |
// This is the same as using the "Insert Column Before" command in Microsoft Word. | |
Column newColumn = column.insertColumnBefore(); | |
for (Cell cell : newColumn.getColumnCells()) | |
cell.getFirstParagraph().appendChild(new Run(doc, "Column Text " + newColumn.indexOf(cell))); |
В следующем примере кода показано, как удалить столбец из таблицы в документе:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Tables.docx"); | |
Table table = (Table) doc.getChild(NodeType.TABLE, 1, true); | |
Column column = Column.fromIndex(table, 2); | |
column.remove(); |
Укажите строки в качестве строк заголовка
Вы можете выбрать повторение первой строки таблицы в качестве строки заголовка только на первой странице или на каждой странице, если таблица разделена на несколько частей. В Aspose.Words вы можете повторять строку заголовка на каждой странице, используя свойство HeadingFormat.
Вы также можете пометить несколько строк заголовка, если такие строки расположены одна за другой в начале таблицы. Для этого вам необходимо применить к этим строкам свойства HeadingFormat.
В следующем примере кода показано, как создать таблицу, содержащую строки заголовка, которые повторяются на последующих страницах:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.startTable(); | |
builder.getRowFormat().setHeadingFormat(true); | |
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); | |
builder.getCellFormat().setWidth(100.0); | |
builder.insertCell(); | |
builder.writeln("Heading row 1"); | |
builder.endRow(); | |
builder.insertCell(); | |
builder.writeln("Heading row 2"); | |
builder.endRow(); | |
builder.getCellFormat().setWidth(50.0); | |
builder.getParagraphFormat().clearFormatting(); | |
for (int i = 0; i < 50; i++) | |
{ | |
builder.insertCell(); | |
builder.getRowFormat().setHeadingFormat(false); | |
builder.write("Column 1 Text"); | |
builder.insertCell(); | |
builder.write("Column 2 Text"); | |
builder.endRow(); | |
} | |
doc.save(getArtifactsDir() + "WorkingWithTables.RepeatRowsOnSubsequentPages.docx"); |
Не допускайте разбивки таблиц и строк по страницам
В некоторых случаях содержимое таблицы не должно быть разделено по страницам. Например, если заголовок находится над таблицей, заголовок и таблица всегда должны располагаться вместе на одной странице, чтобы сохранить надлежащий внешний вид.
Есть два отдельных метода, которые полезны для достижения этой функциональности:
Allow row break across pages
, который применяется к строкам таблицыKeep with next
, который применяется к абзацам в ячейках таблицы
По умолчанию вышеуказанные свойства отключены.

Следите за тем, чтобы строка не разбивалась на страницы
Это предполагает ограничение разбиения содержимого внутри ячеек строки на страницы. В Microsoft Word это можно найти в свойствах таблицы как параметр “Разрешить разбиение строки на страницы”. В Aspose.Words это находится под объектом RowFormat из Row как свойство RowFormat.AllowBreakAcrossPages.

В следующем примере кода показано, как отключить разбиение строк по страницам для каждой строки таблицы:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Table spanning two pages.docx"); | |
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true); | |
// Disable breaking across pages for all rows in the table. | |
for (Row row : (Iterable<Row>) table.getRows()) | |
row.getRowFormat().setAllowBreakAcrossPages(false); | |
doc.save(getArtifactsDir() + "WorkingWithTables.RowFormatDisableBreakAcrossPages.docx"); |
Следите за тем, чтобы таблица не разбивалась на страницы
Чтобы таблица не разбивалась на страницы, нам нужно указать, что мы хотим, чтобы содержимое, содержащееся в таблице, оставалось единым.
Для этого в Aspose.Words используется метод, который позволяет пользователям выбирать таблицу и устанавливать для параметра KeepWithNext значение true для каждого абзаца в ячейках таблицы. Исключением является последний абзац в таблице, для которого должно быть установлено значение false.

В следующем примере кода показано, как настроить таблицу так, чтобы она оставалась вместе на одной странице:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Table spanning two pages.docx"); | |
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true); | |
// We need to enable KeepWithNext for every paragraph in the table to keep it from breaking across a page, | |
// except for the last paragraphs in the last row of the table. | |
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true)) | |
{ | |
cell.ensureMinimum(); | |
for (Paragraph para : (Iterable<Paragraph>) cell.getParagraphs()) | |
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell())) | |
para.getParagraphFormat().setKeepWithNext(true); | |
} | |
doc.save(getArtifactsDir() + "WorkingWithTables.KeepTableTogether.docx"); |