From ce6c566c4c751bad3a13d7f3ae0c712d2c61e024 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Tue, 7 Feb 2012 09:41:52 +0000 Subject: [PATCH] Bugzilla 52566: added methods to set/get vertical alignment and color in XWPFTableCell git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1241393 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/xwpf/usermodel/XWPFTableCell.java | 92 ++++++++++++++++++- .../poi/xwpf/usermodel/TestXWPFTableCell.java | 87 ++++++++++++++++++ 3 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTableCell.java diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 718e7a3b6..68d7792bc 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52566 - Added methods to set/get vertical alignment and color in XWPFTableCell 52562 - Added methods to get/set a table row's Can't Split and Repeat Header attributes in XWPF 52561 - Added methods to set table inside borders and cell margins in XWPF 52569 - Support DConRefRecord in HSSF diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java index a28a963db..db4c6daa4 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java @@ -18,6 +18,8 @@ package org.apache.poi.xwpf.usermodel; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import org.apache.poi.POIXMLDocumentPart; @@ -26,10 +28,21 @@ import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalJc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; - +/** + * XWPFTableCell class. + * + * @author Gregg Morris (gregg dot morris at gmail dot com) - added XWPFVertAlign enum, + * setColor(), + * setVerticalAlignment() + */ public class XWPFTableCell implements IBody { private final CTTc ctTc; protected List paragraphs = null; @@ -37,6 +50,28 @@ public class XWPFTableCell implements IBody { protected List bodyElements = null; protected IBody part; private XWPFTableRow tableRow = null; + // Create a map from this XWPF-level enum to the STVerticalJc.Enum values + public static enum XWPFVertAlign { TOP, CENTER, BOTH, BOTTOM }; + private static EnumMap alignMap; + // Create a map from the STVerticalJc.Enum values to the XWPF-level enums + private static HashMap stVertAlignTypeMap; + + static { + // populate enum maps + alignMap = new EnumMap(XWPFVertAlign.class); + alignMap.put(XWPFVertAlign.TOP, STVerticalJc.Enum.forInt(STVerticalJc.INT_TOP)); + alignMap.put(XWPFVertAlign.CENTER, STVerticalJc.Enum.forInt(STVerticalJc.INT_CENTER)); + alignMap.put(XWPFVertAlign.BOTH, STVerticalJc.Enum.forInt(STVerticalJc.INT_BOTH)); + alignMap.put(XWPFVertAlign.BOTTOM, STVerticalJc.Enum.forInt(STVerticalJc.INT_BOTTOM)); + + stVertAlignTypeMap = new HashMap(); + stVertAlignTypeMap.put(STVerticalJc.INT_TOP, XWPFVertAlign.TOP); + stVertAlignTypeMap.put(STVerticalJc.INT_CENTER, XWPFVertAlign.CENTER); + stVertAlignTypeMap.put(STVerticalJc.INT_BOTH, XWPFVertAlign.BOTH); + stVertAlignTypeMap.put(STVerticalJc.INT_BOTTOM, XWPFVertAlign.BOTTOM); + + } + /** * If a table cell does not include at least one block-level element, then this document shall be considered corrupt */ @@ -151,6 +186,59 @@ public class XWPFTableCell implements IBody { return tableRow; } + /** + * Set cell color. This sets some associated values; for finer control + * you may want to access these elements individually. + * @param rgbStr - the desired cell color, in the hex form "RRGGBB". + */ + public void setColor(String rgbStr) { + CTTcPr tcpr = ctTc.isSetTcPr() ? ctTc.getTcPr() : ctTc.addNewTcPr(); + CTShd ctshd = tcpr.isSetShd() ? tcpr.getShd() : tcpr.addNewShd(); + ctshd.setColor("auto"); + ctshd.setVal(STShd.CLEAR); + ctshd.setFill(rgbStr); + } + + /** + * Get cell color. Note that this method only returns the "fill" value. + * @return RGB string of cell color + */ + public String getColor() { + String color = null; + CTTcPr tcpr = ctTc.getTcPr(); + if (tcpr != null) { + CTShd ctshd = tcpr.getShd(); + if (ctshd != null) { + color = ctshd.xgetFill().getStringValue(); + } + } + return color; + } + + /** + * Set the vertical alignment of the cell. + * @param vAlign - the desired alignment enum value + */ + public void setVerticalAlignment(XWPFVertAlign vAlign) { + CTTcPr tcpr = ctTc.isSetTcPr() ? ctTc.getTcPr() : ctTc.addNewTcPr(); + CTVerticalJc va = tcpr.addNewVAlign(); + va.setVal(alignMap.get(vAlign)); + } + + /** + * Get the vertical alignment of the cell. + * @return the cell alignment enum value + */ + public XWPFVertAlign getVerticalAlignment() { + XWPFVertAlign vAlign = null; + CTTcPr tcpr = ctTc.getTcPr(); + if (ctTc != null) { + CTVerticalJc va = tcpr.getVAlign(); + vAlign = stVertAlignTypeMap.get(va.getVal().intValue()); + } + return vAlign; + } + /** * add a new paragraph at position of the cursor * @param cursor @@ -346,7 +434,7 @@ public class XWPFTableCell implements IBody { return null; } XWPFTableRow tableRow = table.getRow(row); - if(row == null){ + if (tableRow == null) { return null; } return tableRow.getTableCell(cell); diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTableCell.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTableCell.java new file mode 100644 index 000000000..cf28ffd0c --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTableCell.java @@ -0,0 +1,87 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.xwpf.usermodel; + +import junit.framework.TestCase; + +import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalJc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; + +public class TestXWPFTableCell extends TestCase { + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + public void testSetGetVertAlignment() throws Exception { + // instantiate the following classes so they'll get picked up by + // the XmlBean process and added to the jar file. they are required + // for the following XWPFTableCell methods. + CTShd ctShd = CTShd.Factory.newInstance(); + assertNotNull(ctShd); + CTVerticalJc ctVjc = CTVerticalJc.Factory.newInstance(); + assertNotNull(ctVjc); + STShd stShd = STShd.Factory.newInstance(); + assertNotNull(stShd); + STVerticalJc stVjc = STVerticalJc.Factory.newInstance(); + assertNotNull(stVjc); + + // create a table + XWPFDocument doc = new XWPFDocument(); + CTTbl ctTable = CTTbl.Factory.newInstance(); + XWPFTable table = new XWPFTable(ctTable, doc); + // table has a single row by default; grab it + XWPFTableRow tr = table.getRow(0); + assertNotNull(tr); + // row has a single cell by default; grab it + XWPFTableCell cell = tr.getCell(0); + + cell.setVerticalAlignment(XWPFVertAlign.BOTH); + XWPFVertAlign al = cell.getVerticalAlignment(); + assertEquals(XWPFVertAlign.BOTH, al); + } + + public void testSetGetColor() throws Exception { + // create a table + XWPFDocument doc = new XWPFDocument(); + CTTbl ctTable = CTTbl.Factory.newInstance(); + XWPFTable table = new XWPFTable(ctTable, doc); + // table has a single row by default; grab it + XWPFTableRow tr = table.getRow(0); + assertNotNull(tr); + // row has a single cell by default; grab it + XWPFTableCell cell = tr.getCell(0); + + cell.setColor("F0000F"); + String clr = cell.getColor(); + assertEquals("F0000F", clr); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + +}