From: Yegor Kozlov Date: Sun, 25 Dec 2011 11:09:29 +0000 (+0000) Subject: patch from Bugzilla 52200: updated XWPF table example code X-Git-Tag: REL_3_8_FINAL~93 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=8c4165d75dc9a13c17da1354136e525c1b5dfdca;p=poi.git patch from Bugzilla 52200: updated XWPF table example code git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1224605 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 8b53179187..3a3d523b9d 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52200 - Updated XWPF table example code 52378 - Support for WORKDAY and NETWORKDAYS functions 52349 - Merge the logic between the TEXT function and DataFormatter 52349 - Correctly support excel style date format strings in the TEXT function diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java index d3ff829963..5f049ba0ac 100644 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java @@ -17,40 +17,183 @@ package org.apache.poi.xwpf.usermodel; import java.io.FileOutputStream; +import java.math.BigInteger; +import java.util.List; + +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTString; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalJc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; /** - * A simple WOrdprocessingML table created by POI XWPF API + * This program creates a simple WordprocessingML table using POI XWPF API, and + * a more complex, styled table using both XWPF and ooxml-schema. It's possible + * that not all referenced wordprocessingml classes are defined in + * poi-ooxml-schemas-3.8-beta4. If this is the case, you'll need to use the full + * ooxml-schemas.jar library. * - * @author gisella bronzetti + * @author gisella bronzetti (original) + * @author Gregg Morris (styled table) */ public class SimpleTable { public static void main(String[] args) throws Exception { + try { + createSimpleTable(); + } + catch(Exception e) { + System.out.println("Error trying to create simple table."); + throw(e); + } + try { + createStyledTable(); + } + catch(Exception e) { + System.out.println("Error trying to create styled table."); + throw(e); + } + } + + public static void createSimpleTable() throws Exception { XWPFDocument doc = new XWPFDocument(); - XWPFTable table=doc.createTable(3,3); - + XWPFTable table = doc.createTable(3, 3); + table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE"); - - - XWPFParagraph p1 = doc.createParagraph(); + + // table cells have a list of paragraphs; there is an initial + // paragraph created when the cell is created. If you create a + // paragraph in the document to put in the cell, it will also + // appear in the document following the table, which is probably + // not the desired result. + XWPFParagraph p1 = table.getRow(0).getCell(0).getParagraphs().get(0); XWPFRun r1 = p1.createRun(); r1.setBold(true); r1.setText("The quick brown fox"); - r1.setBold(true); + r1.setItalic(true); r1.setFontFamily("Courier"); r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH); r1.setTextPosition(100); - table.getRow(0).getCell(0).setParagraph(p1); - - table.getRow(2).getCell(2).setText("only text"); FileOutputStream out = new FileOutputStream("simpleTable.docx"); doc.write(out); out.close(); + } + + /** + * Create a table with some row and column styling. I "manually" add the + * style name to the table, but don't check to see if the style actually + * exists in the document. Since I'm creating it from scratch, it obviously + * won't exist. When opened in MS Word, the table style becomes "Normal". + * I manually set alternating row colors. This could be done using Themes, + * but that's left as an exercise for the reader. The cells in the last + * column of the table have 10pt. "Courier" font. + * I make no claims that this is the "right" way to do it, but it worked + * for me. Given the scarcity of XWPF examples, I thought this may prove + * instructive and give you ideas for your own solutions. + + * @throws Exception + */ + public static void createStyledTable() throws Exception { + // Create a new document from scratch + XWPFDocument doc = new XWPFDocument(); + // -- OR -- + // open an existing empty document with styles already defined + //XWPFDocument doc = new XWPFDocument(new FileInputStream("base_document.docx")); + + // Create a new table with 6 rows and 3 columns + int nRows = 6; + int nCols = 3; + XWPFTable table = doc.createTable(nRows, nCols); + + // Set the table style. If the style is not defined, the table style + // will become "Normal". + CTTblPr tblPr = table.getCTTbl().getTblPr(); + CTString styleStr = tblPr.addNewTblStyle(); + styleStr.setVal("StyledTable"); + + // Get a list of the rows in the table + List rows = table.getRows(); + int rowCt = 0; + int colCt = 0; + for (XWPFTableRow row : rows) { + // get table row properties (trPr) + CTTrPr trPr = row.getCtRow().addNewTrPr(); + // set row height; units = twentieth of a point, 360 = 0.25" + CTHeight ht = trPr.addNewTrHeight(); + ht.setVal(BigInteger.valueOf(360)); + + // get the cells in this row + List cells = row.getTableCells(); + // add content to each cell + for (XWPFTableCell cell : cells) { + // get a table cell properties element (tcPr) + CTTcPr tcpr = cell.getCTTc().addNewTcPr(); + // set vertical alignment to "center" + CTVerticalJc va = tcpr.addNewVAlign(); + va.setVal(STVerticalJc.CENTER); + // create cell color element + CTShd ctshd = tcpr.addNewShd(); + ctshd.setColor("auto"); + ctshd.setVal(STShd.CLEAR); + if (rowCt == 0) { + // header row + ctshd.setFill("A7BFDE"); + } + else if (rowCt % 2 == 0) { + // even row + ctshd.setFill("D3DFEE"); + } + else { + // odd row + ctshd.setFill("EDF2F8"); + } + + // get 1st paragraph in cell's paragraph list + XWPFParagraph para = cell.getParagraphs().get(0); + // create a run to contain the content + XWPFRun rh = para.createRun(); + // style cell as desired + if (colCt == nCols - 1) { + // last column is 10pt Courier + rh.setFontSize(10); + rh.setFontFamily("Courier"); + } + if (rowCt == 0) { + // header row + rh.setText("header row, col " + colCt); + rh.setBold(true); + para.setAlignment(ParagraphAlignment.CENTER); + } + else if (rowCt % 2 == 0) { + // even row + rh.setText("row " + rowCt + ", col " + colCt); + para.setAlignment(ParagraphAlignment.LEFT); + } + else { + // odd row + rh.setText("row " + rowCt + ", col " + colCt); + para.setAlignment(ParagraphAlignment.LEFT); + } + colCt++; + } // for cell + colCt = 0; + rowCt++; + } // for row + + // write the file + FileOutputStream out = new FileOutputStream("styledTable.docx"); + doc.write(out); + out.close(); } + }