/* ==================================================================== | |
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 static org.junit.Assert.assertEquals; | |
import static org.junit.Assert.assertFalse; | |
import static org.junit.Assert.assertNotNull; | |
import static org.junit.Assert.assertNull; | |
import static org.junit.Assert.assertSame; | |
import static org.junit.Assert.assertTrue; | |
import java.awt.Color; | |
import java.awt.Dimension; | |
import java.awt.Graphics2D; | |
import java.awt.RenderingHints; | |
import java.awt.geom.Rectangle2D; | |
import java.awt.image.BufferedImage; | |
import java.io.IOException; | |
import java.util.List; | |
import org.apache.poi.sl.draw.DrawFactory; | |
import org.apache.poi.sl.usermodel.Slide; | |
import org.apache.poi.sl.usermodel.TableCell.BorderEdge; | |
import org.apache.poi.sl.usermodel.VerticalAlignment; | |
import org.apache.poi.xslf.XSLFTestDataSamples; | |
import org.junit.Test; | |
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; | |
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; | |
public class TestXSLFTable { | |
@Test | |
public void testRead() throws IOException { | |
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); | |
XSLFSlide slide = ppt.getSlides().get(3); | |
List<XSLFShape> shapes = slide.getShapes(); | |
assertEquals(1, shapes.size()); | |
assertTrue(shapes.get(0) instanceof XSLFTable); | |
XSLFTable tbl = (XSLFTable)shapes.get(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), 0); | |
assertEquals(240.0, tbl.getColumnWidth(1), 0); | |
assertEquals(150.0, tbl.getColumnWidth(2), 0); | |
for(XSLFTableRow row : tbl){ | |
// all rows have the same height | |
assertEquals(29.2, row.getHeight(), 0); | |
} | |
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()); | |
ppt.close(); | |
} | |
@Test | |
public void testCreate() throws IOException { | |
XMLSlideShow ppt1 = new XMLSlideShow(); | |
XSLFSlide slide = ppt1.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(), 0); | |
row0.setHeight(30.0); | |
assertEquals(30.0, row0.getHeight(), 0); | |
assertEquals(0, row0.getCells().size()); | |
XSLFTableCell cell0 = row0.addCell(); | |
assertNotNull(cell0.getXmlObject()); | |
// by default table cell has no borders | |
CTTableCell tc = (CTTableCell)cell0.getXmlObject(); | |
assertTrue(tc.getTcPr().getLnB().isSetNoFill()); | |
assertTrue(tc.getTcPr().getLnT().isSetNoFill()); | |
assertTrue(tc.getTcPr().getLnL().isSetNoFill()); | |
assertTrue(tc.getTcPr().getLnR().isSetNoFill()); | |
assertSame(cell0, row0.getCells().get(0)); | |
assertEquals(1, tbl.getNumberOfColumns()); | |
assertEquals(100.0, tbl.getColumnWidth(0), 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), 0); | |
cell1.addNewTextParagraph().addNewTextRun().setText("Apache"); | |
assertEquals("Apache", cell1.getText()); | |
for (BorderEdge edge : BorderEdge.values()) { | |
assertNull(cell1.getBorderWidth(edge)); | |
cell1.setBorderWidth(edge, 2.0); | |
assertEquals(2.0, cell1.getBorderWidth(edge), 0); | |
assertNull(cell1.getBorderColor(edge)); | |
cell1.setBorderColor(edge, Color.yellow); | |
assertEquals(Color.yellow, cell1.getBorderColor(edge)); | |
} | |
assertEquals(VerticalAlignment.TOP, cell1.getVerticalAlignment()); | |
cell1.setVerticalAlignment(VerticalAlignment.MIDDLE); | |
assertEquals(VerticalAlignment.MIDDLE, cell1.getVerticalAlignment()); | |
cell1.setVerticalAlignment(null); | |
assertEquals(VerticalAlignment.TOP, cell1.getVerticalAlignment()); | |
XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt1); | |
ppt1.close(); | |
slide = ppt2.getSlides().get(0); | |
tbl = (XSLFTable)slide.getShapes().get(0); | |
assertEquals(2, tbl.getNumberOfColumns()); | |
assertEquals(1, tbl.getNumberOfRows()); | |
assertEquals("POI", tbl.getCell(0, 0).getText()); | |
assertEquals("Apache", tbl.getCell(0, 1).getText()); | |
ppt2.close(); | |
} | |
@Test | |
public void removeTable() throws IOException { | |
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); | |
XSLFSlide sl = ss.getSlides().get(0); | |
XSLFTable tab = (XSLFTable)sl.getShapes().get(4); | |
sl.removeShape(tab); | |
XMLSlideShow ss2 = XSLFTestDataSamples.writeOutAndReadBack(ss); | |
ss.close(); | |
sl = ss2.getSlides().get(0); | |
for (XSLFShape s : sl.getShapes()) { | |
assertFalse(s instanceof XSLFTable); | |
} | |
ss2.close(); | |
} | |
@Test | |
public void checkTextHeight() throws IOException { | |
// from bug 59686 | |
XMLSlideShow ppt = new XMLSlideShow(); | |
XSLFSlide sl = ppt.createSlide(); | |
XSLFTable tab = sl.createTable(); | |
tab.setAnchor(new Rectangle2D.Double(50,50,300,50)); | |
XSLFTableRow tr = tab.addRow(); | |
XSLFTableCell tc0 = tr.addCell(); | |
tc0.setText("bla bla bla bla"); | |
tab.setColumnWidth(0, 50); | |
// usually text height == 88, but font rendering is plattform dependent | |
// so we use something more reliable | |
assertTrue(tc0.getTextHeight() > 50); | |
assertEquals(0, tc0.getLineWidth(), 0); | |
ppt.close(); | |
} | |
@Test | |
public void checkNullPointerException() { | |
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("au.asn.aes.www_conferences_2011_presentations_Fri_20Room4Level4_20930_20Maloney.pptx"); | |
Dimension pgsize = ss.getPageSize(); | |
for (Slide<?, ?> s : ss.getSlides()) { | |
BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_ARGB); | |
Graphics2D graphics = img.createGraphics(); | |
// draw stuff | |
s.draw(graphics); | |
graphics.dispose(); | |
img.flush(); | |
} | |
} | |
} |