support for tables and hyperlinks in XSLF
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1158611 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
67354d6ff4
commit
9882382c80
@ -32,8 +32,8 @@
|
||||
</header>
|
||||
|
||||
<body>
|
||||
<section><title>6 June 2011 - POI 3.8 beta 3 available</title>
|
||||
<p>The Apache POI team is pleased to announce the release of 3.8 beta 3.
|
||||
<section><title>22 August 2011 - POI 3.8 beta 4 available</title>
|
||||
<p>The Apache POI team is pleased to announce the release of 3.8 beta 4.
|
||||
This includes a large number of bug fixes and enhancements.
|
||||
</p>
|
||||
<p>A full list of changes is available in the <link href="changes.html">change log</link>.
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
<changes>
|
||||
<release version="3.8-beta4" date="2011-??-??">
|
||||
<action dev="poi-developers" type="add">support for tables and hyperlinks</action>
|
||||
<action dev="poi-developers" type="fix">51535 - correct signed vs unsigned short reading in NDocumentInputStream</action>
|
||||
<action dev="poi-developers" type="add">51634 - support SXSSF streaming from templates</action>
|
||||
<action dev="poi-developers" type="add">initial support for XSLF usermodel API</action>
|
||||
|
@ -48,19 +48,10 @@ import java.util.List;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFAutoShape extends XSLFSimpleShape {
|
||||
private final List<XSLFTextParagraph> _paragraphs;
|
||||
public class XSLFAutoShape extends XSLFTextShape {
|
||||
|
||||
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
||||
super(shape, sheet);
|
||||
|
||||
_paragraphs = new ArrayList<XSLFTextParagraph>();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBody txBody = shape.getTxBody();
|
||||
for (CTTextParagraph p : txBody.getPList()) {
|
||||
_paragraphs.add(new XSLFTextParagraph(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/
|
||||
@ -74,36 +65,6 @@ public class XSLFAutoShape extends XSLFSimpleShape {
|
||||
}
|
||||
}
|
||||
|
||||
// textual properties
|
||||
public String getText() {
|
||||
StringBuilder out = new StringBuilder();
|
||||
for (XSLFTextParagraph p : _paragraphs) {
|
||||
if (out.length() > 0) out.append('\n');
|
||||
out.append(p.getText());
|
||||
}
|
||||
return out.toString();
|
||||
}
|
||||
|
||||
public List<XSLFTextParagraph> getTextParagraphs() {
|
||||
return _paragraphs;
|
||||
}
|
||||
|
||||
public XSLFTextParagraph addNewTextParagraph() {
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
CTTextBody txBody;
|
||||
if (!shape.isSetTxBody()) {
|
||||
txBody = shape.addNewTxBody();
|
||||
txBody.addNewBodyPr();
|
||||
txBody.addNewLstStyle();
|
||||
} else {
|
||||
txBody = shape.getTxBody();
|
||||
}
|
||||
CTTextParagraph p = txBody.addNewP();
|
||||
XSLFTextParagraph paragraph = new XSLFTextParagraph(p);
|
||||
_paragraphs.add(paragraph);
|
||||
return paragraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param shapeId 1-based shapeId
|
||||
*/
|
||||
@ -160,268 +121,15 @@ public class XSLFAutoShape extends XSLFSimpleShape {
|
||||
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the type of vertical alignment for the text.
|
||||
* One of the <code>Anchor*</code> constants defined in this class.
|
||||
*
|
||||
* @param anchor - the type of alignment. Default is {@link VerticalAlignment#TOP}
|
||||
*/
|
||||
public void setVerticalAlignment(VerticalAlignment anchor){
|
||||
protected CTTextBody getTextBody(boolean create){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(anchor == null) {
|
||||
if(bodyPr.isSetAnchor()) bodyPr.unsetAnchor();
|
||||
} else {
|
||||
bodyPr.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of vertical alignment for the text.
|
||||
*
|
||||
* @return the type of alignment
|
||||
*/
|
||||
public VerticalAlignment getVerticalAlignment(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
STTextAnchoringType.Enum val = shape.getTxBody().getBodyPr().getAnchor();
|
||||
if(val != null){
|
||||
return VerticalAlignment.values()[val.intValue() - 1];
|
||||
}
|
||||
}
|
||||
return VerticalAlignment.TOP;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param orientation vertical orientation of the text
|
||||
*/
|
||||
public void setTextDirection(TextDirection orientation){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(orientation == null) {
|
||||
if(bodyPr.isSetVert()) bodyPr.unsetVert();
|
||||
} else {
|
||||
bodyPr.setVert(STTextVerticalType.Enum.forInt(orientation.ordinal() + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return vertical orientation of the text
|
||||
*/
|
||||
public TextDirection getTextDirection(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
STTextVerticalType.Enum val = shape.getTxBody().getBodyPr().getVert();
|
||||
if(val != null){
|
||||
return TextDirection.values()[val.intValue() - 1];
|
||||
}
|
||||
}
|
||||
return TextDirection.HORIZONTAL;
|
||||
}
|
||||
/**
|
||||
* Returns the distance (in points) between the bottom of the text frame
|
||||
* and the bottom of the inscribed rectangle of the shape that contains the text.
|
||||
*
|
||||
* @return the bottom margin or -1 if not set
|
||||
*/
|
||||
public double getMarginBottom(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
return bodyPr.isSetBIns() ? Units.toPoints(bodyPr.getBIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the left edge of the text frame
|
||||
* and the left edge of the inscribed rectangle of the shape that contains
|
||||
* the text.
|
||||
*
|
||||
* @return the left margin
|
||||
*/
|
||||
public double getMarginLeft(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
return bodyPr.isSetLIns() ? Units.toPoints(bodyPr.getLIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the right edge of the
|
||||
* text frame and the right edge of the inscribed rectangle of the shape
|
||||
* that contains the text.
|
||||
*
|
||||
* @return the right margin
|
||||
*/
|
||||
public double getMarginRight(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
return bodyPr.isSetRIns() ? Units.toPoints(bodyPr.getRIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the top of the text frame
|
||||
* and the top of the inscribed rectangle of the shape that contains the text.
|
||||
*
|
||||
* @return the top margin
|
||||
*/
|
||||
public double getMarginTop(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
return bodyPr.isSetTIns() ? Units.toPoints(bodyPr.getTIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the botom margin.
|
||||
* @see #getMarginBottom()
|
||||
*
|
||||
* @param margin the bottom margin
|
||||
*/
|
||||
public void setMarginBottom(double margin){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(margin == -1) bodyPr.unsetBIns();
|
||||
else bodyPr.setBIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the left margin.
|
||||
* @see #getMarginLeft()
|
||||
*
|
||||
* @param margin the left margin
|
||||
*/
|
||||
public void setMarginLeft(double margin){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(margin == -1) bodyPr.unsetLIns();
|
||||
else bodyPr.setLIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the right margin.
|
||||
* @see #getMarginRight()
|
||||
*
|
||||
* @param margin the right margin
|
||||
*/
|
||||
public void setMarginRight(double margin){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(margin == -1) bodyPr.unsetRIns();
|
||||
else bodyPr.setRIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the top margin.
|
||||
* @see #getMarginTop()
|
||||
*
|
||||
* @param margin the top margin
|
||||
*/
|
||||
public void setMarginTop(double margin){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(margin == -1) bodyPr.unsetTIns();
|
||||
else bodyPr.setTIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the value indicating word wrap.
|
||||
* One of the <code>Wrap*</code> constants defined in this class.
|
||||
*
|
||||
* @return the value indicating word wrap
|
||||
*/
|
||||
public boolean getWordWrap(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
return shape.getTxBody().getBodyPr().getWrap() == STTextWrappingType.SQUARE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies how the text should be wrapped
|
||||
*
|
||||
* @param wrap the value indicating how the text should be wrapped
|
||||
*/
|
||||
public void setWordWrap(boolean wrap){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
shape.getTxBody().getBodyPr().setWrap(wrap ? STTextWrappingType.SQUARE : STTextWrappingType.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Specifies that a shape should be auto-fit to fully contain the text described within it.
|
||||
* Auto-fitting is when text within a shape is scaled in order to contain all the text inside
|
||||
*
|
||||
* @param value type of autofit
|
||||
*/
|
||||
public void setTextAutofit(TextAutofit value){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(bodyPr.isSetSpAutoFit()) bodyPr.unsetSpAutoFit();
|
||||
if(bodyPr.isSetNoAutofit()) bodyPr.unsetNoAutofit();
|
||||
if(bodyPr.isSetNormAutofit()) bodyPr.unsetNormAutofit();
|
||||
|
||||
switch(value){
|
||||
case NONE: bodyPr.addNewNoAutofit(); break;
|
||||
case NORMAL: bodyPr.addNewNormAutofit(); break;
|
||||
case SHAPE: bodyPr.addNewSpAutoFit(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return type of autofit
|
||||
*/
|
||||
public TextAutofit getTextAutofit(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (shape.isSetTxBody()) {
|
||||
CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
|
||||
if(bodyPr.isSetNoAutofit()) return TextAutofit.NONE;
|
||||
else if (bodyPr.isSetNormAutofit()) return TextAutofit.NORMAL;
|
||||
else if (bodyPr.isSetSpAutoFit()) return TextAutofit.SHAPE;
|
||||
}
|
||||
return TextAutofit.NORMAL;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
void onCopy(XSLFSheet srcSheet){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
if (!shape.isSetTxBody()) return;
|
||||
|
||||
CTPlaceholder ph = shape.getNvSpPr().getNvPr().getPh();
|
||||
if(ph == null || !ph.isSetType()) return;
|
||||
|
||||
if(ph.getType() == STPlaceholderType.TITLE){
|
||||
|
||||
CTTextBody txBody = shape.getTxBody();
|
||||
if (txBody == null && create) {
|
||||
txBody = shape.addNewTxBody();
|
||||
txBody.addNewBodyPr();
|
||||
txBody.addNewLstStyle();
|
||||
}
|
||||
return txBody;
|
||||
}
|
||||
|
||||
}
|
@ -24,6 +24,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
@ -97,4 +98,12 @@ public class XSLFDrawing {
|
||||
shape.setAnchor(new Rectangle());
|
||||
return shape;
|
||||
}
|
||||
|
||||
public XSLFTable createTable(){
|
||||
CTGraphicalObjectFrame obj = _spTree.addNewGraphicFrame();
|
||||
obj.set(XSLFTable.prototype(_shapeId++));
|
||||
XSLFTable shape = new XSLFTable(obj, _sheet);
|
||||
shape.setAnchor(new Rectangle());
|
||||
return shape;
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,10 @@ public class XSLFGraphicFrame extends XSLFShape {
|
||||
return _shape;
|
||||
}
|
||||
|
||||
public XSLFSheet getSheet(){
|
||||
return _sheet;
|
||||
}
|
||||
|
||||
public int getShapeType(){
|
||||
throw new RuntimeException("NotImplemented");
|
||||
}
|
||||
@ -64,16 +68,14 @@ public class XSLFGraphicFrame extends XSLFShape {
|
||||
throw new RuntimeException("NotImplemented");
|
||||
}
|
||||
|
||||
public ShapeGroup getParent(){
|
||||
throw new RuntimeException("NotImplemented");
|
||||
|
||||
static XSLFGraphicFrame create(CTGraphicalObjectFrame shape, XSLFSheet sheet){
|
||||
String uri = shape.getGraphic().getGraphicData().getUri();
|
||||
if(XSLFTable.TABLE_URI.equals(uri)){
|
||||
return new XSLFTable(shape, sheet);
|
||||
} else {
|
||||
return new XSLFGraphicFrame(shape, sheet);
|
||||
}
|
||||
}
|
||||
|
||||
public Shape[] getShapes(){
|
||||
throw new RuntimeException("NotImplemented");
|
||||
}
|
||||
|
||||
|
||||
public boolean removeShape(Shape shape){
|
||||
throw new RuntimeException("NotImplemented");
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
/* ====================================================================
|
||||
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.xslf.usermodel;
|
||||
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
/**
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFHyperlink {
|
||||
final XSLFTextRun _r;
|
||||
final CTHyperlink _link;
|
||||
|
||||
XSLFHyperlink(CTHyperlink link, XSLFTextRun r){
|
||||
_r = r;
|
||||
_link = link;
|
||||
}
|
||||
|
||||
@Internal
|
||||
public CTHyperlink getXmlObject(){
|
||||
return _link;
|
||||
}
|
||||
|
||||
public void setAddress(String address){
|
||||
XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
|
||||
PackageRelationship rel =
|
||||
sheet.getPackagePart().
|
||||
addExternalRelationship(address, XSLFRelation.HYPERLINK.getRelation());
|
||||
_link.setId(rel.getId());
|
||||
|
||||
}
|
||||
|
||||
public void setAddress(XSLFSlide slide){
|
||||
XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
|
||||
PackageRelationship rel =
|
||||
sheet.getPackagePart().
|
||||
addRelationship(slide.getPackagePart().getPartName(),
|
||||
TargetMode.INTERNAL,
|
||||
XSLFRelation.SLIDE.getRelation());
|
||||
_link.setId(rel.getId());
|
||||
_link.setAction("ppaction://hlinksldjump");
|
||||
}
|
||||
|
||||
@Internal
|
||||
public URI getTargetURI(){
|
||||
XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
|
||||
String id = _link.getId();
|
||||
return sheet.getPackagePart().getRelationship(id).getTargetURI();
|
||||
}
|
||||
}
|
@ -103,6 +103,13 @@ public class XSLFRelation extends POIXMLRelation {
|
||||
null, null
|
||||
);
|
||||
|
||||
public static final XSLFRelation HYPERLINK = new XSLFRelation(
|
||||
null,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
public static final XSLFRelation THEME = new XSLFRelation(
|
||||
"application/vnd.openxmlformats-officedocument.theme+xml",
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
|
||||
|
@ -41,8 +41,4 @@ public abstract class XSLFShape {
|
||||
public abstract String getShapeName();
|
||||
|
||||
public abstract int getShapeId();
|
||||
|
||||
void onCopy(XSLFSheet srcSheet){
|
||||
|
||||
}
|
||||
}
|
@ -70,7 +70,8 @@ public abstract class XSLFSheet extends POIXMLDocumentPart {
|
||||
} else if (ch instanceof CTPicture){
|
||||
shapes.add(new XSLFPictureShape((CTPicture)ch, this));
|
||||
} else if (ch instanceof CTGraphicalObjectFrame){
|
||||
shapes.add(new XSLFGraphicFrame((CTGraphicalObjectFrame)ch, this));
|
||||
XSLFGraphicFrame shape = XSLFGraphicFrame.create((CTGraphicalObjectFrame)ch, this);
|
||||
shapes.add(shape);
|
||||
}
|
||||
}
|
||||
return shapes;
|
||||
@ -147,6 +148,13 @@ public abstract class XSLFSheet extends POIXMLDocumentPart {
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFTable createTable(){
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFTable sh = getDrawing().createTable();
|
||||
shapes.add(sh);
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFShape[] getShapes(){
|
||||
return getShapeList().toArray(new XSLFShape[_shapes.size()]);
|
||||
}
|
||||
|
157
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
Normal file
157
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
Normal file
@ -0,0 +1,157 @@
|
||||
/*
|
||||
* ====================================================================
|
||||
* 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.xslf.usermodel;
|
||||
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.xmlbeans.XmlCursor;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrameNonVisual;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
/**
|
||||
* Represents a table in a .pptx presentation
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow> {
|
||||
static String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";
|
||||
|
||||
private CTTable _table;
|
||||
private List<XSLFTableRow> _rows;
|
||||
|
||||
/*package*/ XSLFTable(CTGraphicalObjectFrame shape, XSLFSheet sheet){
|
||||
super(shape, sheet);
|
||||
|
||||
for(XmlObject obj : shape.getGraphic().getGraphicData().selectPath("*")){
|
||||
if(obj instanceof CTTable){
|
||||
_table = (CTTable)obj;
|
||||
}
|
||||
}
|
||||
if(_table == null) throw new IllegalStateException("CTTable element was not found");
|
||||
|
||||
_rows = new ArrayList<XSLFTableRow>(_table.sizeOfTrArray());
|
||||
for(CTTableRow row : _table.getTrList()) _rows.add(new XSLFTableRow(row, this));
|
||||
}
|
||||
|
||||
@Internal
|
||||
public CTTable getCTTable(){
|
||||
return _table;
|
||||
}
|
||||
|
||||
public int getNumberOfColumns() {
|
||||
return _table.getTblGrid().sizeOfGridColArray();
|
||||
}
|
||||
|
||||
public int getNumberOfRows() {
|
||||
return _table.sizeOfTrArray();
|
||||
}
|
||||
|
||||
public double getColumnWidth(int idx){
|
||||
return Units.toPoints(
|
||||
_table.getTblGrid().getGridColArray(idx).getW());
|
||||
}
|
||||
|
||||
public void setColumnWidth(int idx, double width){
|
||||
_table.getTblGrid().getGridColArray(idx).setW(Units.toEMU(width));
|
||||
}
|
||||
|
||||
public Iterator<XSLFTableRow> iterator(){
|
||||
return _rows.iterator();
|
||||
}
|
||||
|
||||
public List<XSLFTableRow> getRows(){
|
||||
return Collections.unmodifiableList(_rows);
|
||||
}
|
||||
|
||||
public XSLFTableRow addRow(){
|
||||
CTTableRow tr = _table.addNewTr();
|
||||
XSLFTableRow row = new XSLFTableRow(tr, this);
|
||||
row.setHeight(20.0); // default height is 20 points
|
||||
_rows.add(row);
|
||||
return row;
|
||||
}
|
||||
|
||||
static CTGraphicalObjectFrame prototype(int shapeId){
|
||||
CTGraphicalObjectFrame frame = CTGraphicalObjectFrame.Factory.newInstance();
|
||||
CTGraphicalObjectFrameNonVisual nvGr = frame.addNewNvGraphicFramePr();
|
||||
|
||||
CTNonVisualDrawingProps cnv = nvGr.addNewCNvPr();
|
||||
cnv.setName("Table " + shapeId);
|
||||
cnv.setId(shapeId + 1);
|
||||
nvGr.addNewCNvGraphicFramePr().addNewGraphicFrameLocks().setNoGrp(true);
|
||||
nvGr.addNewNvPr();
|
||||
|
||||
frame.addNewXfrm();
|
||||
CTGraphicalObjectData gr = frame.addNewGraphic().addNewGraphicData();
|
||||
XmlCursor cursor = gr.newCursor();
|
||||
cursor.toNextToken();
|
||||
cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tbl"));
|
||||
cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tblPr"));
|
||||
cursor.toNextToken();
|
||||
cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tblGrid"));
|
||||
cursor.dispose();
|
||||
gr.setUri(TABLE_URI);
|
||||
return frame;
|
||||
}
|
||||
|
||||
public Rectangle2D getAnchor(){
|
||||
CTTransform2D xfrm = getXmlObject().getXfrm();
|
||||
CTPoint2D off = xfrm.getOff();
|
||||
long x = off.getX();
|
||||
long y = off.getY();
|
||||
CTPositiveSize2D ext = xfrm.getExt();
|
||||
long cx = ext.getCx();
|
||||
long cy = ext.getCy();
|
||||
return new Rectangle2D.Double(
|
||||
Units.toPoints(x), Units.toPoints(y),
|
||||
Units.toPoints(cx), Units.toPoints(cy));
|
||||
}
|
||||
|
||||
public void setAnchor(Rectangle2D anchor){
|
||||
CTTransform2D xfrm = getXmlObject().getXfrm();
|
||||
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
||||
long x = Units.toEMU(anchor.getX());
|
||||
long y = Units.toEMU(anchor.getY());
|
||||
off.setX(x);
|
||||
off.setY(y);
|
||||
CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm.addNewExt();
|
||||
long cx = Units.toEMU(anchor.getWidth());
|
||||
long cy = Units.toEMU(anchor.getHeight());
|
||||
ext.setCx(cx);
|
||||
ext.setCy(cy);
|
||||
}
|
||||
|
||||
}
|
290
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
Normal file
290
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
Normal file
@ -0,0 +1,290 @@
|
||||
/*
|
||||
* ====================================================================
|
||||
* 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.xslf.usermodel;
|
||||
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.Units;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Represents a cell of a table in a .pptx presentation
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFTableCell extends XSLFTextShape {
|
||||
static double defaultBorderWidth = 1.0;
|
||||
|
||||
/*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){
|
||||
super(cell, sheet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CTTableCell getXmlObject(){
|
||||
return (CTTableCell)super.getXmlObject();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CTTextBody getTextBody(boolean create){
|
||||
CTTableCell cell = getXmlObject();
|
||||
CTTextBody txBody = cell.getTxBody();
|
||||
if (txBody == null && create) {
|
||||
txBody = cell.addNewTxBody();
|
||||
txBody.addNewBodyPr();
|
||||
txBody.addNewLstStyle();
|
||||
}
|
||||
return txBody;
|
||||
}
|
||||
|
||||
static CTTableCell prototype() {
|
||||
CTTableCell cell = CTTableCell.Factory.newInstance();
|
||||
CTTableCellProperties pr = cell.addNewTcPr();
|
||||
pr.addNewLnL().addNewNoFill();
|
||||
pr.addNewLnR().addNewNoFill();
|
||||
pr.addNewLnT().addNewNoFill();
|
||||
pr.addNewLnB().addNewNoFill();
|
||||
return cell;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMarginLeft(double margin){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
||||
|
||||
pr.setMarL(Units.toEMU(margin));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMarginRight(double margin){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
||||
|
||||
pr.setMarR(Units.toEMU(margin));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMarginTop(double margin){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
||||
|
||||
pr.setMarT(Units.toEMU(margin));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMarginBottom(double margin){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
||||
|
||||
pr.setMarB(Units.toEMU(margin));
|
||||
}
|
||||
|
||||
public void setBorderLeft(double width){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
|
||||
ln.setW(Units.toEMU(width));
|
||||
}
|
||||
|
||||
public double getBorderLeft(){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.getLnL();
|
||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||
}
|
||||
|
||||
public void setBorderLeftColor(Color color){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
|
||||
setLineColor(ln, color);
|
||||
}
|
||||
|
||||
public Color getBorderLeftColor(){
|
||||
return getLineColor(getXmlObject().getTcPr().getLnL());
|
||||
}
|
||||
|
||||
public void setBorderRight(double width){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
|
||||
ln.setW(Units.toEMU(width));
|
||||
}
|
||||
|
||||
public double getBorderRight(){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.getLnR();
|
||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||
}
|
||||
|
||||
public void setBorderRightColor(Color color){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
|
||||
setLineColor(ln, color);
|
||||
}
|
||||
|
||||
public Color getBorderRightColor(){
|
||||
return getLineColor(getXmlObject().getTcPr().getLnR());
|
||||
}
|
||||
|
||||
public void setBorderTop(double width){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
|
||||
ln.setW(Units.toEMU(width));
|
||||
}
|
||||
|
||||
public double getBorderTop(){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.getLnT();
|
||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||
}
|
||||
|
||||
public void setBorderTopColor(Color color){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
|
||||
setLineColor(ln, color);
|
||||
}
|
||||
|
||||
public Color getBorderTopColor(){
|
||||
return getLineColor(getXmlObject().getTcPr().getLnT());
|
||||
}
|
||||
|
||||
public void setBorderBottom(double width){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
|
||||
ln.setW(Units.toEMU(width));
|
||||
}
|
||||
|
||||
public double getBorderBottom(){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
|
||||
CTLineProperties ln = pr.getLnB();
|
||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||
}
|
||||
|
||||
public void setBorderBottomColor(Color color){
|
||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
||||
CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
|
||||
setLineColor(ln, color);
|
||||
}
|
||||
|
||||
public Color getBorderBottomColor(){
|
||||
return getLineColor(getXmlObject().getTcPr().getLnB());
|
||||
}
|
||||
|
||||
private void setLineColor(CTLineProperties ln, Color color){
|
||||
if(color == null){
|
||||
ln.addNewNoFill();
|
||||
if(ln.isSetSolidFill()) ln.unsetSolidFill();
|
||||
} else {
|
||||
if(ln.isSetNoFill()) ln.unsetNoFill();
|
||||
|
||||
if(!ln.isSetPrstDash()) ln.addNewPrstDash().setVal(STPresetLineDashVal.SOLID);
|
||||
ln.setCmpd(STCompoundLine.SNG);
|
||||
ln.setAlgn(STPenAlignment.CTR);
|
||||
ln.setCap(STLineCap.FLAT);
|
||||
ln.addNewRound();
|
||||
|
||||
CTLineEndProperties hd = ln.addNewHeadEnd();
|
||||
hd.setType(STLineEndType.NONE);
|
||||
hd.setW(STLineEndWidth.MED);
|
||||
hd.setLen(STLineEndLength.MED);
|
||||
|
||||
CTLineEndProperties tl = ln.addNewTailEnd();
|
||||
tl.setType(STLineEndType.NONE);
|
||||
tl.setW(STLineEndWidth.MED);
|
||||
tl.setLen(STLineEndLength.MED);
|
||||
|
||||
CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
|
||||
rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
|
||||
ln.addNewSolidFill().setSrgbClr(rgb);
|
||||
}
|
||||
}
|
||||
|
||||
private Color getLineColor(CTLineProperties ln){
|
||||
if(ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;
|
||||
|
||||
CTSolidColorFillProperties fill = ln.getSolidFill();
|
||||
if(!fill.isSetSrgbClr()) {
|
||||
// TODO for now return null for all colors except explicit RGB
|
||||
return null;
|
||||
}
|
||||
byte[] val = fill.getSrgbClr().getVal();
|
||||
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||
}
|
||||
/**
|
||||
* Specifies a solid color fill. The shape is filled entirely with the specified color.
|
||||
*
|
||||
* @param color the solid color fill.
|
||||
* The value of <code>null</code> unsets the solidFIll attribute from the underlying xml
|
||||
*/
|
||||
@Override
|
||||
public void setFillColor(Color color) {
|
||||
CTTableCellProperties spPr = getXmlObject().getTcPr();
|
||||
if (color == null) {
|
||||
if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
|
||||
}
|
||||
else {
|
||||
CTSolidColorFillProperties fill = spPr.isSetSolidFill() ? spPr.getSolidFill() : spPr.addNewSolidFill();
|
||||
|
||||
CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
|
||||
rgb.setVal(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()});
|
||||
|
||||
fill.setSrgbClr(rgb);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return solid fill color of null if not set
|
||||
*/
|
||||
@Override
|
||||
public Color getFillColor(){
|
||||
CTTableCellProperties spPr = getXmlObject().getTcPr();
|
||||
if(!spPr.isSetSolidFill() ) return null;
|
||||
|
||||
CTSolidColorFillProperties fill = spPr.getSolidFill();
|
||||
if(!fill.isSetSrgbClr()) {
|
||||
// TODO for now return null for all colors except explicit RGB
|
||||
return null;
|
||||
}
|
||||
byte[] val = fill.getSrgbClr().getVal();
|
||||
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* ====================================================================
|
||||
* 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.xslf.usermodel;
|
||||
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* Represents a table in a .pptx presentation
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFTableRow implements Iterable<XSLFTableCell> {
|
||||
private CTTableRow _row;
|
||||
private List<XSLFTableCell> _cells;
|
||||
private XSLFTable _table;
|
||||
|
||||
/*package*/ XSLFTableRow(CTTableRow row, XSLFTable table){
|
||||
_row = row;
|
||||
_table = table;
|
||||
_cells = new ArrayList<XSLFTableCell>(_row.sizeOfTcArray());
|
||||
for(CTTableCell cell : _row.getTcList()) {
|
||||
_cells.add(new XSLFTableCell(cell, table.getSheet()));
|
||||
}
|
||||
}
|
||||
|
||||
public CTTableRow getXmlObject(){
|
||||
return _row;
|
||||
}
|
||||
|
||||
public Iterator<XSLFTableCell> iterator(){
|
||||
return _cells.iterator();
|
||||
}
|
||||
|
||||
public List<XSLFTableCell> getCells(){
|
||||
return Collections.unmodifiableList(_cells);
|
||||
}
|
||||
|
||||
public double getHeight(){
|
||||
return Units.toPoints(_row.getH());
|
||||
}
|
||||
|
||||
public void setHeight(double height){
|
||||
_row.setH(Units.toEMU(height));
|
||||
}
|
||||
|
||||
public XSLFTableCell addCell(){
|
||||
CTTableCell c = _row.addNewTc();
|
||||
c.set(XSLFTableCell.prototype());
|
||||
XSLFTableCell cell = new XSLFTableCell(c, _table.getSheet());
|
||||
_cells.add(cell);
|
||||
|
||||
if(_table.getNumberOfColumns() < _row.sizeOfTcArray()) {
|
||||
_table.getCTTable().getTblGrid().addNewGridCol().setW(Units.toEMU(100.0));
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -40,12 +40,14 @@ import java.util.List;
|
||||
public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
private final CTTextParagraph _p;
|
||||
private final List<XSLFTextRun> _runs;
|
||||
private final XSLFTextShape _shape;
|
||||
|
||||
XSLFTextParagraph(CTTextParagraph p){
|
||||
XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){
|
||||
_p = p;
|
||||
_runs = new ArrayList<XSLFTextRun>();
|
||||
_shape = shape;
|
||||
for (CTRegularTextRun r : _p.getRList()) {
|
||||
_runs.add(new XSLFTextRun(r));
|
||||
_runs.add(new XSLFTextRun(r, this));
|
||||
}
|
||||
}
|
||||
|
||||
@ -62,6 +64,10 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
return _p;
|
||||
}
|
||||
|
||||
XSLFTextShape getParentShape() {
|
||||
return _shape;
|
||||
|
||||
}
|
||||
public List<XSLFTextRun> getTextRuns(){
|
||||
return _runs;
|
||||
}
|
||||
@ -72,7 +78,8 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
|
||||
public XSLFTextRun addNewTextRun(){
|
||||
CTRegularTextRun r = _p.addNewR();
|
||||
XSLFTextRun run = new XSLFTextRun(r);
|
||||
r.addNewRPr();
|
||||
XSLFTextRun run = new XSLFTextRun(r, this);
|
||||
_runs.add(run);
|
||||
return run;
|
||||
}
|
||||
|
@ -36,9 +36,15 @@ import java.awt.*;
|
||||
@Beta
|
||||
public class XSLFTextRun {
|
||||
private final CTRegularTextRun _r;
|
||||
private final XSLFTextParagraph _p;
|
||||
|
||||
XSLFTextRun(CTRegularTextRun r){
|
||||
XSLFTextRun(CTRegularTextRun r, XSLFTextParagraph p){
|
||||
_r = r;
|
||||
_p = p;
|
||||
}
|
||||
|
||||
XSLFTextParagraph getParentParagraph(){
|
||||
return _p;
|
||||
}
|
||||
|
||||
public String getText(){
|
||||
@ -78,7 +84,7 @@ public class XSLFTextRun {
|
||||
* @return font size in points or -1 if font size is not set.
|
||||
*/
|
||||
public double getFontSize(){
|
||||
if(!_r.isSetRPr()) return -1;
|
||||
if(!_r.isSetRPr() || !_r.getRPr().isSetSz()) return -1;
|
||||
|
||||
return _r.getRPr().getSz()*0.01;
|
||||
}
|
||||
@ -199,4 +205,15 @@ public class XSLFTextRun {
|
||||
return "[" + getClass() + "]" + getText();
|
||||
}
|
||||
|
||||
public XSLFHyperlink createHyperlink(){
|
||||
XSLFHyperlink link = new XSLFHyperlink(_r.getRPr().addNewHlinkClick(), this);
|
||||
return link;
|
||||
}
|
||||
|
||||
public XSLFHyperlink getHyperlink(){
|
||||
if(!_r.getRPr().isSetHlinkClick()) return null;
|
||||
|
||||
|
||||
return new XSLFHyperlink(_r.getRPr().getHlinkClick(), this);
|
||||
}
|
||||
}
|
365
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
Normal file
365
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
Normal file
@ -0,0 +1,365 @@
|
||||
/*
|
||||
* ====================================================================
|
||||
* 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.xslf.usermodel;
|
||||
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents a shape that can hold text.
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public abstract class XSLFTextShape extends XSLFSimpleShape {
|
||||
private final List<XSLFTextParagraph> _paragraphs;
|
||||
|
||||
/*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) {
|
||||
super(shape, sheet);
|
||||
|
||||
_paragraphs = new ArrayList<XSLFTextParagraph>();
|
||||
CTTextBody txBody = getTextBody(false);
|
||||
if (txBody != null) {
|
||||
for (CTTextParagraph p : txBody.getPList()) {
|
||||
_paragraphs.add(new XSLFTextParagraph(p, this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// textual properties
|
||||
public String getText() {
|
||||
StringBuilder out = new StringBuilder();
|
||||
for (XSLFTextParagraph p : _paragraphs) {
|
||||
if (out.length() > 0) out.append('\n');
|
||||
out.append(p.getText());
|
||||
}
|
||||
return out.toString();
|
||||
}
|
||||
|
||||
public List<XSLFTextParagraph> getTextParagraphs() {
|
||||
return _paragraphs;
|
||||
}
|
||||
|
||||
public XSLFTextParagraph addNewTextParagraph() {
|
||||
CTTextBody txBody = getTextBody(true);
|
||||
CTTextParagraph p = txBody.addNewP();
|
||||
XSLFTextParagraph paragraph = new XSLFTextParagraph(p, this);
|
||||
_paragraphs.add(paragraph);
|
||||
return paragraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies a solid color fill. The shape is filled entirely with the specified color.
|
||||
*
|
||||
* @param color the solid color fill.
|
||||
* The value of <code>null</code> unsets the solidFIll attribute from the underlying xml
|
||||
*/
|
||||
public void setFillColor(Color color) {
|
||||
CTShapeProperties spPr = getSpPr();
|
||||
if (color == null) {
|
||||
if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
|
||||
}
|
||||
else {
|
||||
CTSolidColorFillProperties fill = spPr.isSetSolidFill() ? spPr.getSolidFill() : spPr.addNewSolidFill();
|
||||
|
||||
CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
|
||||
rgb.setVal(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()});
|
||||
|
||||
fill.setSrgbClr(rgb);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return solid fill color of null if not set
|
||||
*/
|
||||
public Color getFillColor(){
|
||||
CTShapeProperties spPr = getSpPr();
|
||||
if(!spPr.isSetSolidFill() ) return null;
|
||||
|
||||
CTSolidColorFillProperties fill = spPr.getSolidFill();
|
||||
if(!fill.isSetSrgbClr()) {
|
||||
// TODO for now return null for all colors except explicit RGB
|
||||
return null;
|
||||
}
|
||||
byte[] val = fill.getSrgbClr().getVal();
|
||||
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the type of vertical alignment for the text.
|
||||
* One of the <code>Anchor*</code> constants defined in this class.
|
||||
*
|
||||
* @param anchor - the type of alignment. Default is {@link org.apache.poi.xslf.usermodel.VerticalAlignment#TOP}
|
||||
*/
|
||||
public void setVerticalAlignment(VerticalAlignment anchor){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(anchor == null) {
|
||||
if(bodyPr.isSetAnchor()) bodyPr.unsetAnchor();
|
||||
} else {
|
||||
bodyPr.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of vertical alignment for the text.
|
||||
*
|
||||
* @return the type of alignment
|
||||
*/
|
||||
public VerticalAlignment getVerticalAlignment(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
STTextAnchoringType.Enum val = bodyPr.getAnchor();
|
||||
if(val != null){
|
||||
return VerticalAlignment.values()[val.intValue() - 1];
|
||||
}
|
||||
}
|
||||
return VerticalAlignment.TOP;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param orientation vertical orientation of the text
|
||||
*/
|
||||
public void setTextDirection(TextDirection orientation){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(orientation == null) {
|
||||
if(bodyPr.isSetVert()) bodyPr.unsetVert();
|
||||
} else {
|
||||
bodyPr.setVert(STTextVerticalType.Enum.forInt(orientation.ordinal() + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return vertical orientation of the text
|
||||
*/
|
||||
public TextDirection getTextDirection(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
STTextVerticalType.Enum val = bodyPr.getVert();
|
||||
if(val != null){
|
||||
return TextDirection.values()[val.intValue() - 1];
|
||||
}
|
||||
}
|
||||
return TextDirection.HORIZONTAL;
|
||||
}
|
||||
/**
|
||||
* Returns the distance (in points) between the bottom of the text frame
|
||||
* and the bottom of the inscribed rectangle of the shape that contains the text.
|
||||
*
|
||||
* @return the bottom margin or -1 if not set
|
||||
*/
|
||||
public double getMarginBottom(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
return bodyPr.isSetBIns() ? Units.toPoints(bodyPr.getBIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the left edge of the text frame
|
||||
* and the left edge of the inscribed rectangle of the shape that contains
|
||||
* the text.
|
||||
*
|
||||
* @return the left margin
|
||||
*/
|
||||
public double getMarginLeft(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
return bodyPr.isSetLIns() ? Units.toPoints(bodyPr.getLIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the right edge of the
|
||||
* text frame and the right edge of the inscribed rectangle of the shape
|
||||
* that contains the text.
|
||||
*
|
||||
* @return the right margin
|
||||
*/
|
||||
public double getMarginRight(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
return bodyPr.isSetRIns() ? Units.toPoints(bodyPr.getRIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the distance (in points) between the top of the text frame
|
||||
* and the top of the inscribed rectangle of the shape that contains the text.
|
||||
*
|
||||
* @return the top margin
|
||||
*/
|
||||
public double getMarginTop(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
return bodyPr.isSetTIns() ? Units.toPoints(bodyPr.getTIns()) : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the botom margin.
|
||||
* @see #getMarginBottom()
|
||||
*
|
||||
* @param margin the bottom margin
|
||||
*/
|
||||
public void setMarginBottom(double margin){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(margin == -1) bodyPr.unsetBIns();
|
||||
else bodyPr.setBIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the left margin.
|
||||
* @see #getMarginLeft()
|
||||
*
|
||||
* @param margin the left margin
|
||||
*/
|
||||
public void setMarginLeft(double margin){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(margin == -1) bodyPr.unsetLIns();
|
||||
else bodyPr.setLIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the right margin.
|
||||
* @see #getMarginRight()
|
||||
*
|
||||
* @param margin the right margin
|
||||
*/
|
||||
public void setMarginRight(double margin){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(margin == -1) bodyPr.unsetRIns();
|
||||
else bodyPr.setRIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the top margin.
|
||||
* @see #getMarginTop()
|
||||
*
|
||||
* @param margin the top margin
|
||||
*/
|
||||
public void setMarginTop(double margin){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(margin == -1) bodyPr.unsetTIns();
|
||||
else bodyPr.setTIns(Units.toEMU(margin));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the value indicating word wrap.
|
||||
* One of the <code>Wrap*</code> constants defined in this class.
|
||||
*
|
||||
* @return the value indicating word wrap
|
||||
*/
|
||||
public boolean getWordWrap(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
return bodyPr.getWrap() == STTextWrappingType.SQUARE;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies how the text should be wrapped
|
||||
*
|
||||
* @param wrap the value indicating how the text should be wrapped
|
||||
*/
|
||||
public void setWordWrap(boolean wrap){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
bodyPr.setWrap(wrap ? STTextWrappingType.SQUARE : STTextWrappingType.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Specifies that a shape should be auto-fit to fully contain the text described within it.
|
||||
* Auto-fitting is when text within a shape is scaled in order to contain all the text inside
|
||||
*
|
||||
* @param value type of autofit
|
||||
*/
|
||||
public void setTextAutofit(TextAutofit value){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(bodyPr.isSetSpAutoFit()) bodyPr.unsetSpAutoFit();
|
||||
if(bodyPr.isSetNoAutofit()) bodyPr.unsetNoAutofit();
|
||||
if(bodyPr.isSetNormAutofit()) bodyPr.unsetNormAutofit();
|
||||
|
||||
switch(value){
|
||||
case NONE: bodyPr.addNewNoAutofit(); break;
|
||||
case NORMAL: bodyPr.addNewNormAutofit(); break;
|
||||
case SHAPE: bodyPr.addNewSpAutoFit(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return type of autofit
|
||||
*/
|
||||
public TextAutofit getTextAutofit(){
|
||||
CTTextBodyProperties bodyPr = getTextBodyPr();
|
||||
if (bodyPr != null) {
|
||||
if(bodyPr.isSetNoAutofit()) return TextAutofit.NONE;
|
||||
else if (bodyPr.isSetNormAutofit()) return TextAutofit.NORMAL;
|
||||
else if (bodyPr.isSetSpAutoFit()) return TextAutofit.SHAPE;
|
||||
}
|
||||
return TextAutofit.NORMAL;
|
||||
}
|
||||
|
||||
protected CTTextBodyProperties getTextBodyPr(){
|
||||
CTTextBody textBody = getTextBody(false);
|
||||
return textBody == null ? null : textBody.getBodyPr();
|
||||
}
|
||||
|
||||
|
||||
protected abstract CTTextBody getTextBody(boolean create);
|
||||
}
|
@ -210,7 +210,7 @@ public class TestXSLFAutoShape extends TestCase {
|
||||
assertSame(r, p.getTextRuns().get(0));
|
||||
|
||||
assertEquals(-1.0, r.getFontSize());
|
||||
assertFalse(r.getXmlObject().isSetRPr());
|
||||
assertFalse(r.getXmlObject().getRPr().isSetSz());
|
||||
r.setFontSize(10.0);
|
||||
assertTrue(r.getXmlObject().isSetRPr());
|
||||
assertEquals(1000, r.getXmlObject().getRPr().getSz());
|
||||
|
@ -0,0 +1,102 @@
|
||||
/* ====================================================================
|
||||
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.xslf.usermodel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.net.URI;
|
||||
|
||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||
import org.apache.poi.xssf.usermodel.XSSFTable;
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||
|
||||
/**
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class TestXSLFHyperlink extends TestCase {
|
||||
|
||||
public void testRead(){
|
||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
|
||||
|
||||
XSLFSlide slide = ppt.getSlides()[4];
|
||||
XSLFShape[] shapes = slide.getShapes();
|
||||
XSLFTable tbl = (XSLFTable)shapes[0];
|
||||
XSLFTableCell cell1 = tbl.getRows().get(1).getCells().get(0);
|
||||
assertEquals("Web Page", cell1.getText());
|
||||
XSLFHyperlink link1 = cell1.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
|
||||
assertNotNull(link1);
|
||||
assertEquals(URI.create("http://poi.apache.org/"), link1.getTargetURI());
|
||||
|
||||
XSLFTableCell cell2 = tbl.getRows().get(2).getCells().get(0);
|
||||
assertEquals("Place in this document", cell2.getText());
|
||||
XSLFHyperlink link2 = cell2.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
|
||||
assertNotNull(link2);
|
||||
assertEquals(URI.create("/ppt/slides/slide2.xml"), link2.getTargetURI());
|
||||
|
||||
XSLFTableCell cell3 = tbl.getRows().get(3).getCells().get(0);
|
||||
assertEquals("Email", cell3.getText());
|
||||
XSLFHyperlink link3 = cell3.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
|
||||
assertNotNull(link3);
|
||||
assertEquals(URI.create("mailto:dev@poi.apache.org?subject=Hi%20There"), link3.getTargetURI());
|
||||
}
|
||||
|
||||
public void testCreate() throws Exception {
|
||||
XMLSlideShow ppt = new XMLSlideShow();
|
||||
XSLFSlide slide1 = ppt.createSlide();
|
||||
XSLFSlide slide2 = ppt.createSlide();
|
||||
|
||||
int numRel = slide1.getPackagePart().getRelationships().size();
|
||||
assertEquals(1, numRel);
|
||||
XSLFTextBox sh1 = slide1.createTextBox();
|
||||
XSLFTextRun r1 = sh1.addNewTextParagraph().addNewTextRun();
|
||||
r1.setText("Web Page");
|
||||
XSLFHyperlink link1 = r1.createHyperlink();
|
||||
link1.setAddress("http://poi.apache.org/");
|
||||
assertEquals(URI.create("http://poi.apache.org/"), link1.getTargetURI());
|
||||
assertEquals(numRel + 1, slide1.getPackagePart().getRelationships().size());
|
||||
|
||||
String id1 = link1.getXmlObject().getId();
|
||||
assertNotNull(id1);
|
||||
PackageRelationship rel1 = slide1.getPackagePart().getRelationship(id1);
|
||||
assertNotNull(rel1);
|
||||
assertEquals(id1, rel1.getId());
|
||||
assertEquals(TargetMode.EXTERNAL, rel1.getTargetMode());
|
||||
assertEquals(XSLFRelation.HYPERLINK.getRelation(), rel1.getRelationshipType());
|
||||
|
||||
XSLFTextBox sh2 = slide1.createTextBox();
|
||||
XSLFTextRun r2 = sh2.addNewTextParagraph().addNewTextRun();
|
||||
r2.setText("Place in this document");
|
||||
XSLFHyperlink link2 = r2.createHyperlink();
|
||||
link2.setAddress(slide2);
|
||||
assertEquals(URI.create("/ppt/slides/slide2.xml"), link2.getTargetURI());
|
||||
assertEquals(numRel + 2, slide1.getPackagePart().getRelationships().size());
|
||||
|
||||
String id2 = link2.getXmlObject().getId();
|
||||
assertNotNull(id2);
|
||||
PackageRelationship rel2 = slide1.getPackagePart().getRelationship(id2);
|
||||
assertNotNull(rel2);
|
||||
assertEquals(id2, rel2.getId());
|
||||
assertEquals(TargetMode.INTERNAL, rel2.getTargetMode());
|
||||
assertEquals(XSLFRelation.SLIDE.getRelation(), rel2.getRelationshipType());
|
||||
}
|
||||
}
|
@ -31,7 +31,6 @@ public class TestXSLFShape extends TestCase {
|
||||
public void testReadTextShapes() {
|
||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
|
||||
XSLFSlide[] slides = ppt.getSlides();
|
||||
assertEquals(3, slides.length);
|
||||
|
||||
XSLFSlide slide1 = slides[0];
|
||||
XSLFShape[] shapes1 = slide1.getShapes();
|
||||
|
@ -30,7 +30,6 @@ public class TestXSLFSlide extends TestCase {
|
||||
public void testReadShapes(){
|
||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
|
||||
XSLFSlide[] slides = ppt.getSlides();
|
||||
assertEquals(3, slides.length);
|
||||
|
||||
XSLFSlide slide1 = slides[0];
|
||||
XSLFShape[] shapes1 = slide1.getShapes();
|
||||
@ -85,6 +84,14 @@ public class TestXSLFSlide extends TestCase {
|
||||
|
||||
assertTrue(groupShapes[2] instanceof XSLFAutoShape);
|
||||
assertEquals("Right Arrow 3", groupShapes[2].getShapeName());
|
||||
|
||||
XSLFSlide slide4 = slides[3];
|
||||
XSLFShape[] shapes4 = slide4.getShapes();
|
||||
assertEquals(1, shapes4.length);
|
||||
assertTrue(shapes4[0] instanceof XSLFTable);
|
||||
XSLFTable tbl = (XSLFTable)shapes4[0];
|
||||
assertEquals(3, tbl.getNumberOfColumns());
|
||||
assertEquals(6, tbl.getNumberOfRows());
|
||||
}
|
||||
|
||||
public void testCreateSlide(){
|
||||
|
@ -0,0 +1,150 @@
|
||||
/* ====================================================================
|
||||
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.xslf.usermodel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||
|
||||
/**
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class TestXSLFTable extends TestCase {
|
||||
|
||||
public void testRead(){
|
||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
|
||||
|
||||
XSLFSlide slide = ppt.getSlides()[3];
|
||||
XSLFShape[] shapes = slide.getShapes();
|
||||
assertEquals(1, shapes.length);
|
||||
assertTrue(shapes[0] instanceof XSLFTable);
|
||||
XSLFTable tbl = (XSLFTable)shapes[0];
|
||||
assertEquals(3, tbl.getNumberOfColumns());
|
||||
assertEquals(6, tbl.getNumberOfRows());
|
||||
assertNotNull(tbl.getCTTable());
|
||||
|
||||
List<XSLFTableRow> rows = tbl.getRows();
|
||||
assertEquals(6, rows.size());
|
||||
|
||||
assertEquals(90.0, tbl.getColumnWidth(0));
|
||||
assertEquals(240.0, tbl.getColumnWidth(1));
|
||||
assertEquals(150.0, tbl.getColumnWidth(2));
|
||||
|
||||
for(XSLFTableRow row : tbl){
|
||||
// all rows have the same height
|
||||
assertEquals(29.2, row.getHeight());
|
||||
}
|
||||
|
||||
XSLFTableRow row0 = rows.get(0);
|
||||
List<XSLFTableCell> cells0 = row0.getCells();
|
||||
assertEquals(3, cells0.size());
|
||||
assertEquals("header1", cells0.get(0).getText());
|
||||
assertEquals("header2", cells0.get(1).getText());
|
||||
assertEquals("header3", cells0.get(2).getText());
|
||||
|
||||
XSLFTableRow row1 = rows.get(1);
|
||||
List<XSLFTableCell> cells1 = row1.getCells();
|
||||
assertEquals(3, cells1.size());
|
||||
assertEquals("A1", cells1.get(0).getText());
|
||||
assertEquals("B1", cells1.get(1).getText());
|
||||
assertEquals("C1", cells1.get(2).getText());
|
||||
}
|
||||
|
||||
public void testCreate() {
|
||||
XMLSlideShow ppt = new XMLSlideShow();
|
||||
XSLFSlide slide = ppt.createSlide();
|
||||
|
||||
XSLFTable tbl = slide.createTable();
|
||||
assertNotNull(tbl.getCTTable());
|
||||
assertNotNull(tbl.getCTTable().getTblGrid());
|
||||
assertNotNull(tbl.getCTTable().getTblPr());
|
||||
assertTrue(tbl.getXmlObject() instanceof CTGraphicalObjectFrame);
|
||||
assertEquals("Table 1", tbl.getShapeName());
|
||||
assertEquals(2, tbl.getShapeId());
|
||||
assertEquals(0, tbl.getRows().size());
|
||||
assertEquals(0, tbl.getCTTable().sizeOfTrArray());
|
||||
assertEquals(0, tbl.getCTTable().getTblGrid().sizeOfGridColArray());
|
||||
|
||||
assertEquals(0, tbl.getNumberOfColumns());
|
||||
assertEquals(0, tbl.getNumberOfRows());
|
||||
|
||||
XSLFTableRow row0 = tbl.addRow();
|
||||
assertNotNull(row0.getXmlObject());
|
||||
assertEquals(1, tbl.getNumberOfRows());
|
||||
assertSame(row0, tbl.getRows().get(0));
|
||||
assertEquals(20.0, row0.getHeight());
|
||||
row0.setHeight(30.0);
|
||||
assertEquals(30.0, row0.getHeight());
|
||||
|
||||
assertEquals(0, row0.getCells().size());
|
||||
XSLFTableCell cell0 = row0.addCell();
|
||||
assertNotNull(cell0.getXmlObject());
|
||||
// by default table cell has no borders
|
||||
assertTrue(cell0.getXmlObject().getTcPr().getLnB().isSetNoFill());
|
||||
assertTrue(cell0.getXmlObject().getTcPr().getLnT().isSetNoFill());
|
||||
assertTrue(cell0.getXmlObject().getTcPr().getLnL().isSetNoFill());
|
||||
assertTrue(cell0.getXmlObject().getTcPr().getLnR().isSetNoFill());
|
||||
|
||||
assertSame(cell0, row0.getCells().get(0));
|
||||
assertEquals(1, tbl.getNumberOfColumns());
|
||||
assertEquals(100.0, tbl.getColumnWidth(0));
|
||||
cell0.addNewTextParagraph().addNewTextRun().setText("POI");
|
||||
assertEquals("POI", cell0.getText());
|
||||
|
||||
XSLFTableCell cell1 = row0.addCell();
|
||||
assertSame(cell1, row0.getCells().get(1));
|
||||
assertEquals(2, tbl.getNumberOfColumns());
|
||||
assertEquals(100.0, tbl.getColumnWidth(1));
|
||||
cell1.addNewTextParagraph().addNewTextRun().setText("Apache");
|
||||
assertEquals("Apache", cell1.getText());
|
||||
|
||||
assertEquals(1.0, cell1.getBorderBottom());
|
||||
cell1.setBorderBottom(2.0);
|
||||
assertEquals(2.0, cell1.getBorderBottom());
|
||||
assertNull(cell1.getBorderBottomColor());
|
||||
cell1.setBorderBottomColor(Color.yellow);
|
||||
assertEquals(Color.yellow, cell1.getBorderBottomColor());
|
||||
|
||||
assertEquals(1.0, cell1.getBorderTop());
|
||||
cell1.setBorderTop(2.0);
|
||||
assertEquals(2.0, cell1.getBorderTop());
|
||||
assertNull(cell1.getBorderTopColor());
|
||||
cell1.setBorderTopColor(Color.yellow);
|
||||
assertEquals(Color.yellow, cell1.getBorderTopColor());
|
||||
|
||||
assertEquals(1.0, cell1.getBorderLeft());
|
||||
cell1.setBorderLeft(2.0);
|
||||
assertEquals(2.0, cell1.getBorderLeft());
|
||||
assertNull(cell1.getBorderLeftColor());
|
||||
cell1.setBorderLeftColor(Color.yellow);
|
||||
assertEquals(Color.yellow, cell1.getBorderLeftColor());
|
||||
|
||||
assertEquals(1.0, cell1.getBorderRight());
|
||||
cell1.setBorderRight(2.0);
|
||||
assertEquals(2.0, cell1.getBorderRight());
|
||||
assertNull(cell1.getBorderRightColor());
|
||||
cell1.setBorderRightColor(Color.yellow);
|
||||
assertEquals(Color.yellow, cell1.getBorderRightColor());
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user