java.lang.ObjectNode
CompositeNode
com.aspose.words.Cell
public class Cell
To learn more, visit the Working with Tables documentation article. A minimal valid cell needs to have at least one Example: Example: Example:
Document doc = new Document();
Table table = new Table(doc);
doc.getFirstSection().getBody().appendChild(table);
// Tables contain rows, which contain cells, which may have paragraphs
// with typical elements such as runs, shapes, and even other tables.
// Calling the "EnsureMinimum" method on a table will ensure that
// the table has at least one row, cell, and paragraph.
Row firstRow = new Row(doc);
table.appendChild(firstRow);
Cell firstCell = new Cell(doc);
firstRow.appendChild(firstCell);
Paragraph paragraph = new Paragraph(doc);
firstCell.appendChild(paragraph);
// Add text to the first cell in the first row of the table.
Run run = new Run(doc, "Hello world!");
paragraph.appendChild(run);
doc.save(getArtifactsDir() + "Table.CreateTable.docx");
Document doc = new Document(getMyDir() + "Tables.docx");
TableCollection tables = doc.getFirstSection().getBody().getTables();
Assert.assertEquals(2, tables.toArray().length);
for (int i = 0; i < tables.getCount(); i++) {
System.out.println(MessageFormat.format("Start of Table {0}", i));
RowCollection rows = tables.get(i).getRows();
for (int j = 0; j < rows.getCount(); j++) {
System.out.println(MessageFormat.format("\tStart of Row {0}", j));
CellCollection cells = rows.get(j).getCells();
for (int k = 0; k < cells.getCount(); k++) {
String cellText = cells.get(k).toString(SaveFormat.TEXT).trim();
System.out.println(MessageFormat.format("\t\tContents of Cell:{0} = \"{1}\"", k, cellText));
}
System.out.println(MessageFormat.format("\tEnd of Row {0}", j));
}
System.out.println(MessageFormat.format("End of Table {0}\n", i));
}
public void createNestedTable() throws Exception {
Document doc = new Document();
// Create the outer table with three rows and four columns, and then add it to the document.
Table outerTable = createTable(doc, 3, 4, "Outer Table");
doc.getFirstSection().getBody().appendChild(outerTable);
// Create another table with two rows and two columns and then insert it into the first table's first cell.
Table innerTable = createTable(doc, 2, 2, "Inner Table");
outerTable.getFirstRow().getFirstCell().appendChild(innerTable);
doc.save(getArtifactsDir() + "Table.CreateNestedTable.docx");
}
// Creates a new table in the document with the given dimensions and text in each cell.
private Table createTable(final Document doc, final int rowCount, final int cellCount, final String cellText) throws Exception {
Table table = new Table(doc);
for (int rowId = 1; rowId <= rowCount; rowId++) {
Row row = new Row(doc);
table.appendChild(row);
for (int cellId = 1; cellId <= cellCount; cellId++) {
Cell cell = new Cell(doc);
cell.appendChild(new Paragraph(doc));
cell.getFirstParagraph().appendChild(new Run(doc, cellText));
row.appendChild(cell);
}
}
// You can use the "Title" and "Description" properties to add a title and description respectively to your table.
// The table must have at least one row before we can use these properties.
// These properties are meaningful for ISO / IEC 29500 compliant .docx documents (see the OoxmlCompliance class).
// If we save the document to pre-ISO/IEC 29500 formats, Microsoft Word ignores these properties.
table.setTitle("Aspose table title");
table.setDescription("Aspose table description");
return table;
}
| Constructor Summary |
|---|
Cell(DocumentBase doc)
Initializes a new instance of the |
| Property Getters/Setters Summary | ||
|---|---|---|
CellFormat | getCellFormat() | |
| Provides access to the formatting properties of the cell. | ||
int | getCount() | → inherited from CompositeNode |
| Gets the number of immediate children of this node. | ||
int | getCustomNodeId() | → inherited from Node |
void | setCustomNodeId(int value) | |
| Specifies custom node identifier. | ||
DocumentBase | getDocument() | → inherited from Node |
| Gets the document to which this node belongs. | ||
Node | getFirstChild() | → inherited from CompositeNode |
| Gets the first child of the node. | ||
Paragraph | getFirstParagraph() | |
| Gets the first paragraph among the immediate children. | ||
boolean | hasChildNodes() | → inherited from CompositeNode |
Returns true if this node has any child nodes.
|
||
boolean | isComposite() | → inherited from CompositeNode |
Returns true as this node can have child nodes.
|
||
boolean | isFirstCell() | |
| True if this is the first cell inside a row; false otherwise. | ||
boolean | isLastCell() | |
| True if this is the last cell inside a row; false otherwise. | ||
Node | getLastChild() | → inherited from CompositeNode |
| Gets the last child of the node. | ||
Paragraph | getLastParagraph() | |
| Gets the last paragraph among the immediate children. | ||
Cell | getNextCell() | |
|
Gets the next |
||
Node | getNextSibling() | → inherited from Node |
| Gets the node immediately following this node. | ||
int | getNodeType() | |
|
Returns |
||
ParagraphCollection | getParagraphs() | |
| Gets a collection of paragraphs that are immediate children of the cell. | ||
CompositeNode | getParentNode() | → inherited from Node |
| Gets the immediate parent of this node. | ||
Row | getParentRow() | |
| Returns the parent row of the cell. | ||
Cell | getPreviousCell() | |
|
Gets the previous |
||
Node | getPreviousSibling() | → inherited from Node |
| Gets the node immediately preceding this node. | ||
Range | getRange() | → inherited from Node |
|
Returns a |
||
TableCollection | getTables() | |
| Gets a collection of tables that are immediate children of the cell. | ||
| Method Summary | ||
|---|---|---|
boolean | accept(DocumentVisitor visitor) | |
| Accepts a visitor. | ||
int | acceptEnd(DocumentVisitor visitor) | |
| Accepts a visitor for visiting the end of the cell. | ||
int | acceptStart(DocumentVisitor visitor) | |
| Accepts a visitor for visiting the start of the cell. | ||
Node | deepClone(boolean isCloneChildren) | → inherited from Node |
| Creates a duplicate of the node. | ||
void | ensureMinimum() | |
| If the last child is not a paragraph, creates and appends one empty paragraph. | ||
CompositeNode | getAncestor(int ancestorType) | → inherited from Node |
|
Gets the first ancestor of the specified |
||
CompositeNode | getAncestor(java.lang.Class ancestorType) | → inherited from Node |
| Gets the first ancestor of the specified object type. | ||
Node | getChild(int nodeType, int index, boolean isDeep) | → inherited from CompositeNode |
| Returns an Nth child node that matches the specified type. | ||
NodeCollection | getChildNodes(int nodeType, boolean isDeep) | → inherited from CompositeNode |
| Returns a live collection of child nodes that match the specified type. | ||
java.lang.String | getText() | → inherited from CompositeNode |
| Gets the text of this node and of all its children. | ||
int | indexOf(Node child) | → inherited from CompositeNode |
| Returns the index of the specified child node in the child node array. | ||
java.util.Iterator<Node> | iterator() | → inherited from CompositeNode |
| Provides support for the for each style iteration over the child nodes of this node. | ||
Node | nextPreOrder(Node rootNode) | → inherited from Node |
| Gets next node according to the pre-order tree traversal algorithm. | ||
Node | previousPreOrder(Node rootNode) | → inherited from Node |
| Gets the previous node according to the pre-order tree traversal algorithm. | ||
void | remove() | → inherited from Node |
| Removes itself from the parent. | ||
void | removeAllChildren() | → inherited from CompositeNode |
| Removes all the child nodes of the current node. | ||
void | removeSmartTags() | → inherited from CompositeNode |
|
Removes all |
||
NodeList | selectNodes(java.lang.String xpath) | → inherited from CompositeNode |
| Selects a list of nodes matching the XPath expression. | ||
Node | selectSingleNode(java.lang.String xpath) | → inherited from CompositeNode |
|
Selects the first |
||
java.lang.String | toString(SaveOptions saveOptions) | → inherited from Node |
| Exports the content of the node into a string using the specified save options. | ||
java.lang.String | toString(int saveFormat) | → inherited from Node |
| Exports the content of the node into a string in the specified format. | ||
| Constructor Detail |
|---|
public Cell(DocumentBase doc)
When null.
To append
doc - The owner document.Example:
Shows how to build a nested table without using a document builder.
public void createNestedTable() throws Exception {
Document doc = new Document();
// Create the outer table with three rows and four columns, and then add it to the document.
Table outerTable = createTable(doc, 3, 4, "Outer Table");
doc.getFirstSection().getBody().appendChild(outerTable);
// Create another table with two rows and two columns and then insert it into the first table's first cell.
Table innerTable = createTable(doc, 2, 2, "Inner Table");
outerTable.getFirstRow().getFirstCell().appendChild(innerTable);
doc.save(getArtifactsDir() + "Table.CreateNestedTable.docx");
}
// Creates a new table in the document with the given dimensions and text in each cell.
private Table createTable(final Document doc, final int rowCount, final int cellCount, final String cellText) throws Exception {
Table table = new Table(doc);
for (int rowId = 1; rowId <= rowCount; rowId++) {
Row row = new Row(doc);
table.appendChild(row);
for (int cellId = 1; cellId <= cellCount; cellId++) {
Cell cell = new Cell(doc);
cell.appendChild(new Paragraph(doc));
cell.getFirstParagraph().appendChild(new Run(doc, cellText));
row.appendChild(cell);
}
}
// You can use the "Title" and "Description" properties to add a title and description respectively to your table.
// The table must have at least one row before we can use these properties.
// These properties are meaningful for ISO / IEC 29500 compliant .docx documents (see the OoxmlCompliance class).
// If we save the document to pre-ISO/IEC 29500 formats, Microsoft Word ignores these properties.
table.setTitle("Aspose table title");
table.setDescription("Aspose table description");
return table;
}| Property Getters/Setters Detail |
|---|
getCellFormat | |
public CellFormat getCellFormat() | |
Example:
Shows how to modify formatting of a table cell.Document doc = new Document(getMyDir() + "Tables.docx"); Table table = doc.getFirstSection().getBody().getTables().get(0); Cell firstCell = table.getFirstRow().getFirstCell(); // Use a cell's "CellFormat" property to set formatting that modifies the appearance of that cell. firstCell.getCellFormat().setWidth(30.0); firstCell.getCellFormat().setOrientation(TextOrientation.DOWNWARD); firstCell.getCellFormat().getShading().setForegroundPatternColor(Color.GREEN); doc.save(getArtifactsDir() + "Table.CellFormat.docx");
Example:
Shows how to combine the rows from two tables into one.
Document doc = new Document(getMyDir() + "Tables.docx");
// Below are two ways of getting a table from a document.
// 1 - From the "Tables" collection of a Body node:
Table firstTable = doc.getFirstSection().getBody().getTables().get(0);
// 2 - Using the "GetChild" method:
Table secondTable = (Table) doc.getChild(NodeType.TABLE, 1, true);
// Append all rows from the current table to the next.
while (secondTable.hasChildNodes())
firstTable.getRows().add(secondTable.getFirstRow());
// Remove the empty table container.
secondTable.remove();
doc.save(getArtifactsDir() + "Table.CombineTables.docx");Example:
Shows how to modify the format of rows and cells in a table.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.startTable();
builder.insertCell();
builder.write("City");
builder.insertCell();
builder.write("Country");
builder.endRow();
builder.insertCell();
builder.write("London");
builder.insertCell();
builder.write("U.K.");
builder.endTable();
// Use the first row's "RowFormat" property to modify the formatting
// of the contents of all cells in this row.
RowFormat rowFormat = table.getFirstRow().getRowFormat();
rowFormat.setHeight(25.0);
rowFormat.getBorders().getByBorderType(BorderType.BOTTOM).setColor(Color.RED);
// Use the "CellFormat" property of the first cell in the last row to modify the formatting of that cell's contents.
CellFormat cellFormat = table.getLastRow().getFirstCell().getCellFormat();
cellFormat.setWidth(100.0);
cellFormat.getShading().setBackgroundPatternColor(Color.ORANGE);
doc.save(getArtifactsDir() + "Table.RowCellFormat.docx");getCount | → inherited from CompositeNode |
public int getCount() | |
Example:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());getCustomNodeId/setCustomNodeId | → inherited from Node |
public int getCustomNodeId() / public void setCustomNodeId(int value) | |
Default is zero.
This identifier can be set and used arbitrarily. For example, as a key to get external data.
Important note, specified value is not saved to an output file and exists only during the node lifetime.
Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}getDocument | → inherited from Node |
public DocumentBase getDocument() | |
The node always belongs to a document even if it has just been created and not yet added to the tree, or if it has been removed from the tree.
Example:
Shows how to create a node and set its owning document.
Document doc = new Document();
Paragraph para = new Paragraph(doc);
para.appendChild(new Run(doc, "Hello world!"));
// We have not yet appended this paragraph as a child to any composite node.
Assert.assertNull(para.getParentNode());
// If a node is an appropriate child node type of another composite node,
// we can attach it as a child only if both nodes have the same owner document.
// The owner document is the document we passed to the node's constructor.
// We have not attached this paragraph to the document, so the document does not contain its text.
Assert.assertEquals(para.getDocument(), doc);
Assert.assertEquals("", doc.getText().trim());
// Since the document owns this paragraph, we can apply one of its styles to the paragraph's contents.
para.getParagraphFormat().setStyleName("Heading 1");
// Add this node to the document, and then verify its contents.
doc.getFirstSection().getBody().appendChild(para);
Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode());
Assert.assertEquals("Hello world!", doc.getText().trim());getFirstChild | → inherited from CompositeNode |
public Node getFirstChild() | |
null is returned.
Example:
Shows how to use a node's NextSibling property to enumerate through its immediate children.
Document doc = new Document(getMyDir() + "Paragraphs.docx");
for (Node node = doc.getFirstSection().getBody().getFirstChild(); node != null; node = node.getNextSibling()) {
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getFirstParagraph | |
public Paragraph getFirstParagraph() | |
Example:
Shows how to create a nested table using a document builder.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Build the outer table.
Cell cell = builder.insertCell();
builder.writeln("Outer Table Cell 1");
builder.insertCell();
builder.writeln("Outer Table Cell 2");
builder.endTable();
// Move to the first cell of the outer table, the build another table inside the cell.
builder.moveTo(cell.getFirstParagraph());
builder.insertCell();
builder.writeln("Inner Table Cell 1");
builder.insertCell();
builder.writeln("Inner Table Cell 2");
builder.endTable();
doc.save(getArtifactsDir() + "DocumentBuilder.InsertNestedTable.docx");Example:
Shows how to build a nested table without using a document builder.
public void createNestedTable() throws Exception {
Document doc = new Document();
// Create the outer table with three rows and four columns, and then add it to the document.
Table outerTable = createTable(doc, 3, 4, "Outer Table");
doc.getFirstSection().getBody().appendChild(outerTable);
// Create another table with two rows and two columns and then insert it into the first table's first cell.
Table innerTable = createTable(doc, 2, 2, "Inner Table");
outerTable.getFirstRow().getFirstCell().appendChild(innerTable);
doc.save(getArtifactsDir() + "Table.CreateNestedTable.docx");
}
// Creates a new table in the document with the given dimensions and text in each cell.
private Table createTable(final Document doc, final int rowCount, final int cellCount, final String cellText) throws Exception {
Table table = new Table(doc);
for (int rowId = 1; rowId <= rowCount; rowId++) {
Row row = new Row(doc);
table.appendChild(row);
for (int cellId = 1; cellId <= cellCount; cellId++) {
Cell cell = new Cell(doc);
cell.appendChild(new Paragraph(doc));
cell.getFirstParagraph().appendChild(new Run(doc, cellText));
row.appendChild(cell);
}
}
// You can use the "Title" and "Description" properties to add a title and description respectively to your table.
// The table must have at least one row before we can use these properties.
// These properties are meaningful for ISO / IEC 29500 compliant .docx documents (see the OoxmlCompliance class).
// If we save the document to pre-ISO/IEC 29500 formats, Microsoft Word ignores these properties.
table.setTitle("Aspose table title");
table.setDescription("Aspose table description");
return table;
}hasChildNodes | → inherited from CompositeNode |
public boolean hasChildNodes() | |
true if this node has any child nodes.
Example:
Shows how to combine the rows from two tables into one.
Document doc = new Document(getMyDir() + "Tables.docx");
// Below are two ways of getting a table from a document.
// 1 - From the "Tables" collection of a Body node:
Table firstTable = doc.getFirstSection().getBody().getTables().get(0);
// 2 - Using the "GetChild" method:
Table secondTable = (Table) doc.getChild(NodeType.TABLE, 1, true);
// Append all rows from the current table to the next.
while (secondTable.hasChildNodes())
firstTable.getRows().add(secondTable.getFirstRow());
// Remove the empty table container.
secondTable.remove();
doc.save(getArtifactsDir() + "Table.CombineTables.docx");isComposite | → inherited from CompositeNode |
public boolean isComposite() | |
true as this node can have child nodes.
Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}isFirstCell | |
public boolean isFirstCell() | |
Example:
Shows how to print the node structure of every table in a document.
public void tableToText() throws Exception {
Document doc = new Document(getMyDir() + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// When we get a composite node to accept a document visitor, the visitor visits the accepting node,
// and then traverses all the node's children in a depth-first manner.
// The visitor can read and modify each visited node.
doc.accept(visitor);
System.out.println(visitor.getText());
}
/// <summary>
/// Traverses a node's non-binary tree of child nodes.
/// Creates a map in the form of a string of all encountered Table nodes and their children.
/// </summary>
public static class TableStructurePrinter extends DocumentVisitor {
public TableStructurePrinter() {
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public String getText() {
return mVisitedTables.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// Runs that are not within tables are not recorded.
/// </summary>
public /*override*/ /*VisitorAction*/int visitRun(Run run) {
if (mVisitorIsInsideTable) indentAndAppendLine("[Run] \"" + run.getText() + "\"");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Table is encountered in the document.
/// </summary>
public int visitTableStart(final Table table) {
int rows = 0;
int columns = 0;
if (table.getRows().getCount() > 0) {
rows = table.getRows().getCount();
columns = table.getFirstRow().getCount();
}
indentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Table node have been visited.
/// </summary>
public int visitTableEnd(final Table table) {
mDocTraversalDepth--;
indentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Row node is encountered in the document.
/// </summary>
public int visitRowStart(final Row row) {
String rowContents = row.getText().replaceAll("\\u0007", ", ").replaceAll(", , ", "");
int rowWidth = row.indexOf(row.getLastCell()) + 1;
int rowIndex = row.getParentTable().indexOf(row);
String rowStatusInTable = row.isFirstRow() && row.isLastRow() ? "only" : row.isFirstRow() ? "first" : row.isLastRow() ? "last" : "";
if (!"".equals(rowStatusInTable)) {
rowStatusInTable = MessageFormat.format(", the {0} row in this table,", rowStatusInTable);
}
indentAndAppendLine(MessageFormat.format("[Row start] Row #{0}{1} width {2}, \"{3}\"", ++rowIndex, rowStatusInTable, rowWidth, rowContents));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Row node have been visited.
/// </summary>
public int visitRowEnd(final Row row) {
mDocTraversalDepth--;
indentAndAppendLine("[Row end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Cell node is encountered in the document.
/// </summary>
public int visitCellStart(final Cell cell) {
Row row = cell.getParentRow();
Table table = row.getParentTable();
String cellStatusInRow = cell.isFirstCell() && cell.isLastCell() ? "only" : cell.isFirstCell() ? "first" : cell.isLastCell() ? "last" : "";
if (!"".equals(cellStatusInRow)) {
cellStatusInRow = MessageFormat.format(", the {0} cell in this row", cellStatusInRow);
}
indentAndAppendLine(MessageFormat.format("[Cell start] Row {0}, Col {1}{2}", table.indexOf(row) + 1, row.indexOf(cell) + 1, cellStatusInRow));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Cell node have been visited.
/// </summary>
public int visitCellEnd(final Cell cell) {
mDocTraversalDepth--;
indentAndAppendLine("[Cell end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Append a line to the StringBuilder, and indent it depending on how deep the visitor is
/// into the current table's tree of child nodes.
/// </summary>
/// <param name="text"></param>
private void indentAndAppendLine(final String text) {
for (int i = 0; i < mDocTraversalDepth; i++) {
mVisitedTables.append("| ");
}
mVisitedTables.append(text + "\r\n");
}
private boolean mVisitorIsInsideTable;
private int mDocTraversalDepth;
private final /*final*/ StringBuilder mVisitedTables;
}isLastCell | |
public boolean isLastCell() | |
Example:
Shows how to print the node structure of every table in a document.
public void tableToText() throws Exception {
Document doc = new Document(getMyDir() + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// When we get a composite node to accept a document visitor, the visitor visits the accepting node,
// and then traverses all the node's children in a depth-first manner.
// The visitor can read and modify each visited node.
doc.accept(visitor);
System.out.println(visitor.getText());
}
/// <summary>
/// Traverses a node's non-binary tree of child nodes.
/// Creates a map in the form of a string of all encountered Table nodes and their children.
/// </summary>
public static class TableStructurePrinter extends DocumentVisitor {
public TableStructurePrinter() {
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public String getText() {
return mVisitedTables.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// Runs that are not within tables are not recorded.
/// </summary>
public /*override*/ /*VisitorAction*/int visitRun(Run run) {
if (mVisitorIsInsideTable) indentAndAppendLine("[Run] \"" + run.getText() + "\"");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Table is encountered in the document.
/// </summary>
public int visitTableStart(final Table table) {
int rows = 0;
int columns = 0;
if (table.getRows().getCount() > 0) {
rows = table.getRows().getCount();
columns = table.getFirstRow().getCount();
}
indentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Table node have been visited.
/// </summary>
public int visitTableEnd(final Table table) {
mDocTraversalDepth--;
indentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Row node is encountered in the document.
/// </summary>
public int visitRowStart(final Row row) {
String rowContents = row.getText().replaceAll("\\u0007", ", ").replaceAll(", , ", "");
int rowWidth = row.indexOf(row.getLastCell()) + 1;
int rowIndex = row.getParentTable().indexOf(row);
String rowStatusInTable = row.isFirstRow() && row.isLastRow() ? "only" : row.isFirstRow() ? "first" : row.isLastRow() ? "last" : "";
if (!"".equals(rowStatusInTable)) {
rowStatusInTable = MessageFormat.format(", the {0} row in this table,", rowStatusInTable);
}
indentAndAppendLine(MessageFormat.format("[Row start] Row #{0}{1} width {2}, \"{3}\"", ++rowIndex, rowStatusInTable, rowWidth, rowContents));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Row node have been visited.
/// </summary>
public int visitRowEnd(final Row row) {
mDocTraversalDepth--;
indentAndAppendLine("[Row end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Cell node is encountered in the document.
/// </summary>
public int visitCellStart(final Cell cell) {
Row row = cell.getParentRow();
Table table = row.getParentTable();
String cellStatusInRow = cell.isFirstCell() && cell.isLastCell() ? "only" : cell.isFirstCell() ? "first" : cell.isLastCell() ? "last" : "";
if (!"".equals(cellStatusInRow)) {
cellStatusInRow = MessageFormat.format(", the {0} cell in this row", cellStatusInRow);
}
indentAndAppendLine(MessageFormat.format("[Cell start] Row {0}, Col {1}{2}", table.indexOf(row) + 1, row.indexOf(cell) + 1, cellStatusInRow));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Cell node have been visited.
/// </summary>
public int visitCellEnd(final Cell cell) {
mDocTraversalDepth--;
indentAndAppendLine("[Cell end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Append a line to the StringBuilder, and indent it depending on how deep the visitor is
/// into the current table's tree of child nodes.
/// </summary>
/// <param name="text"></param>
private void indentAndAppendLine(final String text) {
for (int i = 0; i < mDocTraversalDepth; i++) {
mVisitedTables.append("| ");
}
mVisitedTables.append(text + "\r\n");
}
private boolean mVisitorIsInsideTable;
private int mDocTraversalDepth;
private final /*final*/ StringBuilder mVisitedTables;
}getLastChild | → inherited from CompositeNode |
public Node getLastChild() | |
null is returned.
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Section 1 text.");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.writeln("Section 2 text.");
// Both sections are siblings of each other.
Section lastSection = (Section) doc.getLastChild();
Section firstSection = (Section) lastSection.getPreviousSibling();
// Remove a section based on its sibling relationship with another section.
if (lastSection.getPreviousSibling() != null)
doc.removeChild(firstSection);
// The section we removed was the first one, leaving the document with only the second.
Assert.assertEquals("Section 2 text.", doc.getText().trim());getLastParagraph | |
public Paragraph getLastParagraph() | |
Example:
Shows how to apply settings to vertical borders to a table row's format.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Create a table with red and blue inner borders.
Table table = builder.startTable();
for (int i = 0; i < 3; i++) {
builder.insertCell();
builder.write(MessageFormat.format("Row {0}, Column 1", i + 1));
builder.insertCell();
builder.write(MessageFormat.format("Row {0}, Column 2", i + 1));
Row row = builder.endRow();
BorderCollection borders = row.getRowFormat().getBorders();
// Adjust the appearance of borders that will appear between rows.
borders.getHorizontal().setColor(Color.RED);
borders.getHorizontal().setLineStyle(LineStyle.DOT);
borders.getHorizontal().setLineWidth(2.0d);
// Adjust the appearance of borders that will appear between cells.
borders.getVertical().setColor(Color.BLUE);
borders.getVertical().setLineStyle(LineStyle.DOT);
borders.getVertical().setLineWidth(2.0d);
}
// A row format, and a cell's inner paragraph use different border settings.
Border border = table.getFirstRow().getFirstCell().getLastParagraph().getParagraphFormat().getBorders().getVertical();
Assert.assertEquals(0, border.getColor().getRGB());
Assert.assertEquals(0.0d, border.getLineWidth());
Assert.assertEquals(LineStyle.NONE, border.getLineStyle());
doc.save(getArtifactsDir() + "Border.VerticalBorders.docx");getNextCell | |
public Cell getNextCell() | |
Example:
Shows how to enumerate through all table cells.
Document doc = new Document(getMyDir() + "Tables.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enumerate through all cells of the table.
for (Row row = table.getFirstRow(); row != null; row = row.getNextRow())
{
for (Cell cell = row.getFirstCell(); cell != null; cell = cell.getNextCell())
{
System.out.println(cell.getText());
}
}getNextSibling | → inherited from Node |
public Node getNextSibling() | |
null is returned.
Example:
Shows how to use a node's NextSibling property to enumerate through its immediate children.
Document doc = new Document(getMyDir() + "Paragraphs.docx");
for (Node node = doc.getFirstSection().getBody().getFirstChild(); node != null; node = node.getNextSibling()) {
System.out.println(Node.nodeTypeToString(node.getNodeType()));
}Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getNodeType | |
public int getNodeType() | |
Example:
Shows how to traverse a composite node's tree of child nodes.
public void recurseChildren() throws Exception {
Document doc = new Document(getMyDir() + "Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
Assert.assertTrue(doc.isComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
traverseAllNodes(doc, 0);
}
/// <summary>
/// Recursively traverses a node tree while printing the type of each node
/// with an indent depending on depth as well as the contents of all inline nodes.
/// </summary>
public void traverseAllNodes(CompositeNode parentNode, int depth) {
for (Node childNode = parentNode.getFirstChild(); childNode != null; childNode = childNode.getNextSibling()) {
System.out.println(MessageFormat.format("{0}{1}", String.format(" ", depth), Node.nodeTypeToString(childNode.getNodeType())));
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode.isComposite()) {
System.out.println();
traverseAllNodes((CompositeNode) childNode, depth + 1);
} else if (childNode instanceof Inline) {
System.out.println(MessageFormat.format(" - \"{0}\"", childNode.getText().trim()));
} else {
System.out.println();
}
}
}getParagraphs | |
public ParagraphCollection getParagraphs() | |
Example:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");getParentNode | → inherited from Node |
public CompositeNode getParentNode() | |
If a node has just been created and not yet added to the tree,
or if it has been removed from the tree, the parent is null.
Example:
Shows how to access a node's parent node.Document doc = new Document(); Paragraph para = doc.getFirstSection().getBody().getFirstParagraph(); // Append a child Run node to the document's first paragraph. Run run = new Run(doc, "Hello world!"); para.appendChild(run); // The paragraph is the parent node of the run node. We can trace this lineage // all the way to the document node, which is the root of the document's node tree. Assert.assertEquals(para, run.getParentNode()); Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode()); Assert.assertEquals(doc.getFirstSection(), doc.getFirstSection().getBody().getParentNode()); Assert.assertEquals(doc, doc.getFirstSection().getParentNode());
Example:
Shows how to create a node and set its owning document.
Document doc = new Document();
Paragraph para = new Paragraph(doc);
para.appendChild(new Run(doc, "Hello world!"));
// We have not yet appended this paragraph as a child to any composite node.
Assert.assertNull(para.getParentNode());
// If a node is an appropriate child node type of another composite node,
// we can attach it as a child only if both nodes have the same owner document.
// The owner document is the document we passed to the node's constructor.
// We have not attached this paragraph to the document, so the document does not contain its text.
Assert.assertEquals(para.getDocument(), doc);
Assert.assertEquals("", doc.getText().trim());
// Since the document owns this paragraph, we can apply one of its styles to the paragraph's contents.
para.getParagraphFormat().setStyleName("Heading 1");
// Add this node to the document, and then verify its contents.
doc.getFirstSection().getBody().appendChild(para);
Assert.assertEquals(doc.getFirstSection().getBody(), para.getParentNode());
Assert.assertEquals("Hello world!", doc.getText().trim());getParentRow | |
public Row getParentRow() | |
Example:
Shows how to set a table to stay together on the same page.
Document doc = new Document(getMyDir() + "Table spanning two pages.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enabling KeepWithNext for every paragraph in the table except for the
// last ones in the last row will prevent the table from splitting across multiple pages.
for (Cell cell : (Iterable<Cell>) table.getChildNodes(NodeType.CELL, true))
for (Paragraph para : cell.getParagraphs()) {
Assert.assertTrue(para.isInCell());
if (!(cell.getParentRow().isLastRow() && para.isEndOfCell()))
para.getParagraphFormat().setKeepWithNext(true);
}
doc.save(getArtifactsDir() + "Table.KeepTableTogether.docx");getPreviousCell | |
public Cell getPreviousCell() | |
Example:
Shows how to enumerate through all table cells.
Document doc = new Document(getMyDir() + "Tables.docx");
Table table = doc.getFirstSection().getBody().getTables().get(0);
// Enumerate through all cells of the table.
for (Row row = table.getFirstRow(); row != null; row = row.getNextRow())
{
for (Cell cell = row.getFirstCell(); cell != null; cell = cell.getNextCell())
{
System.out.println(cell.getText());
}
}getPreviousSibling | → inherited from Node |
public Node getPreviousSibling() | |
null is returned.
Example:
Shows how to use of methods of Node and CompositeNode to remove a section before the last section in the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Section 1 text.");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.writeln("Section 2 text.");
// Both sections are siblings of each other.
Section lastSection = (Section) doc.getLastChild();
Section firstSection = (Section) lastSection.getPreviousSibling();
// Remove a section based on its sibling relationship with another section.
if (lastSection.getPreviousSibling() != null)
doc.removeChild(firstSection);
// The section we removed was the first one, leaving the document with only the second.
Assert.assertEquals("Section 2 text.", doc.getText().trim());getRange | → inherited from Node |
public Range getRange() | |
Example:
Shows how to delete all the nodes from a range.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Add text to the first section in the document, and then add another section.
builder.write("Section 1. ");
builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);
builder.write("Section 2.");
Assert.assertEquals("Section 1. \fSection 2.", doc.getText().trim());
// Remove the first section entirely by removing all the nodes
// within its range, including the section itself.
doc.getSections().get(0).getRange().delete();
Assert.assertEquals(1, doc.getSections().getCount());
Assert.assertEquals("Section 2.", doc.getText().trim());getTables | |
public TableCollection getTables() | |
Example:
Shows how to find out if a tables are nested.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
Table table = (Table) tables.get(i);
// Find out if any cells in the table have other tables as children.
int count = getChildTableCount(table);
System.out.print(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Find out if the table is nested inside another table, and, if so, at what depth.
int tableDepth = getNestedDepthOfTable(table);
if (tableDepth > 0)
System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", i, tableDepth));
else
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", i));
}
}
// Calculates what level a table is nested inside other tables.
//
// Returns An integer containing the level the table is nested at.
// 0 = Table is not nested inside any other table
// 1 = Table is nested within one parent table
// 2 = Table is nested within two parent tables etc..
private static int getNestedDepthOfTable(final Table table) {
int depth = 0;
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
// Determines if a table contains any immediate child table within its cells.
// Does not recursively traverse through those tables to check for further tables.
//
// Returns true if at least one child cell contains a table.
// Returns false if no cells in the table contains a table.
private static int getChildTableCount(final Table table) {
int childTableCount = 0;
for (Row row : table.getRows()) {
for (Cell cell : row.getCells()) {
TableCollection childTables = cell.getTables();
if (childTables.getCount() > 0) childTableCount++;
}
}
return childTableCount;
}| Method Detail |
|---|
accept | |
public boolean accept(DocumentVisitor visitor) throws java.lang.Exception | |
Enumerates over this node and all of its children. Each node calls a corresponding method on
For more info see the Visitor design pattern.
visitor - The visitor that will visit the nodes.Example:
Shows how to print the node structure of every table in a document.
public void tableToText() throws Exception {
Document doc = new Document(getMyDir() + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// When we get a composite node to accept a document visitor, the visitor visits the accepting node,
// and then traverses all the node's children in a depth-first manner.
// The visitor can read and modify each visited node.
doc.accept(visitor);
System.out.println(visitor.getText());
}
/// <summary>
/// Traverses a node's non-binary tree of child nodes.
/// Creates a map in the form of a string of all encountered Table nodes and their children.
/// </summary>
public static class TableStructurePrinter extends DocumentVisitor {
public TableStructurePrinter() {
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public String getText() {
return mVisitedTables.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// Runs that are not within tables are not recorded.
/// </summary>
public /*override*/ /*VisitorAction*/int visitRun(Run run) {
if (mVisitorIsInsideTable) indentAndAppendLine("[Run] \"" + run.getText() + "\"");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Table is encountered in the document.
/// </summary>
public int visitTableStart(final Table table) {
int rows = 0;
int columns = 0;
if (table.getRows().getCount() > 0) {
rows = table.getRows().getCount();
columns = table.getFirstRow().getCount();
}
indentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Table node have been visited.
/// </summary>
public int visitTableEnd(final Table table) {
mDocTraversalDepth--;
indentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Row node is encountered in the document.
/// </summary>
public int visitRowStart(final Row row) {
String rowContents = row.getText().replaceAll("\\u0007", ", ").replaceAll(", , ", "");
int rowWidth = row.indexOf(row.getLastCell()) + 1;
int rowIndex = row.getParentTable().indexOf(row);
String rowStatusInTable = row.isFirstRow() && row.isLastRow() ? "only" : row.isFirstRow() ? "first" : row.isLastRow() ? "last" : "";
if (!"".equals(rowStatusInTable)) {
rowStatusInTable = MessageFormat.format(", the {0} row in this table,", rowStatusInTable);
}
indentAndAppendLine(MessageFormat.format("[Row start] Row #{0}{1} width {2}, \"{3}\"", ++rowIndex, rowStatusInTable, rowWidth, rowContents));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Row node have been visited.
/// </summary>
public int visitRowEnd(final Row row) {
mDocTraversalDepth--;
indentAndAppendLine("[Row end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Cell node is encountered in the document.
/// </summary>
public int visitCellStart(final Cell cell) {
Row row = cell.getParentRow();
Table table = row.getParentTable();
String cellStatusInRow = cell.isFirstCell() && cell.isLastCell() ? "only" : cell.isFirstCell() ? "first" : cell.isLastCell() ? "last" : "";
if (!"".equals(cellStatusInRow)) {
cellStatusInRow = MessageFormat.format(", the {0} cell in this row", cellStatusInRow);
}
indentAndAppendLine(MessageFormat.format("[Cell start] Row {0}, Col {1}{2}", table.indexOf(row) + 1, row.indexOf(cell) + 1, cellStatusInRow));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Cell node have been visited.
/// </summary>
public int visitCellEnd(final Cell cell) {
mDocTraversalDepth--;
indentAndAppendLine("[Cell end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Append a line to the StringBuilder, and indent it depending on how deep the visitor is
/// into the current table's tree of child nodes.
/// </summary>
/// <param name="text"></param>
private void indentAndAppendLine(final String text) {
for (int i = 0; i < mDocTraversalDepth; i++) {
mVisitedTables.append("| ");
}
mVisitedTables.append(text + "\r\n");
}
private boolean mVisitorIsInsideTable;
private int mDocTraversalDepth;
private final /*final*/ StringBuilder mVisitedTables;
}acceptEnd | |
public int acceptEnd(DocumentVisitor visitor) throws java.lang.Exception | |
visitor - The document visitor.Example:
Shows how to print the node structure of every table in a document.
public void tableToText() throws Exception {
Document doc = new Document(getMyDir() + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// When we get a composite node to accept a document visitor, the visitor visits the accepting node,
// and then traverses all the node's children in a depth-first manner.
// The visitor can read and modify each visited node.
doc.accept(visitor);
System.out.println(visitor.getText());
}
/// <summary>
/// Traverses a node's non-binary tree of child nodes.
/// Creates a map in the form of a string of all encountered Table nodes and their children.
/// </summary>
public static class TableStructurePrinter extends DocumentVisitor {
public TableStructurePrinter() {
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public String getText() {
return mVisitedTables.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// Runs that are not within tables are not recorded.
/// </summary>
public /*override*/ /*VisitorAction*/int visitRun(Run run) {
if (mVisitorIsInsideTable) indentAndAppendLine("[Run] \"" + run.getText() + "\"");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Table is encountered in the document.
/// </summary>
public int visitTableStart(final Table table) {
int rows = 0;
int columns = 0;
if (table.getRows().getCount() > 0) {
rows = table.getRows().getCount();
columns = table.getFirstRow().getCount();
}
indentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Table node have been visited.
/// </summary>
public int visitTableEnd(final Table table) {
mDocTraversalDepth--;
indentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Row node is encountered in the document.
/// </summary>
public int visitRowStart(final Row row) {
String rowContents = row.getText().replaceAll("\\u0007", ", ").replaceAll(", , ", "");
int rowWidth = row.indexOf(row.getLastCell()) + 1;
int rowIndex = row.getParentTable().indexOf(row);
String rowStatusInTable = row.isFirstRow() && row.isLastRow() ? "only" : row.isFirstRow() ? "first" : row.isLastRow() ? "last" : "";
if (!"".equals(rowStatusInTable)) {
rowStatusInTable = MessageFormat.format(", the {0} row in this table,", rowStatusInTable);
}
indentAndAppendLine(MessageFormat.format("[Row start] Row #{0}{1} width {2}, \"{3}\"", ++rowIndex, rowStatusInTable, rowWidth, rowContents));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Row node have been visited.
/// </summary>
public int visitRowEnd(final Row row) {
mDocTraversalDepth--;
indentAndAppendLine("[Row end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Cell node is encountered in the document.
/// </summary>
public int visitCellStart(final Cell cell) {
Row row = cell.getParentRow();
Table table = row.getParentTable();
String cellStatusInRow = cell.isFirstCell() && cell.isLastCell() ? "only" : cell.isFirstCell() ? "first" : cell.isLastCell() ? "last" : "";
if (!"".equals(cellStatusInRow)) {
cellStatusInRow = MessageFormat.format(", the {0} cell in this row", cellStatusInRow);
}
indentAndAppendLine(MessageFormat.format("[Cell start] Row {0}, Col {1}{2}", table.indexOf(row) + 1, row.indexOf(cell) + 1, cellStatusInRow));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Cell node have been visited.
/// </summary>
public int visitCellEnd(final Cell cell) {
mDocTraversalDepth--;
indentAndAppendLine("[Cell end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Append a line to the StringBuilder, and indent it depending on how deep the visitor is
/// into the current table's tree of child nodes.
/// </summary>
/// <param name="text"></param>
private void indentAndAppendLine(final String text) {
for (int i = 0; i < mDocTraversalDepth; i++) {
mVisitedTables.append("| ");
}
mVisitedTables.append(text + "\r\n");
}
private boolean mVisitorIsInsideTable;
private int mDocTraversalDepth;
private final /*final*/ StringBuilder mVisitedTables;
}acceptStart | |
public int acceptStart(DocumentVisitor visitor) throws java.lang.Exception | |
visitor - The document visitor.Example:
Shows how to print the node structure of every table in a document.
public void tableToText() throws Exception {
Document doc = new Document(getMyDir() + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// When we get a composite node to accept a document visitor, the visitor visits the accepting node,
// and then traverses all the node's children in a depth-first manner.
// The visitor can read and modify each visited node.
doc.accept(visitor);
System.out.println(visitor.getText());
}
/// <summary>
/// Traverses a node's non-binary tree of child nodes.
/// Creates a map in the form of a string of all encountered Table nodes and their children.
/// </summary>
public static class TableStructurePrinter extends DocumentVisitor {
public TableStructurePrinter() {
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public String getText() {
return mVisitedTables.toString();
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// Runs that are not within tables are not recorded.
/// </summary>
public /*override*/ /*VisitorAction*/int visitRun(Run run) {
if (mVisitorIsInsideTable) indentAndAppendLine("[Run] \"" + run.getText() + "\"");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Table is encountered in the document.
/// </summary>
public int visitTableStart(final Table table) {
int rows = 0;
int columns = 0;
if (table.getRows().getCount() > 0) {
rows = table.getRows().getCount();
columns = table.getFirstRow().getCount();
}
indentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Table node have been visited.
/// </summary>
public int visitTableEnd(final Table table) {
mDocTraversalDepth--;
indentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Row node is encountered in the document.
/// </summary>
public int visitRowStart(final Row row) {
String rowContents = row.getText().replaceAll("\\u0007", ", ").replaceAll(", , ", "");
int rowWidth = row.indexOf(row.getLastCell()) + 1;
int rowIndex = row.getParentTable().indexOf(row);
String rowStatusInTable = row.isFirstRow() && row.isLastRow() ? "only" : row.isFirstRow() ? "first" : row.isLastRow() ? "last" : "";
if (!"".equals(rowStatusInTable)) {
rowStatusInTable = MessageFormat.format(", the {0} row in this table,", rowStatusInTable);
}
indentAndAppendLine(MessageFormat.format("[Row start] Row #{0}{1} width {2}, \"{3}\"", ++rowIndex, rowStatusInTable, rowWidth, rowContents));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Row node have been visited.
/// </summary>
public int visitRowEnd(final Row row) {
mDocTraversalDepth--;
indentAndAppendLine("[Row end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Cell node is encountered in the document.
/// </summary>
public int visitCellStart(final Cell cell) {
Row row = cell.getParentRow();
Table table = row.getParentTable();
String cellStatusInRow = cell.isFirstCell() && cell.isLastCell() ? "only" : cell.isFirstCell() ? "first" : cell.isLastCell() ? "last" : "";
if (!"".equals(cellStatusInRow)) {
cellStatusInRow = MessageFormat.format(", the {0} cell in this row", cellStatusInRow);
}
indentAndAppendLine(MessageFormat.format("[Cell start] Row {0}, Col {1}{2}", table.indexOf(row) + 1, row.indexOf(cell) + 1, cellStatusInRow));
mDocTraversalDepth++;
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called after all the child nodes of a Cell node have been visited.
/// </summary>
public int visitCellEnd(final Cell cell) {
mDocTraversalDepth--;
indentAndAppendLine("[Cell end]");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Append a line to the StringBuilder, and indent it depending on how deep the visitor is
/// into the current table's tree of child nodes.
/// </summary>
/// <param name="text"></param>
private void indentAndAppendLine(final String text) {
for (int i = 0; i < mDocTraversalDepth; i++) {
mVisitedTables.append("| ");
}
mVisitedTables.append(text + "\r\n");
}
private boolean mVisitorIsInsideTable;
private int mDocTraversalDepth;
private final /*final*/ StringBuilder mVisitedTables;
}deepClone | → inherited from Node |
public Node deepClone(boolean isCloneChildren) | |
This method serves as a copy constructor for nodes. The cloned node has no parent, but belongs to the same document as the original node.
This method always performs a deep copy of the node. The isCloneChildren parameter specifies whether to perform copy all child nodes as well.
isCloneChildren - True to recursively clone the subtree under the specified node;
false to clone only the node itself.Example:
Shows how to clone a composite node.
Document doc = new Document();
Paragraph para = doc.getFirstSection().getBody().getFirstParagraph();
para.appendChild(new Run(doc, "Hello world!"));
// Below are two ways of cloning a composite node.
// 1 - Create a clone of a node, and create a clone of each of its child nodes as well.
Node cloneWithChildren = para.deepClone(true);
Assert.assertTrue(((CompositeNode) cloneWithChildren).hasChildNodes());
Assert.assertEquals("Hello world!", cloneWithChildren.getText().trim());
// 2 - Create a clone of a node just by itself without any children.
Node cloneWithoutChildren = para.deepClone(false);
Assert.assertFalse(((CompositeNode) cloneWithoutChildren).hasChildNodes());
Assert.assertEquals("", cloneWithoutChildren.getText().trim());ensureMinimum | |
public void ensureMinimum() | |
Example:
Shows how to ensure a cell node contains the nodes we need to begin adding content to it.Document doc = new Document(); Table table = new Table(doc); doc.getFirstSection().getBody().appendChild(table); Row row = new Row(doc); table.appendChild(row); Cell cell = new Cell(doc); row.appendChild(cell); // Cells may contain paragraphs with typical elements such as runs, shapes, and even other tables. // Our new cell does not have any paragraphs, and we cannot add contents such as run and shape nodes to it until it does. Assert.assertEquals(0, cell.getChildNodes(NodeType.ANY, true).getCount()); // Calling the "EnsureMinimum" method on a cell will ensure that // the cell has at least one empty paragraph, which we can then add contents to. cell.ensureMinimum(); cell.getFirstParagraph().appendChild(new Run(doc, "Hello world!"));
getAncestor | → inherited from Node |
public CompositeNode getAncestor(int ancestorType) | |
ancestorType - A null if no ancestor of this type was found.Example:
Shows how to find out if a tables are nested.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
Table table = (Table) tables.get(i);
// Find out if any cells in the table have other tables as children.
int count = getChildTableCount(table);
System.out.print(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Find out if the table is nested inside another table, and, if so, at what depth.
int tableDepth = getNestedDepthOfTable(table);
if (tableDepth > 0)
System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", i, tableDepth));
else
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", i));
}
}
// Calculates what level a table is nested inside other tables.
//
// Returns An integer containing the level the table is nested at.
// 0 = Table is not nested inside any other table
// 1 = Table is nested within one parent table
// 2 = Table is nested within two parent tables etc..
private static int getNestedDepthOfTable(final Table table) {
int depth = 0;
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
// Determines if a table contains any immediate child table within its cells.
// Does not recursively traverse through those tables to check for further tables.
//
// Returns true if at least one child cell contains a table.
// Returns false if no cells in the table contains a table.
private static int getChildTableCount(final Table table) {
int childTableCount = 0;
for (Row row : table.getRows()) {
for (Cell cell : row.getCells()) {
TableCollection childTables = cell.getTables();
if (childTables.getCount() > 0) childTableCount++;
}
}
return childTableCount;
}getAncestor | → inherited from Node |
public CompositeNode getAncestor(java.lang.Class ancestorType) | |
The ancestor type matches if it is equal to ancestorType or derived from ancestorType.
ancestorType - The object type of the ancestor to retrieve.null if no ancestor of this type was found.Example:
Shows how to find out if a tables are nested.
public void calculateDepthOfNestedTables() throws Exception {
Document doc = new Document(getMyDir() + "Nested tables.docx");
NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
for (int i = 0; i < tables.getCount(); i++) {
Table table = (Table) tables.get(i);
// Find out if any cells in the table have other tables as children.
int count = getChildTableCount(table);
System.out.print(MessageFormat.format("Table #{0} has {1} tables directly within its cells", i, count));
// Find out if the table is nested inside another table, and, if so, at what depth.
int tableDepth = getNestedDepthOfTable(table);
if (tableDepth > 0)
System.out.println(MessageFormat.format("Table #{0} is nested inside another table at depth of {1}", i, tableDepth));
else
System.out.println(MessageFormat.format("Table #{0} is a non nested table (is not a child of another table)", i));
}
}
// Calculates what level a table is nested inside other tables.
//
// Returns An integer containing the level the table is nested at.
// 0 = Table is not nested inside any other table
// 1 = Table is nested within one parent table
// 2 = Table is nested within two parent tables etc..
private static int getNestedDepthOfTable(final Table table) {
int depth = 0;
Node parent = table.getAncestor(table.getNodeType());
while (parent != null) {
depth++;
parent = parent.getAncestor(Table.class);
}
return depth;
}
// Determines if a table contains any immediate child table within its cells.
// Does not recursively traverse through those tables to check for further tables.
//
// Returns true if at least one child cell contains a table.
// Returns false if no cells in the table contains a table.
private static int getChildTableCount(final Table table) {
int childTableCount = 0;
for (Row row : table.getRows()) {
for (Cell cell : row.getCells()) {
TableCollection childTables = cell.getTables();
if (childTables.getCount() > 0) childTableCount++;
}
}
return childTableCount;
}getChild | → inherited from CompositeNode |
public Node getChild(int nodeType, int index, boolean isDeep) | |
If index is out of range, a null is returned.
false and false).nodeType - A index - Zero based index of the child node to select.
Negative indexes are also allowed and indicate access from the end,
that is -1 means the last node.isDeep - true to select from all child nodes recursively;
false to select only among immediate children. See remarks for more info.null if no matching node is found.Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}Example:
Shows how to apply the properties of a table's style directly to the table's elements.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.startTable();
builder.insertCell();
builder.write("Hello world!");
builder.endTable();
TableStyle tableStyle = (TableStyle) doc.getStyles().add(StyleType.TABLE, "MyTableStyle1");
tableStyle.setRowStripe(3);
tableStyle.setCellSpacing(5.0);
tableStyle.getShading().setBackgroundPatternColor(Color.WHITE);
tableStyle.getBorders().setColor(Color.BLUE);
tableStyle.getBorders().setLineStyle(LineStyle.DOT_DASH);
table.setStyle(tableStyle);
// This method concerns table style properties such as the ones we set above.
doc.expandTableStylesToDirectFormatting();
doc.save(getArtifactsDir() + "Document.TableStyleToDirectFormatting.docx");getChildNodes | → inherited from CompositeNode |
public NodeCollection getChildNodes(int nodeType, boolean isDeep) | |
The collection of nodes returned by this method is always live.
A live collection is always in sync with the document. For example, if you selected all sections in a document and enumerate through the collection deleting the sections, the section is removed from the collection immediately when it is removed from the document.
nodeType - A isDeep - true to select from all child nodes recursively;
false to select only among immediate children. Example:
Shows how to add, update and delete child nodes in a CompositeNode's collection of children.
Document doc = new Document();
// An empty document, by default, has one paragraph.
Assert.assertEquals(1, doc.getFirstSection().getBody().getParagraphs().getCount());
// Composite nodes such as our paragraph can contain other composite and inline nodes as children.
Paragraph paragraph = doc.getFirstSection().getBody().getFirstParagraph();
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.appendChild(paragraphText);
// Create three more run nodes.
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// The document body will not display these runs until we insert them into a composite node
// that itself is a part of the document's node tree, as we did with the first run.
// We can determine where the text contents of nodes that we insert
// appears in the document by specifying an insertion location relative to another node in the paragraph.
Assert.assertEquals("Initial text.", paragraph.getText().trim());
// Insert the second run into the paragraph in front of the initial run.
paragraph.insertBefore(run2, paragraphText);
Assert.assertEquals("Run 2. Initial text.", paragraph.getText().trim());
// Insert the third run after the initial run.
paragraph.insertAfter(run3, paragraphText);
Assert.assertEquals("Run 2. Initial text. Run 3.", paragraph.getText().trim());
// Insert the first run to the start of the paragraph's child nodes collection.
paragraph.prependChild(run1);
Assert.assertEquals("Run 1. Run 2. Initial text. Run 3.", paragraph.getText().trim());
Assert.assertEquals(4, paragraph.getChildNodes(NodeType.ANY, true).getCount());
// We can modify the contents of the run by editing and deleting existing child nodes.
((Run) paragraph.getChildNodes(NodeType.RUN, true).get(1)).setText("Updated run 2. ");
paragraph.getChildNodes(NodeType.RUN, true).remove(paragraphText);
Assert.assertEquals("Run 1. Updated run 2. Run 3.", paragraph.getText().trim());
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, true).getCount());Example:
Shows how to traverse through a composite node's collection of child nodes.
Document doc = new Document();
// Add two runs and one shape as child nodes to the first paragraph of this document.
Paragraph paragraph = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 0, true);
paragraph.appendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.RECTANGLE);
shape.setWidth(200.0);
shape.setHeight(200.0);
// Note that the 'CustomNodeId' is not saved to an output file and exists only during the node lifetime.
shape.setCustomNodeId(100);
shape.setWrapType(WrapType.INLINE);
paragraph.appendChild(shape);
paragraph.appendChild(new Run(doc, "Hello again!"));
// Iterate through the paragraph's collection of immediate children,
// and print any runs or shapes that we find within.
NodeCollection children = paragraph.getChildNodes(NodeType.ANY, false);
Assert.assertEquals(3, paragraph.getChildNodes(NodeType.ANY, false).getCount());
for (Node child : (Iterable<Node>) children)
switch (child.getNodeType()) {
case NodeType.RUN:
System.out.println("Run contents:");
System.out.println(MessageFormat.format("\t\"{0}\"", child.getText().trim()));
break;
case NodeType.SHAPE:
Shape childShape = (Shape)child;
System.out.println("Shape:");
System.out.println(MessageFormat.format("\t{0}, {1}x{2}", childShape.getShapeType(), childShape.getWidth(), childShape.getHeight()));
break;
}Example:
Shows how to extract images from a document, and save them to the local file system as individual files.
Document doc = new Document(getMyDir() + "Images.docx");
// Get the collection of shapes from the document,
// and save the image data of every shape with an image as a file to the local file system.
NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
int imageIndex = 0;
for (Shape shape : (Iterable<Shape>) shapes) {
if (shape.hasImage()) {
// The image data of shapes may contain images of many possible image formats.
// We can determine a file extension for each image automatically, based on its format.
String imageFileName = MessageFormat.format("File.ExtractImages.{0}{1}", imageIndex, FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType()));
shape.getImageData().save(getArtifactsDir() + imageFileName);
imageIndex++;
}
}Example:
Shows how to print all of a document's comments and their replies.
Document doc = new Document(getMyDir() + "Comments.docx");
NodeCollection comments = doc.getChildNodes(NodeType.COMMENT, true);
// If a comment has no ancestor, it is a "top-level" comment as opposed to a reply-type comment.
// Print all top-level comments along with any replies they may have.
for (Comment comment : (Iterable<Comment>) comments) {
if (comment.getAncestor() == null) {
System.out.println("Top-level comment:");
System.out.println("\t\"{comment.GetText().Trim()}\", by {comment.Author}");
System.out.println("Has {comment.Replies.Count} replies");
for (Comment commentReply : comment.getReplies()) {
System.out.println("\t\"{commentReply.GetText().Trim()}\", by {commentReply.Author}");
}
System.out.println();
}
}getText | → inherited from CompositeNode |
public java.lang.String getText() | |
The returned string includes all control and special characters as described in
Example:
Shows how to output all paragraphs in a document that are list items.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getListFormat().applyNumberDefault();
builder.writeln("Numbered list item 1");
builder.writeln("Numbered list item 2");
builder.writeln("Numbered list item 3");
builder.getListFormat().removeNumbers();
builder.getListFormat().applyBulletDefault();
builder.writeln("Bulleted list item 1");
builder.writeln("Bulleted list item 2");
builder.writeln("Bulleted list item 3");
builder.getListFormat().removeNumbers();
NodeCollection paras = doc.getChildNodes(NodeType.PARAGRAPH, true);
for (Paragraph para : (Iterable<Paragraph>) paras) {
if (para.getListFormat().isListItem()) {
System.out.println(java.text.MessageFormat.format("*** A paragraph belongs to list {0}", para.getListFormat().getList().getListId()));
System.out.println(para.getText());
}
}Example:
Shows the difference between calling the GetText and ToString methods on a node.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField("MERGEFIELD Field");
// GetText will retrieve the visible text as well as field codes and special characters.
Assert.assertEquals("\u0013MERGEFIELD Field\u0014«Field»\u0015\f", doc.getText());
// ToString will give us the document's appearance if saved to a passed save format.
Assert.assertEquals("«Field»\r\n", doc.toString(SaveFormat.TEXT));indexOf | → inherited from CompositeNode |
public int indexOf(Node child) | |
Example:
Shows how to get the index of a given child node from its parent.Document doc = new Document(getMyDir() + "Rendering.docx"); Body body = doc.getFirstSection().getBody(); // Retrieve the index of the last paragraph in the body of the first section. Assert.assertEquals(24, body.getChildNodes(NodeType.ANY, false).indexOf(body.getLastParagraph()));
iterator | → inherited from CompositeNode |
public java.util.Iterator<Node> iterator() | |
Example:
Shows how to print all of a document's comments and their replies.
Document doc = new Document(getMyDir() + "Comments.docx");
NodeCollection comments = doc.getChildNodes(NodeType.COMMENT, true);
// If a comment has no ancestor, it is a "top-level" comment as opposed to a reply-type comment.
// Print all top-level comments along with any replies they may have.
for (Comment comment : (Iterable<Comment>) comments) {
if (comment.getAncestor() == null) {
System.out.println("Top-level comment:");
System.out.println("\t\"{comment.GetText().Trim()}\", by {comment.Author}");
System.out.println("Has {comment.Replies.Count} replies");
for (Comment commentReply : comment.getReplies()) {
System.out.println("\t\"{commentReply.GetText().Trim()}\", by {commentReply.Author}");
}
System.out.println();
}
}nextPreOrder | → inherited from Node |
public Node nextPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to traverse the document's node tree using the pre-order traversal algorithm, and delete any encountered shape with an image.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
Node curNode = doc;
while (curNode != null) {
Node nextNode = curNode.nextPreOrder(doc);
if (curNode.previousPreOrder(doc) != null && nextNode != null)
Assert.assertEquals(curNode, nextNode.previousPreOrder(doc));
if (curNode.getNodeType() == NodeType.SHAPE && ((Shape) curNode).hasImage())
curNode.remove();
curNode = nextNode;
}
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));previousPreOrder | → inherited from Node |
public Node previousPreOrder(Node rootNode) | |
rootNode - The top node (limit) of traversal.Example:
Shows how to traverse the document's node tree using the pre-order traversal algorithm, and delete any encountered shape with an image.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
Node curNode = doc;
while (curNode != null) {
Node nextNode = curNode.nextPreOrder(doc);
if (curNode.previousPreOrder(doc) != null && nextNode != null)
Assert.assertEquals(curNode, nextNode.previousPreOrder(doc));
if (curNode.getNodeType() == NodeType.SHAPE && ((Shape) curNode).hasImage())
curNode.remove();
curNode = nextNode;
}
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));remove | → inherited from Node |
public void remove() | |
Example:
Shows how to delete all shapes with images from a document.
Document doc = new Document(getMyDir() + "Images.docx");
ArrayList<Shape> shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(9, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));
for (Shape shape : shapes)
if (shape.hasImage())
shape.remove();
shapes = (ArrayList<Shape>) IterableUtils.toList(doc.getChildNodes(NodeType.SHAPE, true));
Assert.assertEquals(0, IterableUtils.countMatches(shapes, s -> {
try {
return s.hasImage();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}));Example:
Shows how to remove all child nodes of a specific type from a composite node.
Document doc = new Document(getMyDir() + "Tables.docx");
Assert.assertEquals(2, doc.getChildNodes(NodeType.TABLE, true).getCount());
Node curNode = doc.getFirstSection().getBody().getFirstChild();
while (curNode != null) {
// Save the next sibling node as a variable in case we want to move to it after deleting this node.
Node nextNode = curNode.getNextSibling();
// A section body can contain Paragraph and Table nodes.
// If the node is a Table, remove it from the parent.
if (curNode.getNodeType() == NodeType.TABLE) {
curNode.remove();
}
curNode = nextNode;
}
Assert.assertEquals(0, doc.getChildNodes(NodeType.TABLE, true).getCount());removeAllChildren | → inherited from CompositeNode |
public void removeAllChildren() | |
Example:
Shows how to construct an Aspose.Words document by hand.
Document doc = new Document();
// A blank document contains one section, one body and one paragraph.
// Call the "RemoveAllChildren" method to remove all those nodes,
// and end up with a document node with no children.
doc.removeAllChildren();
// This document now has no composite child nodes that we can add content to.
// If we wish to edit it, we will need to repopulate its node collection.
// First, create a new section, and then append it as a child to the root document node.
Section section = new Section(doc);
doc.appendChild(section);
// Set some page setup properties for the section.
section.getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
section.getPageSetup().setPaperSize(PaperSize.LETTER);
// A section needs a body, which will contain and display all its contents
// on the page between the section's header and footer.
Body body = new Body(doc);
section.appendChild(body);
// Create a paragraph, set some formatting properties, and then append it as a child to the body.
Paragraph para = new Paragraph(doc);
para.getParagraphFormat().setStyleName("Heading 1");
para.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
body.appendChild(para);
// Finally, add some content to do the document. Create a run,
// set its appearance and contents, and then append it as a child to the paragraph.
Run run = new Run(doc);
run.setText("Hello World!");
run.getFont().setColor(Color.RED);
para.appendChild(run);
Assert.assertEquals("Hello World!", doc.getText().trim());
doc.save(getArtifactsDir() + "Section.CreateManually.docx");removeSmartTags | → inherited from CompositeNode |
public void removeSmartTags() | |
Example:
Shows how to create smart tags.
public void create() throws Exception {
Document doc = new Document();
// A smart tag appears in a document with Microsoft Word recognizes a part of its text as some form of data,
// such as a name, date, or address, and converts it to a hyperlink that displays a purple dotted underline.
SmartTag smartTag = new SmartTag(doc);
// Smart tags are composite nodes that contain their recognized text in its entirety.
// Add contents to this smart tag manually.
smartTag.appendChild(new Run(doc, "May 29, 2019"));
// Microsoft Word may recognize the above contents as being a date.
// Smart tags use the "Element" property to reflect the type of data they contain.
smartTag.setElement("date");
// Some smart tag types process their contents further into custom XML properties.
smartTag.getProperties().add(new CustomXmlProperty("Day", "", "29"));
smartTag.getProperties().add(new CustomXmlProperty("Month", "", "5"));
smartTag.getProperties().add(new CustomXmlProperty("Year", "", "2019"));
// Set the smart tag's URI to the default value.
smartTag.setUri("urn:schemas-microsoft-com:office:smarttags");
doc.getFirstSection().getBody().getFirstParagraph().appendChild(smartTag);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(new Run(doc, " is a date. "));
// Create another smart tag for a stock ticker.
smartTag = new SmartTag(doc);
smartTag.setElement("stockticker");
smartTag.setUri("urn:schemas-microsoft-com:office:smarttags");
smartTag.appendChild(new Run(doc, "MSFT"));
doc.getFirstSection().getBody().getFirstParagraph().appendChild(smartTag);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(new Run(doc, " is a stock ticker."));
// Print all the smart tags in our document using a document visitor.
doc.accept(new SmartTagPrinter());
// Older versions of Microsoft Word support smart tags.
doc.save(getArtifactsDir() + "SmartTag.Create.doc");
// Use the "RemoveSmartTags" method to remove all smart tags from a document.
Assert.assertEquals(2, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
doc.removeSmartTags();
Assert.assertEquals(0, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
}
/// <summary>
/// Prints visited smart tags and their contents.
/// </summary>
private static class SmartTagPrinter extends DocumentVisitor {
/// <summary>
/// Called when a SmartTag node is encountered in the document.
/// </summary>
public /*override*/ /*VisitorAction*/int visitSmartTagStart(SmartTag smartTag) {
System.out.println("Smart tag type: {smartTag.Element}");
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when the visiting of a SmartTag node is ended.
/// </summary>
public /*override*/ /*VisitorAction*/int visitSmartTagEnd(SmartTag smartTag) {
System.out.println("\tContents: \"{smartTag.ToString(SaveFormat.Text)}\"");
if (smartTag.getProperties().getCount() == 0) {
System.out.println("\tContains no properties");
} else {
System.out.println("\tProperties: ");
String[] properties = new String[smartTag.getProperties().getCount()];
int index = 0;
for (CustomXmlProperty cxp : smartTag.getProperties())
properties[index++] = MessageFormat.format("\"{0}\" = \"{1}\"", cxp.getName(), cxp.getValue());
System.out.println(StringUtils.join(properties, ", "));
}
return VisitorAction.CONTINUE;
}
}Example:
Removes all smart tags from descendant nodes of a composite node.Document doc = new Document(getMyDir() + "Smart tags.doc"); Assert.assertEquals(8, doc.getChildNodes(NodeType.SMART_TAG, true).getCount()); doc.removeSmartTags(); Assert.assertEquals(0, doc.getChildNodes(NodeType.SMART_TAG, true).getCount());
selectNodes | → inherited from CompositeNode |
public NodeList selectNodes(java.lang.String xpath) | |
Only expressions with element names are supported at the moment. Expressions that use attribute names are not supported.
xpath - The XPath expression.Example:
Shows how to select certain nodes by using an XPath expression.
Document doc = new Document(getMyDir() + "Tables.docx");
// This expression will extract all paragraph nodes,
// which are descendants of any table node in the document.
NodeList nodeList = doc.selectNodes("//Table//Paragraph");
// Iterate through the list with an enumerator and print the contents of every paragraph in each cell of the table.
int index = 0;
Iterator<Node> e = nodeList.iterator();
while (e.hasNext()) {
Node currentNode = e.next();
System.out.println(MessageFormat.format("Table paragraph index {0}, contents: \"{1}\"", index++, currentNode.getText().trim()));
}
// This expression will select any paragraphs that are direct children of any Body node in the document.
nodeList = doc.selectNodes("//Body/Paragraph");
// We can treat the list as an array.
Assert.assertEquals(nodeList.toArray().length, 4);
// Use SelectSingleNode to select the first result of the same expression as above.
Node node = doc.selectSingleNode("//Body/Paragraph");
Assert.assertEquals(Paragraph.class, node.getClass());Example:
Shows how to use an XPath expression to test whether a node is inside a field.
Document doc = new Document(getMyDir() + "Mail merge destination - Northwind employees.docx");
// The NodeList that results from this XPath expression will contain all nodes we find inside a field.
// However, FieldStart and FieldEnd nodes can be on the list if there are nested fields in the path.
// Currently does not find rare fields in which the FieldCode or FieldResult spans across multiple paragraphs.
NodeList resultList =
doc.selectNodes("//FieldStart/following-sibling::node()[following-sibling::FieldEnd]");
Run[] runs = Arrays.stream(resultList.toArray()).filter(n -> n.getNodeType() == NodeType.RUN).toArray(Run[]::new);
Run run = runs[0];
// Check if the specified run is one of the nodes that are inside the field.
System.out.println(MessageFormat.format("Contents of the first Run node that''s part of a field: {0}", run.getText().trim()));selectSingleNode | → inherited from CompositeNode |
public Node selectSingleNode(java.lang.String xpath) | |
Only expressions with element names are supported at the moment. Expressions that use attribute names are not supported.
xpath - The XPath expression.null if no matching node is found.Example:
Shows how to select certain nodes by using an XPath expression.
Document doc = new Document(getMyDir() + "Tables.docx");
// This expression will extract all paragraph nodes,
// which are descendants of any table node in the document.
NodeList nodeList = doc.selectNodes("//Table//Paragraph");
// Iterate through the list with an enumerator and print the contents of every paragraph in each cell of the table.
int index = 0;
Iterator<Node> e = nodeList.iterator();
while (e.hasNext()) {
Node currentNode = e.next();
System.out.println(MessageFormat.format("Table paragraph index {0}, contents: \"{1}\"", index++, currentNode.getText().trim()));
}
// This expression will select any paragraphs that are direct children of any Body node in the document.
nodeList = doc.selectNodes("//Body/Paragraph");
// We can treat the list as an array.
Assert.assertEquals(nodeList.toArray().length, 4);
// Use SelectSingleNode to select the first result of the same expression as above.
Node node = doc.selectSingleNode("//Body/Paragraph");
Assert.assertEquals(Paragraph.class, node.getClass());toString | → inherited from Node |
public java.lang.String toString(SaveOptions saveOptions) throws java.lang.Exception | |
saveOptions - Specifies the options that control how the node is saved.Example:
Exports the content of a node to String in HTML format.
Document doc = new Document(getMyDir() + "Document.docx");
Node node = doc.getLastSection().getBody().getLastParagraph();
// When we call the ToString method using the html SaveFormat overload,
// it converts the node's contents to their raw html representation.
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%; font-size:12pt\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(SaveFormat.HTML));
// We can also modify the result of this conversion using a SaveOptions object.
HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setExportRelativeFontSize(true);
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(saveOptions));toString | → inherited from Node |
public java.lang.String toString(int saveFormat)
throws java.lang.Exception | |
saveFormat - A SaveFormat value.Example:
Shows how to extract the list labels of all paragraphs that are list items.
Document doc = new Document(getMyDir() + "Rendering.docx");
doc.updateListLabels();
int listParaCount = 1;
for (Paragraph paragraph : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
// Find if we have the paragraph list. In our document, our list uses plain Arabic numbers,
// which start at three and ends at six.
if (paragraph.getListFormat().isListItem()) {
System.out.println(MessageFormat.format("List item paragraph #{0}", listParaCount));
// This is the text we get when getting when we output this node to text format.
// This text output will omit list labels. Trim any paragraph formatting characters.
String paragraphText = paragraph.toString(SaveFormat.TEXT).trim();
System.out.println("Exported Text: " + paragraphText);
ListLabel label = paragraph.getListLabel();
// This gets the position of the paragraph in the current level of the list. If we have a list with multiple levels,
// this will tell us what position it is on that level.
System.out.println("\tNumerical Id: {label.LabelValue}");
// Combine them together to include the list label with the text in the output.
System.out.println("\tList label combined with text: {label.LabelString} {paragraphText}");
}
}Example:
Exports the content of a node to String in HTML format.
Document doc = new Document(getMyDir() + "Document.docx");
Node node = doc.getLastSection().getBody().getLastParagraph();
// When we call the ToString method using the html SaveFormat overload,
// it converts the node's contents to their raw html representation.
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%; font-size:12pt\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(SaveFormat.HTML));
// We can also modify the result of this conversion using a SaveOptions object.
HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setExportRelativeFontSize(true);
Assert.assertEquals("<p style=\"margin-top:0pt; margin-bottom:8pt; line-height:108%\">" +
"<span style=\"font-family:'Times New Roman'\">Hello World!</span>" +
"</p>", node.toString(saveOptions));Example:
Shows the difference between calling the GetText and ToString methods on a node.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertField("MERGEFIELD Field");
// GetText will retrieve the visible text as well as field codes and special characters.
Assert.assertEquals("\u0013MERGEFIELD Field\u0014«Field»\u0015\f", doc.getText());
// ToString will give us the document's appearance if saved to a passed save format.
Assert.assertEquals("«Field»\r\n", doc.toString(SaveFormat.TEXT));