選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

TestXSSFDrawing.java 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.xssf.usermodel;
  16. import java.awt.*;
  17. import java.io.File;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20. import java.io.OutputStream;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. import junit.framework.TestCase;
  24. import org.apache.poi.POIXMLDocumentPart;
  25. import org.apache.poi.openxml4j.opc.OPCPackage;
  26. import org.apache.poi.ss.usermodel.FontUnderline;
  27. import org.apache.poi.xssf.XSSFTestDataSamples;
  28. import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
  29. import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
  30. import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;
  31. import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing;
  32. /**
  33. * @author Yegor Kozlov
  34. */
  35. public class TestXSSFDrawing extends TestCase {
  36. public void testRead(){
  37. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
  38. XSSFSheet sheet = wb.getSheetAt(0);
  39. //the sheet has one relationship and it is XSSFDrawing
  40. List<POIXMLDocumentPart> rels = sheet.getRelations();
  41. assertEquals(1, rels.size());
  42. assertTrue(rels.get(0) instanceof XSSFDrawing);
  43. XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
  44. //sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
  45. assertSame(drawing, sheet.createDrawingPatriarch());
  46. String drawingId = drawing.getPackageRelationship().getId();
  47. //there should be a relation to this drawing in the worksheet
  48. assertTrue(sheet.getCTWorksheet().isSetDrawing());
  49. assertEquals(drawingId, sheet.getCTWorksheet().getDrawing().getId());
  50. List<XSSFShape> shapes = drawing.getShapes();
  51. assertEquals(6, shapes.size());
  52. assertTrue(shapes.get(0) instanceof XSSFPicture);
  53. assertTrue(shapes.get(1) instanceof XSSFPicture);
  54. assertTrue(shapes.get(2) instanceof XSSFPicture);
  55. assertTrue(shapes.get(3) instanceof XSSFPicture);
  56. assertTrue(shapes.get(4) instanceof XSSFSimpleShape);
  57. assertTrue(shapes.get(5) instanceof XSSFPicture);
  58. for(XSSFShape sh : shapes) assertNotNull(sh.getAnchor());
  59. }
  60. public void testNew() throws Exception {
  61. XSSFWorkbook wb = new XSSFWorkbook();
  62. XSSFSheet sheet = wb.createSheet();
  63. //multiple calls of createDrawingPatriarch should return the same instance of XSSFDrawing
  64. XSSFDrawing dr1 = sheet.createDrawingPatriarch();
  65. XSSFDrawing dr2 = sheet.createDrawingPatriarch();
  66. assertSame(dr1, dr2);
  67. List<POIXMLDocumentPart> rels = sheet.getRelations();
  68. assertEquals(1, rels.size());
  69. assertTrue(rels.get(0) instanceof XSSFDrawing);
  70. XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
  71. String drawingId = drawing.getPackageRelationship().getId();
  72. //there should be a relation to this drawing in the worksheet
  73. assertTrue(sheet.getCTWorksheet().isSetDrawing());
  74. assertEquals(drawingId, sheet.getCTWorksheet().getDrawing().getId());
  75. XSSFConnector c1= drawing.createConnector(new XSSFClientAnchor(0,0,0,0,0,0,2,2));
  76. c1.setLineWidth(2.5);
  77. c1.setLineStyle(1);
  78. XSSFShapeGroup c2 = drawing.createGroup(new XSSFClientAnchor(0,0,0,0,0,0,5,5));
  79. XSSFSimpleShape c3 = drawing.createSimpleShape(new XSSFClientAnchor(0,0,0,0,2,2,3,4));
  80. c3.setText(new XSSFRichTextString("Test String"));
  81. c3.setFillColor(128, 128, 128);
  82. XSSFTextBox c4 = drawing.createTextbox(new XSSFClientAnchor(0,0,0,0,4,4,5,6));
  83. XSSFRichTextString rt = new XSSFRichTextString("Test String");
  84. rt.applyFont(0, 5, wb.createFont());
  85. rt.applyFont(5, 6, wb.createFont());
  86. c4.setText(rt);
  87. c4.setNoFill(true);
  88. assertEquals(4, drawing.getCTDrawing().sizeOfTwoCellAnchorArray());
  89. List<XSSFShape> shapes = drawing.getShapes();
  90. assertEquals(4, shapes.size());
  91. assertTrue(shapes.get(0) instanceof XSSFConnector);
  92. assertTrue(shapes.get(1) instanceof XSSFShapeGroup);
  93. assertTrue(shapes.get(2) instanceof XSSFSimpleShape);
  94. assertTrue(shapes.get(3) instanceof XSSFSimpleShape); //
  95. // Save and re-load it
  96. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  97. sheet = wb.getSheetAt(0);
  98. // Check
  99. dr1 = sheet.createDrawingPatriarch();
  100. CTDrawing ctDrawing = dr1.getCTDrawing();
  101. // Connector, shapes and text boxes are all two cell anchors
  102. assertEquals(0, ctDrawing.sizeOfAbsoluteAnchorArray());
  103. assertEquals(0, ctDrawing.sizeOfOneCellAnchorArray());
  104. assertEquals(4, ctDrawing.sizeOfTwoCellAnchorArray());
  105. shapes = dr1.getShapes();
  106. assertEquals(4, shapes.size());
  107. assertTrue(shapes.get(0) instanceof XSSFConnector);
  108. assertTrue(shapes.get(1) instanceof XSSFShapeGroup);
  109. assertTrue(shapes.get(2) instanceof XSSFSimpleShape);
  110. assertTrue(shapes.get(3) instanceof XSSFSimpleShape); //
  111. // Ensure it got the right namespaces
  112. String xml = ctDrawing.toString();
  113. assertTrue(xml.contains("xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\""));
  114. assertTrue(xml.contains("xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\""));
  115. }
  116. public void testMultipleDrawings(){
  117. XSSFWorkbook wb = new XSSFWorkbook();
  118. for (int i = 0; i < 3; i++) {
  119. XSSFSheet sheet = wb.createSheet();
  120. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  121. }
  122. OPCPackage pkg = wb.getPackage();
  123. assertEquals(3, pkg.getPartsByContentType(XSSFRelation.DRAWINGS.getContentType()).size());
  124. }
  125. public void testClone() throws Exception{
  126. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
  127. XSSFSheet sheet1 = wb.getSheetAt(0);
  128. XSSFSheet sheet2 = wb.cloneSheet(0);
  129. //the source sheet has one relationship and it is XSSFDrawing
  130. List<POIXMLDocumentPart> rels1 = sheet1.getRelations();
  131. assertEquals(1, rels1.size());
  132. assertTrue(rels1.get(0) instanceof XSSFDrawing);
  133. List<POIXMLDocumentPart> rels2 = sheet2.getRelations();
  134. assertEquals(1, rels2.size());
  135. assertTrue(rels2.get(0) instanceof XSSFDrawing);
  136. XSSFDrawing drawing1 = (XSSFDrawing)rels1.get(0);
  137. XSSFDrawing drawing2 = (XSSFDrawing)rels2.get(0);
  138. assertNotSame(drawing1, drawing2); // drawing2 is a clone of drawing1
  139. List<XSSFShape> shapes1 = drawing1.getShapes();
  140. List<XSSFShape> shapes2 = drawing2.getShapes();
  141. assertEquals(shapes1.size(), shapes2.size());
  142. for(int i = 0; i < shapes1.size(); i++){
  143. XSSFShape sh1 = (XSSFShape)shapes1.get(i);
  144. XSSFShape sh2 = (XSSFShape)shapes2.get(i);
  145. assertTrue(sh1.getClass() == sh2.getClass());
  146. assertEquals(sh1.getShapeProperties().toString(), sh2.getShapeProperties().toString());
  147. }
  148. }
  149. /**
  150. * ensure that rich text attributes defined in a XSSFRichTextString
  151. * are passed to XSSFSimpleShape.
  152. *
  153. * See Bugzilla 52219.
  154. */
  155. public void testRichText(){
  156. XSSFWorkbook wb = new XSSFWorkbook();
  157. XSSFSheet sheet = wb.createSheet();
  158. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  159. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  160. XSSFRichTextString rt = new XSSFRichTextString("Test String");
  161. XSSFFont font = wb.createFont();
  162. font.setColor(new XSSFColor(new Color(0, 128, 128)));
  163. font.setItalic(true);
  164. font.setBold(true);
  165. font.setUnderline(FontUnderline.SINGLE);
  166. rt.applyFont(font);
  167. shape.setText(rt);
  168. CTTextParagraph pr = shape.getCTShape().getTxBody().getPArray(0);
  169. assertEquals(1, pr.sizeOfRArray());
  170. CTTextCharacterProperties rPr = pr.getRArray(0).getRPr();
  171. assertEquals(true, rPr.getB());
  172. assertEquals(true, rPr.getI());
  173. assertEquals(STTextUnderlineType.SNG, rPr.getU());
  174. assertTrue(Arrays.equals(
  175. new byte[]{0, (byte)128, (byte)128} ,
  176. rPr.getSolidFill().getSrgbClr().getVal()));
  177. }
  178. /**
  179. * test that anchor is not null when reading shapes from existing drawings
  180. */
  181. public void testReadAnchors(){
  182. XSSFWorkbook wb = new XSSFWorkbook();
  183. XSSFSheet sheet = wb.createSheet();
  184. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  185. XSSFClientAnchor anchor1 = new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4);
  186. XSSFShape shape1 = drawing.createTextbox(anchor1);
  187. XSSFClientAnchor anchor2 = new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 5);
  188. XSSFShape shape2 = drawing.createTextbox(anchor2);
  189. int pictureIndex= wb.addPicture(new byte[]{}, XSSFWorkbook.PICTURE_TYPE_PNG);
  190. XSSFClientAnchor anchor3 = new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 6);
  191. XSSFShape shape3 = drawing.createPicture(anchor3, pictureIndex);
  192. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  193. sheet = wb.getSheetAt(0);
  194. drawing = sheet.createDrawingPatriarch();
  195. List<XSSFShape> shapes = drawing.getShapes();
  196. assertEquals(shapes.get(0).getAnchor(), anchor1);
  197. assertEquals(shapes.get(1).getAnchor(), anchor2);
  198. assertEquals(shapes.get(2).getAnchor(), anchor3);
  199. }
  200. /**
  201. * ensure that font and color rich text attributes defined in a XSSFRichTextString
  202. * are passed to XSSFSimpleShape.
  203. *
  204. * See Bugzilla 54969.
  205. */
  206. public void testRichTextFontAndColor() {
  207. XSSFWorkbook wb = new XSSFWorkbook();
  208. XSSFSheet sheet = wb.createSheet();
  209. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  210. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  211. XSSFRichTextString rt = new XSSFRichTextString("Test String");
  212. XSSFFont font = wb.createFont();
  213. font.setColor(new XSSFColor(new Color(0, 128, 128)));
  214. font.setFontName("Arial");
  215. rt.applyFont(font);
  216. shape.setText(rt);
  217. CTTextParagraph pr = shape.getCTShape().getTxBody().getPArray(0);
  218. assertEquals(1, pr.sizeOfRArray());
  219. CTTextCharacterProperties rPr = pr.getRArray(0).getRPr();
  220. assertEquals("Arial", rPr.getLatin().getTypeface());
  221. assertTrue(Arrays.equals(
  222. new byte[]{0, (byte)128, (byte)128} ,
  223. rPr.getSolidFill().getSrgbClr().getVal()));
  224. }
  225. /**
  226. * Test setText single paragraph to ensure backwards compatibility
  227. */
  228. public void testSetTextSingleParagraph() {
  229. XSSFWorkbook wb = new XSSFWorkbook();
  230. XSSFSheet sheet = wb.createSheet();
  231. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  232. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  233. XSSFRichTextString rt = new XSSFRichTextString("Test String");
  234. XSSFFont font = wb.createFont();
  235. font.setColor(new XSSFColor(new Color(0, 255, 255)));
  236. font.setFontName("Arial");
  237. rt.applyFont(font);
  238. shape.setText(rt);
  239. List<XSSFTextParagraph> paras = shape.getTextParagraphs();
  240. assertEquals(1, paras.size());
  241. assertEquals("Test String", paras.get(0).getText());
  242. List<XSSFTextRun> runs = paras.get(0).getTextRuns();
  243. assertEquals(1, runs.size());
  244. assertEquals("Arial", runs.get(0).getFontFamily());
  245. Color clr = runs.get(0).getFontColor();
  246. assertTrue(Arrays.equals(
  247. new int[] { 0, 255, 255 } ,
  248. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  249. }
  250. /**
  251. * Test addNewTextParagraph
  252. */
  253. public void testAddNewTextParagraph() {
  254. XSSFWorkbook wb = new XSSFWorkbook();
  255. XSSFSheet sheet = wb.createSheet();
  256. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  257. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  258. XSSFTextParagraph para = shape.addNewTextParagraph();
  259. para.addNewTextRun().setText("Line 1");
  260. List<XSSFTextParagraph> paras = shape.getTextParagraphs();
  261. assertEquals(2, paras.size()); // this should be 2 as XSSFSimpleShape creates a default paragraph (no text), and then we add a string to that.
  262. List<XSSFTextRun> runs = para.getTextRuns();
  263. assertEquals(1, runs.size());
  264. assertEquals("Line 1", runs.get(0).getText());
  265. }
  266. /**
  267. * Test addNewTextParagraph using RichTextString
  268. */
  269. public void testAddNewTextParagraphWithRTS() {
  270. XSSFWorkbook wb = new XSSFWorkbook();
  271. XSSFSheet sheet = wb.createSheet();
  272. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  273. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  274. XSSFRichTextString rt = new XSSFRichTextString("Test Rich Text String");
  275. XSSFFont font = wb.createFont();
  276. font.setColor(new XSSFColor(new Color(0, 255, 255)));
  277. font.setFontName("Arial");
  278. rt.applyFont(font);
  279. XSSFFont midfont = wb.createFont();
  280. midfont.setColor(new XSSFColor(new Color(0, 255, 0)));
  281. rt.applyFont(5, 14, midfont); // set the text "Rich Text" to be green and the default font
  282. XSSFTextParagraph para = shape.addNewTextParagraph(rt);
  283. // Save and re-load it
  284. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  285. sheet = wb.getSheetAt(0);
  286. // Check
  287. drawing = sheet.createDrawingPatriarch();
  288. List<XSSFShape> shapes = drawing.getShapes();
  289. assertEquals(1, shapes.size());
  290. assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
  291. XSSFSimpleShape sshape = (XSSFSimpleShape) shapes.get(0);
  292. List<XSSFTextParagraph> paras = sshape.getTextParagraphs();
  293. assertEquals(2, paras.size()); // this should be 2 as XSSFSimpleShape creates a default paragraph (no text), and then we add a string to that.
  294. List<XSSFTextRun> runs = para.getTextRuns();
  295. assertEquals(3, runs.size());
  296. // first run properties
  297. assertEquals("Test ", runs.get(0).getText());
  298. assertEquals("Arial", runs.get(0).getFontFamily());
  299. Color clr = runs.get(0).getFontColor();
  300. assertTrue(Arrays.equals(
  301. new int[] { 0, 255, 255 } ,
  302. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  303. // second run properties
  304. assertEquals("Rich Text", runs.get(1).getText());
  305. assertEquals(XSSFFont.DEFAULT_FONT_NAME, runs.get(1).getFontFamily());
  306. clr = runs.get(1).getFontColor();
  307. assertTrue(Arrays.equals(
  308. new int[] { 0, 255, 0 } ,
  309. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  310. // third run properties
  311. assertEquals(" String", runs.get(2).getText());
  312. assertEquals("Arial", runs.get(2).getFontFamily());
  313. clr = runs.get(2).getFontColor();
  314. assertTrue(Arrays.equals(
  315. new int[] { 0, 255, 255 } ,
  316. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  317. }
  318. /**
  319. * Test add multiple paragraphs and retrieve text
  320. */
  321. public void testAddMultipleParagraphs() {
  322. XSSFWorkbook wb = new XSSFWorkbook();
  323. XSSFSheet sheet = wb.createSheet();
  324. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  325. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  326. XSSFTextParagraph para = shape.addNewTextParagraph();
  327. para.addNewTextRun().setText("Line 1");
  328. para = shape.addNewTextParagraph();
  329. para.addNewTextRun().setText("Line 2");
  330. para = shape.addNewTextParagraph();
  331. para.addNewTextRun().setText("Line 3");
  332. List<XSSFTextParagraph> paras = shape.getTextParagraphs();
  333. assertEquals(4, paras.size()); // this should be 4 as XSSFSimpleShape creates a default paragraph (no text), and then we added 3 paragraphs
  334. assertEquals("Line 1\nLine 2\nLine 3", shape.getText());
  335. }
  336. /**
  337. * Test setting the text, then adding multiple paragraphs and retrieve text
  338. */
  339. public void testSetAddMultipleParagraphs() {
  340. XSSFWorkbook wb = new XSSFWorkbook();
  341. XSSFSheet sheet = wb.createSheet();
  342. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  343. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 3, 4));
  344. shape.setText("Line 1");
  345. XSSFTextParagraph para = shape.addNewTextParagraph();
  346. para.addNewTextRun().setText("Line 2");
  347. para = shape.addNewTextParagraph();
  348. para.addNewTextRun().setText("Line 3");
  349. List<XSSFTextParagraph> paras = shape.getTextParagraphs();
  350. assertEquals(3, paras.size()); // this should be 3 as we overwrote the default paragraph with setText, then added 2 new paragraphs
  351. assertEquals("Line 1\nLine 2\nLine 3", shape.getText());
  352. }
  353. /**
  354. * Test reading text from a textbox in an existing file
  355. */
  356. public void testReadTextBox(){
  357. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
  358. XSSFSheet sheet = wb.getSheetAt(0);
  359. //the sheet has one relationship and it is XSSFDrawing
  360. List<POIXMLDocumentPart> rels = sheet.getRelations();
  361. assertEquals(1, rels.size());
  362. assertTrue(rels.get(0) instanceof XSSFDrawing);
  363. XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
  364. //sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
  365. assertSame(drawing, sheet.createDrawingPatriarch());
  366. String drawingId = drawing.getPackageRelationship().getId();
  367. //there should be a relation to this drawing in the worksheet
  368. assertTrue(sheet.getCTWorksheet().isSetDrawing());
  369. assertEquals(drawingId, sheet.getCTWorksheet().getDrawing().getId());
  370. List<XSSFShape> shapes = drawing.getShapes();
  371. assertEquals(6, shapes.size());
  372. assertTrue(shapes.get(4) instanceof XSSFSimpleShape);
  373. XSSFSimpleShape textbox = (XSSFSimpleShape) shapes.get(4);
  374. assertEquals("Sheet with various pictures\n(jpeg, png, wmf, emf and pict)", textbox.getText());
  375. }
  376. /**
  377. * Test reading multiple paragraphs from a textbox in an existing file
  378. */
  379. public void testReadTextBoxParagraphs(){
  380. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTextBox.xlsx");
  381. XSSFSheet sheet = wb.getSheetAt(0);
  382. //the sheet has one relationship and it is XSSFDrawing
  383. List<POIXMLDocumentPart> rels = sheet.getRelations();
  384. assertEquals(1, rels.size());
  385. assertTrue(rels.get(0) instanceof XSSFDrawing);
  386. XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
  387. //sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
  388. assertSame(drawing, sheet.createDrawingPatriarch());
  389. String drawingId = drawing.getPackageRelationship().getId();
  390. //there should be a relation to this drawing in the worksheet
  391. assertTrue(sheet.getCTWorksheet().isSetDrawing());
  392. assertEquals(drawingId, sheet.getCTWorksheet().getDrawing().getId());
  393. List<XSSFShape> shapes = drawing.getShapes();
  394. assertEquals(1, shapes.size());
  395. assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
  396. XSSFSimpleShape textbox = (XSSFSimpleShape) shapes.get(0);
  397. List<XSSFTextParagraph> paras = textbox.getTextParagraphs();
  398. assertEquals(3, paras.size());
  399. assertEquals("Line 2", paras.get(1).getText()); // check content of second paragraph
  400. assertEquals("Line 1\nLine 2\nLine 3", textbox.getText()); // check content of entire textbox
  401. // check attributes of paragraphs
  402. assertEquals(TextAlign.LEFT, paras.get(0).getTextAlign());
  403. assertEquals(TextAlign.CENTER, paras.get(1).getTextAlign());
  404. assertEquals(TextAlign.RIGHT, paras.get(2).getTextAlign());
  405. Color clr = paras.get(0).getTextRuns().get(0).getFontColor();
  406. assertTrue(Arrays.equals(
  407. new int[] { 255, 0, 0 } ,
  408. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  409. clr = paras.get(1).getTextRuns().get(0).getFontColor();
  410. assertTrue(Arrays.equals(
  411. new int[] { 0, 255, 0 } ,
  412. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  413. clr = paras.get(2).getTextRuns().get(0).getFontColor();
  414. assertTrue(Arrays.equals(
  415. new int[] { 0, 0, 255 } ,
  416. new int[] { clr.getRed(), clr.getGreen(), clr.getBlue() }));
  417. }
  418. /**
  419. * Test adding and reading back paragraphs as bullet points
  420. */
  421. public void testAddBulletParagraphs() {
  422. XSSFWorkbook wb = new XSSFWorkbook();
  423. XSSFSheet sheet = wb.createSheet();
  424. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  425. XSSFTextBox shape = drawing.createTextbox(new XSSFClientAnchor(0, 0, 0, 0, 2, 2, 10, 20));
  426. String paraString1 = "A normal paragraph";
  427. String paraString2 = "First bullet";
  428. String paraString3 = "Second bullet (level 1)";
  429. String paraString4 = "Third bullet";
  430. String paraString5 = "Another normal paragraph";
  431. String paraString6 = "First numbered bullet";
  432. String paraString7 = "Second bullet (level 1)";
  433. String paraString8 = "Third bullet (level 1)";
  434. String paraString9 = "Fourth bullet (level 1)";
  435. String paraString10 = "Fifth Bullet";
  436. XSSFTextParagraph para = shape.addNewTextParagraph(paraString1);
  437. para = shape.addNewTextParagraph(paraString2);
  438. para.setBullet(true);
  439. para = shape.addNewTextParagraph(paraString3);
  440. para.setBullet(true);
  441. para.setLevel(1);
  442. para = shape.addNewTextParagraph(paraString4);
  443. para.setBullet(true);
  444. para = shape.addNewTextParagraph(paraString5);
  445. para = shape.addNewTextParagraph(paraString6);
  446. para.setBullet(ListAutoNumber.ARABIC_PERIOD);
  447. para = shape.addNewTextParagraph(paraString7);
  448. para.setBullet(ListAutoNumber.ARABIC_PERIOD, 3);
  449. para.setLevel(1);
  450. para = shape.addNewTextParagraph(paraString8);
  451. para.setBullet(ListAutoNumber.ARABIC_PERIOD, 3);
  452. para.setLevel(1);
  453. para = shape.addNewTextParagraph("");
  454. para.setBullet(ListAutoNumber.ARABIC_PERIOD, 3);
  455. para.setLevel(1);
  456. para = shape.addNewTextParagraph(paraString9);
  457. para.setBullet(ListAutoNumber.ARABIC_PERIOD, 3);
  458. para.setLevel(1);
  459. para = shape.addNewTextParagraph(paraString10);
  460. para.setBullet(ListAutoNumber.ARABIC_PERIOD);
  461. // Save and re-load it
  462. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  463. sheet = wb.getSheetAt(0);
  464. // Check
  465. drawing = sheet.createDrawingPatriarch();
  466. List<XSSFShape> shapes = drawing.getShapes();
  467. assertEquals(1, shapes.size());
  468. assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
  469. XSSFSimpleShape sshape = (XSSFSimpleShape) shapes.get(0);
  470. List<XSSFTextParagraph> paras = sshape.getTextParagraphs();
  471. assertEquals(12, paras.size()); // this should be 12 as XSSFSimpleShape creates a default paragraph (no text), and then we added to that
  472. StringBuilder builder = new StringBuilder();
  473. builder.append(paraString1);
  474. builder.append("\n");
  475. builder.append("\u2022 ");
  476. builder.append(paraString2);
  477. builder.append("\n");
  478. builder.append("\t\u2022 ");
  479. builder.append(paraString3);
  480. builder.append("\n");
  481. builder.append("\u2022 ");
  482. builder.append(paraString4);
  483. builder.append("\n");
  484. builder.append(paraString5);
  485. builder.append("\n");
  486. builder.append("1. ");
  487. builder.append(paraString6);
  488. builder.append("\n");
  489. builder.append("\t3. ");
  490. builder.append(paraString7);
  491. builder.append("\n");
  492. builder.append("\t4. ");
  493. builder.append(paraString8);
  494. builder.append("\n");
  495. builder.append("\t"); // should be empty
  496. builder.append("\n");
  497. builder.append("\t5. ");
  498. builder.append(paraString9);
  499. builder.append("\n");
  500. builder.append("2. ");
  501. builder.append(paraString10);
  502. assertEquals(builder.toString(), sshape.getText());
  503. }
  504. /**
  505. * Test reading bullet numbering from a textbox in an existing file
  506. */
  507. public void testReadTextBox2(){
  508. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTextBox2.xlsx");
  509. XSSFSheet sheet = wb.getSheetAt(0);
  510. XSSFDrawing drawing = sheet.createDrawingPatriarch();
  511. List<XSSFShape> shapes = drawing.getShapes();
  512. XSSFSimpleShape textbox = (XSSFSimpleShape) shapes.get(0);
  513. String extracted = textbox.getText();
  514. StringBuilder sb = new StringBuilder();
  515. sb.append("1. content1A\n");
  516. sb.append("\t1. content1B\n");
  517. sb.append("\t2. content2B\n");
  518. sb.append("\t3. content3B\n");
  519. sb.append("2. content2A\n");
  520. sb.append("\t3. content2BStartAt3\n");
  521. sb.append("\t\n\t\n\t");
  522. sb.append("4. content2BStartAt3Incremented\n");
  523. sb.append("\t\n\t\n\t\n\t");
  524. assertEquals(sb.toString(), extracted);
  525. }
  526. }