You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestXSSFBugs.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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.util.List;
  17. import org.apache.poi.POIXMLDocumentPart;
  18. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  19. import org.apache.poi.openxml4j.opc.OPCPackage;
  20. import org.apache.poi.openxml4j.opc.PackagePart;
  21. import org.apache.poi.openxml4j.opc.PackagingURIHelper;
  22. import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
  23. import org.apache.poi.ss.usermodel.Cell;
  24. import org.apache.poi.ss.usermodel.DataFormatter;
  25. import org.apache.poi.ss.usermodel.Font;
  26. import org.apache.poi.ss.usermodel.FormulaEvaluator;
  27. import org.apache.poi.ss.usermodel.Name;
  28. import org.apache.poi.ss.usermodel.Row;
  29. import org.apache.poi.ss.usermodel.Sheet;
  30. import org.apache.poi.ss.usermodel.Workbook;
  31. import org.apache.poi.xssf.XSSFITestDataProvider;
  32. import org.apache.poi.xssf.XSSFTestDataSamples;
  33. import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
  34. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
  35. public final class TestXSSFBugs extends BaseTestBugzillaIssues {
  36. public TestXSSFBugs() {
  37. super(XSSFITestDataProvider.instance);
  38. }
  39. /**
  40. * test writing a file with large number of unique strings,
  41. * open resulting file in Excel to check results!
  42. */
  43. public void test15375_2() {
  44. baseTest15375(1000);
  45. }
  46. /**
  47. * Named ranges had the right reference, but
  48. * the wrong sheet name
  49. */
  50. public void test45430() {
  51. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45430.xlsx");
  52. assertFalse(wb.isMacroEnabled());
  53. assertEquals(3, wb.getNumberOfNames());
  54. assertEquals(0, wb.getNameAt(0).getCTName().getLocalSheetId());
  55. assertFalse(wb.getNameAt(0).getCTName().isSetLocalSheetId());
  56. assertEquals("SheetA!$A$1", wb.getNameAt(0).getRefersToFormula());
  57. assertEquals("SheetA", wb.getNameAt(0).getSheetName());
  58. assertEquals(0, wb.getNameAt(1).getCTName().getLocalSheetId());
  59. assertFalse(wb.getNameAt(1).getCTName().isSetLocalSheetId());
  60. assertEquals("SheetB!$A$1", wb.getNameAt(1).getRefersToFormula());
  61. assertEquals("SheetB", wb.getNameAt(1).getSheetName());
  62. assertEquals(0, wb.getNameAt(2).getCTName().getLocalSheetId());
  63. assertFalse(wb.getNameAt(2).getCTName().isSetLocalSheetId());
  64. assertEquals("SheetC!$A$1", wb.getNameAt(2).getRefersToFormula());
  65. assertEquals("SheetC", wb.getNameAt(2).getSheetName());
  66. // Save and re-load, still there
  67. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  68. assertEquals(3, nwb.getNumberOfNames());
  69. assertEquals("SheetA!$A$1", nwb.getNameAt(0).getRefersToFormula());
  70. }
  71. /**
  72. * We should carry vba macros over after save
  73. */
  74. public void test45431() throws Exception {
  75. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45431.xlsm");
  76. OPCPackage pkg = wb.getPackage();
  77. assertTrue(wb.isMacroEnabled());
  78. // Check the various macro related bits can be found
  79. PackagePart vba = pkg.getPart(
  80. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  81. );
  82. assertNotNull(vba);
  83. // And the drawing bit
  84. PackagePart drw = pkg.getPart(
  85. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  86. );
  87. assertNotNull(drw);
  88. // Save and re-open, both still there
  89. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  90. OPCPackage nPkg = nwb.getPackage();
  91. assertTrue(nwb.isMacroEnabled());
  92. vba = nPkg.getPart(
  93. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  94. );
  95. assertNotNull(vba);
  96. drw = nPkg.getPart(
  97. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  98. );
  99. assertNotNull(drw);
  100. // And again, just to be sure
  101. nwb = XSSFTestDataSamples.writeOutAndReadBack(nwb);
  102. nPkg = nwb.getPackage();
  103. assertTrue(nwb.isMacroEnabled());
  104. vba = nPkg.getPart(
  105. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  106. );
  107. assertNotNull(vba);
  108. drw = nPkg.getPart(
  109. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  110. );
  111. assertNotNull(drw);
  112. }
  113. public void test47504() {
  114. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47504.xlsx");
  115. assertEquals(1, wb.getNumberOfSheets());
  116. XSSFSheet sh = wb.getSheetAt(0);
  117. XSSFDrawing drawing = sh.createDrawingPatriarch();
  118. List<POIXMLDocumentPart> rels = drawing.getRelations();
  119. assertEquals(1, rels.size());
  120. assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
  121. // And again, just to be sure
  122. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  123. assertEquals(1, wb.getNumberOfSheets());
  124. sh = wb.getSheetAt(0);
  125. drawing = sh.createDrawingPatriarch();
  126. rels = drawing.getRelations();
  127. assertEquals(1, rels.size());
  128. assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
  129. }
  130. /**
  131. * Excel will sometimes write a button with a textbox
  132. * containing &gt;br&lt; (not closed!).
  133. * Clearly Excel shouldn't do this, but test that we can
  134. * read the file despite the naughtyness
  135. */
  136. public void test49020() throws Exception {
  137. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("BrNotClosed.xlsx");
  138. }
  139. /**
  140. * ensure that CTPhoneticPr is loaded by the ooxml test suite so that it is included in poi-ooxml-schemas
  141. */
  142. public void test49325() throws Exception {
  143. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49325.xlsx");
  144. CTWorksheet sh = wb.getSheetAt(0).getCTWorksheet();
  145. assertNotNull(sh.getPhoneticPr());
  146. }
  147. /**
  148. * Names which are defined with a Sheet
  149. * should return that sheet index properly
  150. */
  151. public void test48923() throws Exception {
  152. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48923.xlsx");
  153. assertEquals(4, wb.getNumberOfNames());
  154. Name b1 = wb.getName("NameB1");
  155. Name b2 = wb.getName("NameB2");
  156. Name sheet2 = wb.getName("NameSheet2");
  157. Name test = wb.getName("Test");
  158. assertNotNull(b1);
  159. assertEquals("NameB1", b1.getNameName());
  160. assertEquals("Sheet1", b1.getSheetName());
  161. assertEquals(-1, b1.getSheetIndex());
  162. assertNotNull(b2);
  163. assertEquals("NameB2", b2.getNameName());
  164. assertEquals("Sheet1", b2.getSheetName());
  165. assertEquals(-1, b2.getSheetIndex());
  166. assertNotNull(sheet2);
  167. assertEquals("NameSheet2", sheet2.getNameName());
  168. assertEquals("Sheet2", sheet2.getSheetName());
  169. assertEquals(-1, sheet2.getSheetIndex());
  170. assertNotNull(test);
  171. assertEquals("Test", test.getNameName());
  172. assertEquals("Sheet1", test.getSheetName());
  173. assertEquals(-1, test.getSheetIndex());
  174. }
  175. /**
  176. * Problem with evaluation formulas due to
  177. * NameXPtgs.
  178. * Blows up on:
  179. * IF(B6= (ROUNDUP(B6,0) + ROUNDDOWN(B6,0))/2, MROUND(B6,2),ROUND(B6,0))
  180. */
  181. public void DISABLEDtest48539() throws Exception {
  182. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48539.xlsx");
  183. assertEquals(3, wb.getNumberOfSheets());
  184. // Try each cell individually
  185. XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
  186. for(int i=0; i<wb.getNumberOfSheets(); i++) {
  187. Sheet s = wb.getSheetAt(i);
  188. for(Row r : s) {
  189. for(Cell c : r) {
  190. if(c.getCellType() == Cell.CELL_TYPE_FORMULA) {
  191. eval.evaluate(c);
  192. }
  193. }
  194. }
  195. }
  196. // Now all of them
  197. XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
  198. }
  199. /**
  200. * Foreground colours should be found even if
  201. * a theme is used
  202. */
  203. public void test48779() throws Exception {
  204. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48779.xlsx");
  205. XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
  206. XSSFCellStyle cs = cell.getCellStyle();
  207. assertNotNull(cs);
  208. assertEquals(1, cs.getIndex());
  209. // Look at the low level xml elements
  210. assertEquals(2, cs.getCoreXf().getFillId());
  211. assertEquals(0, cs.getCoreXf().getXfId());
  212. assertEquals(true, cs.getCoreXf().getApplyFill());
  213. XSSFCellFill fg = wb.getStylesSource().getFillAt(2);
  214. assertEquals(0, fg.getFillForegroundColor().getIndexed());
  215. assertEquals(0.0, fg.getFillForegroundColor().getTint());
  216. assertEquals("FFFF0000", fg.getFillForegroundColor().getARGBHex());
  217. assertEquals(64, fg.getFillBackgroundColor().getIndexed());
  218. // Now look higher up
  219. assertNotNull(cs.getFillForegroundXSSFColor());
  220. assertEquals(0, cs.getFillForegroundColor());
  221. assertEquals("FFFF0000", cs.getFillForegroundXSSFColor().getARGBHex());
  222. assertEquals("FFFF0000", cs.getFillForegroundColorColor().getARGBHex());
  223. assertNotNull(cs.getFillBackgroundColor());
  224. assertEquals(64, cs.getFillBackgroundColor());
  225. assertEquals(null, cs.getFillBackgroundXSSFColor().getARGBHex());
  226. assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex());
  227. }
  228. /**
  229. * With HSSF, if you create a font, don't change it, and
  230. * create a 2nd, you really do get two fonts that you
  231. * can alter as and when you want.
  232. * With XSSF, that wasn't the case, but this verfies
  233. * that it now is again
  234. */
  235. public void test48718() throws Exception {
  236. // Verify the HSSF behaviour
  237. // Then ensure the same for XSSF
  238. Workbook[] wbs = new Workbook[] {
  239. new HSSFWorkbook(),
  240. new XSSFWorkbook()
  241. };
  242. int[] initialFonts = new int[] { 4, 1 };
  243. for(int i=0; i<wbs.length; i++) {
  244. Workbook wb = wbs[i];
  245. int startingFonts = initialFonts[i];
  246. assertEquals(startingFonts, wb.getNumberOfFonts());
  247. // Get a font, and slightly change it
  248. Font a = wb.createFont();
  249. assertEquals(startingFonts+1, wb.getNumberOfFonts());
  250. a.setFontHeightInPoints((short)23);
  251. assertEquals(startingFonts+1, wb.getNumberOfFonts());
  252. // Get two more, unchanged
  253. Font b = wb.createFont();
  254. assertEquals(startingFonts+2, wb.getNumberOfFonts());
  255. Font c = wb.createFont();
  256. assertEquals(startingFonts+3, wb.getNumberOfFonts());
  257. }
  258. }
  259. /**
  260. * Ensure General and @ format are working properly
  261. * for integers
  262. */
  263. public void test47490() throws Exception {
  264. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("GeneralFormatTests.xlsx");
  265. Sheet s = wb.getSheetAt(1);
  266. Row r;
  267. DataFormatter df = new DataFormatter();
  268. r = s.getRow(1);
  269. assertEquals(1.0, r.getCell(2).getNumericCellValue());
  270. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  271. assertEquals("1", df.formatCellValue(r.getCell(2)));
  272. assertEquals("1", df.formatRawCellContents(1.0, -1, "@"));
  273. assertEquals("1", df.formatRawCellContents(1.0, -1, "General"));
  274. r = s.getRow(2);
  275. assertEquals(12.0, r.getCell(2).getNumericCellValue());
  276. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  277. assertEquals("12", df.formatCellValue(r.getCell(2)));
  278. assertEquals("12", df.formatRawCellContents(12.0, -1, "@"));
  279. assertEquals("12", df.formatRawCellContents(12.0, -1, "General"));
  280. r = s.getRow(3);
  281. assertEquals(123.0, r.getCell(2).getNumericCellValue());
  282. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  283. assertEquals("123", df.formatCellValue(r.getCell(2)));
  284. assertEquals("123", df.formatRawCellContents(123.0, -1, "@"));
  285. assertEquals("123", df.formatRawCellContents(123.0, -1, "General"));
  286. }
  287. /**
  288. * Ensures that XSSF and HSSF agree with each other,
  289. * and with the docs on when fetching the wrong
  290. * kind of value from a Formula cell
  291. */
  292. public void test47815() {
  293. Workbook[] wbs = new Workbook[] {
  294. new HSSFWorkbook(),
  295. new XSSFWorkbook()
  296. };
  297. for(Workbook wb : wbs) {
  298. Sheet s = wb.createSheet();
  299. Row r = s.createRow(0);
  300. // Setup
  301. Cell cn = r.createCell(0, Cell.CELL_TYPE_NUMERIC);
  302. cn.setCellValue(1.2);
  303. Cell cs = r.createCell(1, Cell.CELL_TYPE_STRING);
  304. cs.setCellValue("Testing");
  305. Cell cfn = r.createCell(2, Cell.CELL_TYPE_FORMULA);
  306. cfn.setCellFormula("A1");
  307. Cell cfs = r.createCell(3, Cell.CELL_TYPE_FORMULA);
  308. cfs.setCellFormula("B1");
  309. FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
  310. assertEquals(Cell.CELL_TYPE_NUMERIC, fe.evaluate(cfn).getCellType());
  311. assertEquals(Cell.CELL_TYPE_STRING, fe.evaluate(cfs).getCellType());
  312. fe.evaluateFormulaCell(cfn);
  313. fe.evaluateFormulaCell(cfs);
  314. // Now test
  315. assertEquals(Cell.CELL_TYPE_NUMERIC, cn.getCellType());
  316. assertEquals(Cell.CELL_TYPE_STRING, cs.getCellType());
  317. assertEquals(Cell.CELL_TYPE_FORMULA, cfn.getCellType());
  318. assertEquals(Cell.CELL_TYPE_NUMERIC, cfn.getCachedFormulaResultType());
  319. assertEquals(Cell.CELL_TYPE_FORMULA, cfs.getCellType());
  320. assertEquals(Cell.CELL_TYPE_STRING, cfs.getCachedFormulaResultType());
  321. // Different ways of retrieving
  322. assertEquals(1.2, cn.getNumericCellValue());
  323. try {
  324. cn.getRichStringCellValue();
  325. fail();
  326. } catch(IllegalStateException e) {}
  327. assertEquals("Testing", cs.getStringCellValue());
  328. try {
  329. cs.getNumericCellValue();
  330. fail();
  331. } catch(IllegalStateException e) {}
  332. assertEquals(1.2, cfn.getNumericCellValue());
  333. try {
  334. cfn.getRichStringCellValue();
  335. fail();
  336. } catch(IllegalStateException e) {}
  337. assertEquals("Testing", cfs.getStringCellValue());
  338. try {
  339. cfs.getNumericCellValue();
  340. fail();
  341. } catch(IllegalStateException e) {}
  342. }
  343. }
  344. /**
  345. * A problem file from a non-standard source (a scientific instrument that saves its
  346. * output as an .xlsx file) that have two issues:
  347. * 1. The Content Type part name is lower-case: [content_types].xml
  348. * 2. The file appears to use backslashes as path separators
  349. *
  350. * The OPC spec tolerates both of these peculiarities, so does POI
  351. */
  352. public void test49609() throws Exception {
  353. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49609.xlsx");
  354. assertEquals("FAM", wb.getSheetName(0));
  355. assertEquals("Cycle", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
  356. }
  357. }