Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

TestXSSFBugs.java 91KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430
  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 static org.junit.Assert.assertArrayEquals;
  17. import static org.junit.Assert.assertEquals;
  18. import static org.junit.Assert.assertFalse;
  19. import static org.junit.Assert.assertNotNull;
  20. import static org.junit.Assert.assertNull;
  21. import static org.junit.Assert.assertTrue;
  22. import static org.junit.Assert.fail;
  23. import java.io.ByteArrayInputStream;
  24. import java.io.ByteArrayOutputStream;
  25. import java.io.File;
  26. import java.io.FileInputStream;
  27. import java.io.FileOutputStream;
  28. import java.io.IOException;
  29. import java.util.Arrays;
  30. import java.util.Calendar;
  31. import java.util.List;
  32. import org.apache.poi.EncryptedDocumentException;
  33. import org.apache.poi.POIDataSamples;
  34. import org.apache.poi.POIXMLDocumentPart;
  35. import org.apache.poi.POIXMLException;
  36. import org.apache.poi.POIXMLProperties;
  37. import org.apache.poi.hssf.HSSFTestDataSamples;
  38. import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
  39. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  40. import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
  41. import org.apache.poi.openxml4j.opc.OPCPackage;
  42. import org.apache.poi.openxml4j.opc.PackageAccess;
  43. import org.apache.poi.openxml4j.opc.PackagePart;
  44. import org.apache.poi.openxml4j.opc.PackagingURIHelper;
  45. import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
  46. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  47. import org.apache.poi.ss.formula.WorkbookEvaluator;
  48. import org.apache.poi.ss.formula.eval.ErrorEval;
  49. import org.apache.poi.ss.formula.eval.NumberEval;
  50. import org.apache.poi.ss.formula.eval.ValueEval;
  51. import org.apache.poi.ss.formula.functions.Function;
  52. import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
  53. import org.apache.poi.ss.usermodel.Cell;
  54. import org.apache.poi.ss.usermodel.CellStyle;
  55. import org.apache.poi.ss.usermodel.CellValue;
  56. import org.apache.poi.ss.usermodel.ClientAnchor;
  57. import org.apache.poi.ss.usermodel.Comment;
  58. import org.apache.poi.ss.usermodel.CreationHelper;
  59. import org.apache.poi.ss.usermodel.DataFormatter;
  60. import org.apache.poi.ss.usermodel.DateUtil;
  61. import org.apache.poi.ss.usermodel.Drawing;
  62. import org.apache.poi.ss.usermodel.Font;
  63. import org.apache.poi.ss.usermodel.FormulaError;
  64. import org.apache.poi.ss.usermodel.FormulaEvaluator;
  65. import org.apache.poi.ss.usermodel.Hyperlink;
  66. import org.apache.poi.ss.usermodel.IndexedColors;
  67. import org.apache.poi.ss.usermodel.Name;
  68. import org.apache.poi.ss.usermodel.Row;
  69. import org.apache.poi.ss.usermodel.Sheet;
  70. import org.apache.poi.ss.usermodel.Workbook;
  71. import org.apache.poi.ss.usermodel.WorkbookFactory;
  72. import org.apache.poi.ss.util.AreaReference;
  73. import org.apache.poi.ss.util.CellRangeAddress;
  74. import org.apache.poi.ss.util.CellReference;
  75. import org.apache.poi.util.TempFile;
  76. import org.apache.poi.xssf.XLSBUnsupportedException;
  77. import org.apache.poi.xssf.XSSFITestDataProvider;
  78. import org.apache.poi.xssf.XSSFTestDataSamples;
  79. import org.apache.poi.xssf.model.CalculationChain;
  80. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  81. import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
  82. import org.junit.Ignore;
  83. import org.junit.Test;
  84. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
  85. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
  86. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames;
  87. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
  88. import org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTFontImpl;
  89. public final class TestXSSFBugs extends BaseTestBugzillaIssues {
  90. public TestXSSFBugs() {
  91. super(XSSFITestDataProvider.instance);
  92. }
  93. /**
  94. * test writing a file with large number of unique strings,
  95. * open resulting file in Excel to check results!
  96. */
  97. @Test
  98. public void bug15375_2() {
  99. bug15375(1000);
  100. }
  101. /**
  102. * Named ranges had the right reference, but
  103. * the wrong sheet name
  104. */
  105. @Test
  106. public void bug45430() {
  107. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45430.xlsx");
  108. assertFalse(wb.isMacroEnabled());
  109. assertEquals(3, wb.getNumberOfNames());
  110. assertEquals(0, wb.getNameAt(0).getCTName().getLocalSheetId());
  111. assertFalse(wb.getNameAt(0).getCTName().isSetLocalSheetId());
  112. assertEquals("SheetA!$A$1", wb.getNameAt(0).getRefersToFormula());
  113. assertEquals("SheetA", wb.getNameAt(0).getSheetName());
  114. assertEquals(0, wb.getNameAt(1).getCTName().getLocalSheetId());
  115. assertFalse(wb.getNameAt(1).getCTName().isSetLocalSheetId());
  116. assertEquals("SheetB!$A$1", wb.getNameAt(1).getRefersToFormula());
  117. assertEquals("SheetB", wb.getNameAt(1).getSheetName());
  118. assertEquals(0, wb.getNameAt(2).getCTName().getLocalSheetId());
  119. assertFalse(wb.getNameAt(2).getCTName().isSetLocalSheetId());
  120. assertEquals("SheetC!$A$1", wb.getNameAt(2).getRefersToFormula());
  121. assertEquals("SheetC", wb.getNameAt(2).getSheetName());
  122. // Save and re-load, still there
  123. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  124. assertEquals(3, nwb.getNumberOfNames());
  125. assertEquals("SheetA!$A$1", nwb.getNameAt(0).getRefersToFormula());
  126. }
  127. /**
  128. * We should carry vba macros over after save
  129. */
  130. @Test
  131. public void bug45431() throws Exception {
  132. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45431.xlsm");
  133. OPCPackage pkg = wb.getPackage();
  134. assertTrue(wb.isMacroEnabled());
  135. // Check the various macro related bits can be found
  136. PackagePart vba = pkg.getPart(
  137. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  138. );
  139. assertNotNull(vba);
  140. // And the drawing bit
  141. PackagePart drw = pkg.getPart(
  142. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  143. );
  144. assertNotNull(drw);
  145. // Save and re-open, both still there
  146. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  147. OPCPackage nPkg = nwb.getPackage();
  148. assertTrue(nwb.isMacroEnabled());
  149. vba = nPkg.getPart(
  150. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  151. );
  152. assertNotNull(vba);
  153. drw = nPkg.getPart(
  154. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  155. );
  156. assertNotNull(drw);
  157. // And again, just to be sure
  158. nwb = XSSFTestDataSamples.writeOutAndReadBack(nwb);
  159. nPkg = nwb.getPackage();
  160. assertTrue(nwb.isMacroEnabled());
  161. vba = nPkg.getPart(
  162. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  163. );
  164. assertNotNull(vba);
  165. drw = nPkg.getPart(
  166. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  167. );
  168. assertNotNull(drw);
  169. }
  170. @Test
  171. public void bug47504() {
  172. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47504.xlsx");
  173. assertEquals(1, wb.getNumberOfSheets());
  174. XSSFSheet sh = wb.getSheetAt(0);
  175. XSSFDrawing drawing = sh.createDrawingPatriarch();
  176. List<POIXMLDocumentPart> rels = drawing.getRelations();
  177. assertEquals(1, rels.size());
  178. assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
  179. // And again, just to be sure
  180. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  181. assertEquals(1, wb.getNumberOfSheets());
  182. sh = wb.getSheetAt(0);
  183. drawing = sh.createDrawingPatriarch();
  184. rels = drawing.getRelations();
  185. assertEquals(1, rels.size());
  186. assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
  187. }
  188. /**
  189. * Excel will sometimes write a button with a textbox
  190. * containing &gt;br&lt; (not closed!).
  191. * Clearly Excel shouldn't do this, but test that we can
  192. * read the file despite the naughtyness
  193. */
  194. @Test
  195. public void bug49020() throws Exception {
  196. /*XSSFWorkbook wb =*/ XSSFTestDataSamples.openSampleWorkbook("BrNotClosed.xlsx");
  197. }
  198. /**
  199. * ensure that CTPhoneticPr is loaded by the ooxml test suite so that it is included in poi-ooxml-schemas
  200. */
  201. @Test
  202. public void bug49325() throws Exception {
  203. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49325.xlsx");
  204. CTWorksheet sh = wb.getSheetAt(0).getCTWorksheet();
  205. assertNotNull(sh.getPhoneticPr());
  206. }
  207. /**
  208. * Names which are defined with a Sheet
  209. * should return that sheet index properly
  210. */
  211. @Test
  212. public void bug48923() throws Exception {
  213. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48923.xlsx");
  214. assertEquals(4, wb.getNumberOfNames());
  215. Name b1 = wb.getName("NameB1");
  216. Name b2 = wb.getName("NameB2");
  217. Name sheet2 = wb.getName("NameSheet2");
  218. Name test = wb.getName("Test");
  219. assertNotNull(b1);
  220. assertEquals("NameB1", b1.getNameName());
  221. assertEquals("Sheet1", b1.getSheetName());
  222. assertEquals(-1, b1.getSheetIndex());
  223. assertNotNull(b2);
  224. assertEquals("NameB2", b2.getNameName());
  225. assertEquals("Sheet1", b2.getSheetName());
  226. assertEquals(-1, b2.getSheetIndex());
  227. assertNotNull(sheet2);
  228. assertEquals("NameSheet2", sheet2.getNameName());
  229. assertEquals("Sheet2", sheet2.getSheetName());
  230. assertEquals(-1, sheet2.getSheetIndex());
  231. assertNotNull(test);
  232. assertEquals("Test", test.getNameName());
  233. assertEquals("Sheet1", test.getSheetName());
  234. assertEquals(-1, test.getSheetIndex());
  235. }
  236. /**
  237. * Problem with evaluation formulas due to
  238. * NameXPtgs.
  239. * Blows up on:
  240. * IF(B6= (ROUNDUP(B6,0) + ROUNDDOWN(B6,0))/2, MROUND(B6,2),ROUND(B6,0))
  241. *
  242. * TODO: delete this test case when MROUND and VAR are implemented
  243. */
  244. @Test
  245. public void bug48539() throws Exception {
  246. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48539.xlsx");
  247. assertEquals(3, wb.getNumberOfSheets());
  248. assertEquals(0, wb.getNumberOfNames());
  249. // Try each cell individually
  250. XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
  251. for(int i=0; i<wb.getNumberOfSheets(); i++) {
  252. Sheet s = wb.getSheetAt(i);
  253. for(Row r : s) {
  254. for(Cell c : r) {
  255. if(c.getCellType() == Cell.CELL_TYPE_FORMULA) {
  256. String formula = c.getCellFormula();
  257. CellValue cv;
  258. try {
  259. cv = eval.evaluate(c);
  260. } catch (Exception e) {
  261. throw new RuntimeException("Can't evaluate formula: " + formula, e);
  262. }
  263. if(cv.getCellType() == Cell.CELL_TYPE_NUMERIC) {
  264. // assert that the calculated value agrees with
  265. // the cached formula result calculated by Excel
  266. double cachedFormulaResult = c.getNumericCellValue();
  267. double evaluatedFormulaResult = cv.getNumberValue();
  268. assertEquals(c.getCellFormula(), cachedFormulaResult, evaluatedFormulaResult, 1E-7);
  269. }
  270. }
  271. }
  272. }
  273. }
  274. // Now all of them
  275. XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
  276. }
  277. /**
  278. * Foreground colours should be found even if
  279. * a theme is used
  280. */
  281. @Test
  282. public void bug48779() throws Exception {
  283. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48779.xlsx");
  284. XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
  285. XSSFCellStyle cs = cell.getCellStyle();
  286. assertNotNull(cs);
  287. assertEquals(1, cs.getIndex());
  288. // Look at the low level xml elements
  289. assertEquals(2, cs.getCoreXf().getFillId());
  290. assertEquals(0, cs.getCoreXf().getXfId());
  291. assertEquals(true, cs.getCoreXf().getApplyFill());
  292. XSSFCellFill fg = wb.getStylesSource().getFillAt(2);
  293. assertEquals(0, fg.getFillForegroundColor().getIndexed());
  294. assertEquals(0.0, fg.getFillForegroundColor().getTint(), 0);
  295. assertEquals("FFFF0000", fg.getFillForegroundColor().getARGBHex());
  296. assertEquals(64, fg.getFillBackgroundColor().getIndexed());
  297. // Now look higher up
  298. assertNotNull(cs.getFillForegroundXSSFColor());
  299. assertEquals(0, cs.getFillForegroundColor());
  300. assertEquals("FFFF0000", cs.getFillForegroundXSSFColor().getARGBHex());
  301. assertEquals("FFFF0000", cs.getFillForegroundColorColor().getARGBHex());
  302. assertNotNull(cs.getFillBackgroundColor());
  303. assertEquals(64, cs.getFillBackgroundColor());
  304. assertEquals(null, cs.getFillBackgroundXSSFColor().getARGBHex());
  305. assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex());
  306. }
  307. /**
  308. * With HSSF, if you create a font, don't change it, and
  309. * create a 2nd, you really do get two fonts that you
  310. * can alter as and when you want.
  311. * With XSSF, that wasn't the case, but this verfies
  312. * that it now is again
  313. */
  314. @Test
  315. public void bug48718() throws Exception {
  316. // Verify the HSSF behaviour
  317. // Then ensure the same for XSSF
  318. Workbook[] wbs = new Workbook[] {
  319. new HSSFWorkbook(),
  320. new XSSFWorkbook()
  321. };
  322. int[] initialFonts = new int[] { 4, 1 };
  323. for(int i=0; i<wbs.length; i++) {
  324. Workbook wb = wbs[i];
  325. int startingFonts = initialFonts[i];
  326. assertEquals(startingFonts, wb.getNumberOfFonts());
  327. // Get a font, and slightly change it
  328. Font a = wb.createFont();
  329. assertEquals(startingFonts+1, wb.getNumberOfFonts());
  330. a.setFontHeightInPoints((short)23);
  331. assertEquals(startingFonts+1, wb.getNumberOfFonts());
  332. // Get two more, unchanged
  333. /*Font b =*/ wb.createFont();
  334. assertEquals(startingFonts+2, wb.getNumberOfFonts());
  335. /*Font c =*/ wb.createFont();
  336. assertEquals(startingFonts+3, wb.getNumberOfFonts());
  337. }
  338. }
  339. /**
  340. * Ensure General and @ format are working properly
  341. * for integers
  342. */
  343. @Test
  344. public void bug47490() throws Exception {
  345. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("GeneralFormatTests.xlsx");
  346. Sheet s = wb.getSheetAt(1);
  347. Row r;
  348. DataFormatter df = new DataFormatter();
  349. r = s.getRow(1);
  350. assertEquals(1.0, r.getCell(2).getNumericCellValue(), 0);
  351. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  352. assertEquals("1", df.formatCellValue(r.getCell(2)));
  353. assertEquals("1", df.formatRawCellContents(1.0, -1, "@"));
  354. assertEquals("1", df.formatRawCellContents(1.0, -1, "General"));
  355. r = s.getRow(2);
  356. assertEquals(12.0, r.getCell(2).getNumericCellValue(), 0);
  357. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  358. assertEquals("12", df.formatCellValue(r.getCell(2)));
  359. assertEquals("12", df.formatRawCellContents(12.0, -1, "@"));
  360. assertEquals("12", df.formatRawCellContents(12.0, -1, "General"));
  361. r = s.getRow(3);
  362. assertEquals(123.0, r.getCell(2).getNumericCellValue(), 0);
  363. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  364. assertEquals("123", df.formatCellValue(r.getCell(2)));
  365. assertEquals("123", df.formatRawCellContents(123.0, -1, "@"));
  366. assertEquals("123", df.formatRawCellContents(123.0, -1, "General"));
  367. }
  368. /**
  369. * Ensures that XSSF and HSSF agree with each other,
  370. * and with the docs on when fetching the wrong
  371. * kind of value from a Formula cell
  372. */
  373. @Test
  374. public void bug47815() {
  375. Workbook[] wbs = new Workbook[] {
  376. new HSSFWorkbook(),
  377. new XSSFWorkbook()
  378. };
  379. for(Workbook wb : wbs) {
  380. Sheet s = wb.createSheet();
  381. Row r = s.createRow(0);
  382. // Setup
  383. Cell cn = r.createCell(0, Cell.CELL_TYPE_NUMERIC);
  384. cn.setCellValue(1.2);
  385. Cell cs = r.createCell(1, Cell.CELL_TYPE_STRING);
  386. cs.setCellValue("Testing");
  387. Cell cfn = r.createCell(2, Cell.CELL_TYPE_FORMULA);
  388. cfn.setCellFormula("A1");
  389. Cell cfs = r.createCell(3, Cell.CELL_TYPE_FORMULA);
  390. cfs.setCellFormula("B1");
  391. FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
  392. assertEquals(Cell.CELL_TYPE_NUMERIC, fe.evaluate(cfn).getCellType());
  393. assertEquals(Cell.CELL_TYPE_STRING, fe.evaluate(cfs).getCellType());
  394. fe.evaluateFormulaCell(cfn);
  395. fe.evaluateFormulaCell(cfs);
  396. // Now test
  397. assertEquals(Cell.CELL_TYPE_NUMERIC, cn.getCellType());
  398. assertEquals(Cell.CELL_TYPE_STRING, cs.getCellType());
  399. assertEquals(Cell.CELL_TYPE_FORMULA, cfn.getCellType());
  400. assertEquals(Cell.CELL_TYPE_NUMERIC, cfn.getCachedFormulaResultType());
  401. assertEquals(Cell.CELL_TYPE_FORMULA, cfs.getCellType());
  402. assertEquals(Cell.CELL_TYPE_STRING, cfs.getCachedFormulaResultType());
  403. // Different ways of retrieving
  404. assertEquals(1.2, cn.getNumericCellValue(), 0);
  405. try {
  406. cn.getRichStringCellValue();
  407. fail();
  408. } catch(IllegalStateException e) {}
  409. assertEquals("Testing", cs.getStringCellValue());
  410. try {
  411. cs.getNumericCellValue();
  412. fail();
  413. } catch(IllegalStateException e) {}
  414. assertEquals(1.2, cfn.getNumericCellValue(), 0);
  415. try {
  416. cfn.getRichStringCellValue();
  417. fail();
  418. } catch(IllegalStateException e) {}
  419. assertEquals("Testing", cfs.getStringCellValue());
  420. try {
  421. cfs.getNumericCellValue();
  422. fail();
  423. } catch(IllegalStateException e) {}
  424. }
  425. }
  426. /**
  427. * A problem file from a non-standard source (a scientific instrument that saves its
  428. * output as an .xlsx file) that have two issues:
  429. * 1. The Content Type part name is lower-case: [content_types].xml
  430. * 2. The file appears to use backslashes as path separators
  431. *
  432. * The OPC spec tolerates both of these peculiarities, so does POI
  433. */
  434. @Test
  435. public void bug49609() throws Exception {
  436. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49609.xlsx");
  437. assertEquals("FAM", wb.getSheetName(0));
  438. assertEquals("Cycle", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
  439. }
  440. @Test
  441. public void bug49783() throws Exception {
  442. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49783.xlsx");
  443. Sheet sheet = wb.getSheetAt(0);
  444. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  445. Cell cell;
  446. cell = sheet.getRow(0).getCell(0);
  447. assertEquals("#REF!*#REF!", cell.getCellFormula());
  448. assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
  449. assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
  450. Name nm1 = wb.getName("sale_1");
  451. assertNotNull("name sale_1 should be present", nm1);
  452. assertEquals("Sheet1!#REF!", nm1.getRefersToFormula());
  453. Name nm2 = wb.getName("sale_2");
  454. assertNotNull("name sale_2 should be present", nm2);
  455. assertEquals("Sheet1!#REF!", nm2.getRefersToFormula());
  456. cell = sheet.getRow(1).getCell(0);
  457. assertEquals("sale_1*sale_2", cell.getCellFormula());
  458. assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
  459. assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
  460. }
  461. /**
  462. * Creating a rich string of "hello world" and applying
  463. * a font to characters 1-5 means we have two strings,
  464. * "hello" and " world". As such, we need to apply
  465. * preserve spaces to the 2nd bit, lest we end up
  466. * with something like "helloworld" !
  467. */
  468. @Test
  469. public void bug49941() throws Exception {
  470. XSSFWorkbook wb = new XSSFWorkbook();
  471. XSSFSheet s = wb.createSheet();
  472. XSSFRow r = s.createRow(0);
  473. XSSFCell c = r.createCell(0);
  474. // First without fonts
  475. c.setCellValue(
  476. new XSSFRichTextString(" with spaces ")
  477. );
  478. assertEquals(" with spaces ", c.getRichStringCellValue().toString());
  479. assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  480. assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
  481. // Should have the preserve set
  482. assertEquals(
  483. 1,
  484. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
  485. );
  486. assertEquals(
  487. "preserve",
  488. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().item(0).getNodeValue()
  489. );
  490. // Save and check
  491. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  492. s = wb.getSheetAt(0);
  493. r = s.getRow(0);
  494. c = r.getCell(0);
  495. assertEquals(" with spaces ", c.getRichStringCellValue().toString());
  496. assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  497. assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
  498. // Change the string
  499. c.setCellValue(
  500. new XSSFRichTextString("hello world")
  501. );
  502. assertEquals("hello world", c.getRichStringCellValue().toString());
  503. // Won't have preserve
  504. assertEquals(
  505. 0,
  506. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
  507. );
  508. // Apply a font
  509. XSSFFont f = wb.createFont();
  510. f.setBold(true);
  511. c.getRichStringCellValue().applyFont(0, 5, f);
  512. assertEquals("hello world", c.getRichStringCellValue().toString());
  513. // Does need preserving on the 2nd part
  514. assertEquals(2, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  515. assertEquals(
  516. 0,
  517. c.getRichStringCellValue().getCTRst().getRArray(0).xgetT().getDomNode().getAttributes().getLength()
  518. );
  519. assertEquals(
  520. 1,
  521. c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().getLength()
  522. );
  523. assertEquals(
  524. "preserve",
  525. c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().item(0).getNodeValue()
  526. );
  527. // Save and check
  528. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  529. s = wb.getSheetAt(0);
  530. r = s.getRow(0);
  531. c = r.getCell(0);
  532. assertEquals("hello world", c.getRichStringCellValue().toString());
  533. wb.close();
  534. }
  535. /**
  536. * Repeatedly writing the same file which has styles
  537. */
  538. @Test
  539. public void bug49940() throws Exception {
  540. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("styles.xlsx");
  541. assertEquals(3, wb.getNumberOfSheets());
  542. assertEquals(10, wb.getStylesSource().getNumCellStyles());
  543. ByteArrayOutputStream b1 = new ByteArrayOutputStream();
  544. ByteArrayOutputStream b2 = new ByteArrayOutputStream();
  545. ByteArrayOutputStream b3 = new ByteArrayOutputStream();
  546. wb.write(b1);
  547. wb.write(b2);
  548. wb.write(b3);
  549. for(byte[] data : new byte[][] {
  550. b1.toByteArray(), b2.toByteArray(), b3.toByteArray()
  551. }) {
  552. ByteArrayInputStream bais = new ByteArrayInputStream(data);
  553. wb = new XSSFWorkbook(bais);
  554. assertEquals(3, wb.getNumberOfSheets());
  555. assertEquals(10, wb.getStylesSource().getNumCellStyles());
  556. }
  557. }
  558. /**
  559. * Various ways of removing a cell formula should all zap the calcChain
  560. * entry.
  561. */
  562. @Test
  563. public void bug49966() throws Exception {
  564. XSSFWorkbook wb = XSSFTestDataSamples
  565. .openSampleWorkbook("shared_formulas.xlsx");
  566. XSSFSheet sheet = wb.getSheetAt(0);
  567. Workbook wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  568. // CalcChain has lots of entries
  569. CalculationChain cc = wb.getCalculationChain();
  570. assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
  571. assertEquals("A3", cc.getCTCalcChain().getCArray(1).getR());
  572. assertEquals("A4", cc.getCTCalcChain().getCArray(2).getR());
  573. assertEquals("A5", cc.getCTCalcChain().getCArray(3).getR());
  574. assertEquals("A6", cc.getCTCalcChain().getCArray(4).getR());
  575. assertEquals("A7", cc.getCTCalcChain().getCArray(5).getR());
  576. assertEquals("A8", cc.getCTCalcChain().getCArray(6).getR());
  577. assertEquals(40, cc.getCTCalcChain().sizeOfCArray());
  578. wbRead.close();
  579. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  580. // Try various ways of changing the formulas
  581. // If it stays a formula, chain entry should remain
  582. // Otherwise should go
  583. sheet.getRow(1).getCell(0).setCellFormula("A1"); // stay
  584. sheet.getRow(2).getCell(0).setCellFormula(null); // go
  585. sheet.getRow(3).getCell(0).setCellType(Cell.CELL_TYPE_FORMULA); // stay
  586. wbRead.close();
  587. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  588. sheet.getRow(4).getCell(0).setCellType(Cell.CELL_TYPE_STRING); // go
  589. wbRead.close();
  590. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  591. validateCells(sheet);
  592. sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
  593. validateCells(sheet);
  594. wbRead.close();
  595. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  596. sheet.getRow(6).getCell(0).setCellType(Cell.CELL_TYPE_BLANK); // go
  597. wbRead.close();
  598. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  599. sheet.getRow(7).getCell(0).setCellValue((String) null); // go
  600. wbRead.close();
  601. wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
  602. // Save and check
  603. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  604. assertEquals(35, cc.getCTCalcChain().sizeOfCArray());
  605. cc = wb.getCalculationChain();
  606. assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
  607. assertEquals("A4", cc.getCTCalcChain().getCArray(1).getR());
  608. assertEquals("A9", cc.getCTCalcChain().getCArray(2).getR());
  609. wbRead.close();
  610. }
  611. @Test
  612. public void bug49966Row() throws Exception {
  613. XSSFWorkbook wb = XSSFTestDataSamples
  614. .openSampleWorkbook("shared_formulas.xlsx");
  615. XSSFSheet sheet = wb.getSheetAt(0);
  616. validateCells(sheet);
  617. sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
  618. validateCells(sheet);
  619. }
  620. private void validateCells(XSSFSheet sheet) {
  621. for(Row row : sheet) {
  622. // trigger handling
  623. ((XSSFRow)row).onDocumentWrite();
  624. }
  625. }
  626. @Test
  627. public void bug49156() throws Exception {
  628. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49156.xlsx");
  629. FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
  630. Sheet sheet = wb.getSheetAt(0);
  631. for(Row row : sheet){
  632. for(Cell cell : row){
  633. if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
  634. formulaEvaluator.evaluateInCell(cell); // caused NPE on some cells
  635. }
  636. }
  637. }
  638. }
  639. /**
  640. * Newlines are valid characters in a formula
  641. */
  642. @Test
  643. public void bug50440And51875() throws Exception {
  644. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("NewlineInFormulas.xlsx");
  645. Sheet s = wb.getSheetAt(0);
  646. Cell c = s.getRow(0).getCell(0);
  647. assertEquals("SUM(\n1,2\n)", c.getCellFormula());
  648. assertEquals(3.0, c.getNumericCellValue(), 0);
  649. FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
  650. formulaEvaluator.evaluateFormulaCell(c);
  651. assertEquals("SUM(\n1,2\n)", c.getCellFormula());
  652. assertEquals(3.0, c.getNumericCellValue(), 0);
  653. // For 51875
  654. Cell b3 = s.getRow(2).getCell(1);
  655. formulaEvaluator.evaluateFormulaCell(b3);
  656. assertEquals("B1+B2", b3.getCellFormula()); // The newline is lost for shared formulas
  657. assertEquals(3.0, b3.getNumericCellValue(), 0);
  658. }
  659. /**
  660. * Moving a cell comment from one cell to another
  661. */
  662. @Test
  663. public void bug50795() throws Exception {
  664. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50795.xlsx");
  665. XSSFSheet sheet = wb.getSheetAt(0);
  666. XSSFRow row = sheet.getRow(0);
  667. XSSFCell cellWith = row.getCell(0);
  668. XSSFCell cellWithoutComment = row.getCell(1);
  669. assertNotNull(cellWith.getCellComment());
  670. assertNull(cellWithoutComment.getCellComment());
  671. String exp = "\u0410\u0432\u0442\u043e\u0440:\ncomment";
  672. XSSFComment comment = cellWith.getCellComment();
  673. assertEquals(exp, comment.getString().getString());
  674. // Check we can write it out and read it back as-is
  675. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  676. sheet = wb.getSheetAt(0);
  677. row = sheet.getRow(0);
  678. cellWith = row.getCell(0);
  679. cellWithoutComment = row.getCell(1);
  680. // Double check things are as expected
  681. assertNotNull(cellWith.getCellComment());
  682. assertNull(cellWithoutComment.getCellComment());
  683. comment = cellWith.getCellComment();
  684. assertEquals(exp, comment.getString().getString());
  685. // Move the comment
  686. cellWithoutComment.setCellComment(comment);
  687. // Write out and re-check
  688. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  689. sheet = wb.getSheetAt(0);
  690. row = sheet.getRow(0);
  691. // Ensure it swapped over
  692. cellWith = row.getCell(0);
  693. cellWithoutComment = row.getCell(1);
  694. assertNull(cellWith.getCellComment());
  695. assertNotNull(cellWithoutComment.getCellComment());
  696. comment = cellWithoutComment.getCellComment();
  697. assertEquals(exp, comment.getString().getString());
  698. }
  699. /**
  700. * When the cell background colour is set with one of the first
  701. * two columns of the theme colour palette, the colours are
  702. * shades of white or black.
  703. * For those cases, ensure we don't break on reading the colour
  704. */
  705. @Test
  706. public void bug50299() throws Exception {
  707. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("50299.xlsx");
  708. // Check all the colours
  709. for(int sn=0; sn<wb.getNumberOfSheets(); sn++) {
  710. Sheet s = wb.getSheetAt(sn);
  711. for(Row r : s) {
  712. for(Cell c : r) {
  713. CellStyle cs = c.getCellStyle();
  714. if(cs != null) {
  715. cs.getFillForegroundColor();
  716. }
  717. }
  718. }
  719. }
  720. // Check one bit in detail
  721. // Check that we get back foreground=0 for the theme colours,
  722. // and background=64 for the auto colouring
  723. Sheet s = wb.getSheetAt(0);
  724. assertEquals(0, s.getRow(0).getCell(8).getCellStyle().getFillForegroundColor());
  725. assertEquals(64, s.getRow(0).getCell(8).getCellStyle().getFillBackgroundColor());
  726. assertEquals(0, s.getRow(1).getCell(8).getCellStyle().getFillForegroundColor());
  727. assertEquals(64, s.getRow(1).getCell(8).getCellStyle().getFillBackgroundColor());
  728. }
  729. /**
  730. * Excel .xls style indexed colours in a .xlsx file
  731. */
  732. @Test
  733. public void bug50786() throws Exception {
  734. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50786-indexed_colours.xlsx");
  735. XSSFSheet s = wb.getSheetAt(0);
  736. XSSFRow r = s.getRow(2);
  737. // Check we have the right cell
  738. XSSFCell c = r.getCell(1);
  739. assertEquals("test\u00a0", c.getRichStringCellValue().getString());
  740. // It should be light green
  741. XSSFCellStyle cs = c.getCellStyle();
  742. assertEquals(42, cs.getFillForegroundColor());
  743. assertEquals(42, cs.getFillForegroundColorColor().getIndexed());
  744. assertNotNull(cs.getFillForegroundColorColor().getRgb());
  745. assertEquals("FFCCFFCC", cs.getFillForegroundColorColor().getARGBHex());
  746. }
  747. /**
  748. * If the border colours are set with themes, then we
  749. * should still be able to get colours
  750. */
  751. @Test
  752. public void bug50846() throws Exception {
  753. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50846-border_colours.xlsx");
  754. XSSFSheet sheet = wb.getSheetAt(0);
  755. XSSFRow row = sheet.getRow(0);
  756. // Border from a theme, brown
  757. XSSFCell cellT = row.getCell(0);
  758. XSSFCellStyle styleT = cellT.getCellStyle();
  759. XSSFColor colorT = styleT.getBottomBorderXSSFColor();
  760. assertEquals(5, colorT.getTheme());
  761. assertEquals("FFC0504D", colorT.getARGBHex());
  762. // Border from a style direct, red
  763. XSSFCell cellS = row.getCell(1);
  764. XSSFCellStyle styleS = cellS.getCellStyle();
  765. XSSFColor colorS = styleS.getBottomBorderXSSFColor();
  766. assertEquals(0, colorS.getTheme());
  767. assertEquals("FFFF0000", colorS.getARGBHex());
  768. }
  769. /**
  770. * Fonts where their colours come from the theme rather
  771. * then being set explicitly still should allow the
  772. * fetching of the RGB.
  773. */
  774. @Test
  775. public void bug50784() throws Exception {
  776. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50784-font_theme_colours.xlsx");
  777. XSSFSheet s = wb.getSheetAt(0);
  778. XSSFRow r = s.getRow(0);
  779. // Column 1 has a font with regular colours
  780. XSSFCell cr = r.getCell(1);
  781. XSSFFont fr = wb.getFontAt( cr.getCellStyle().getFontIndex() );
  782. XSSFColor colr = fr.getXSSFColor();
  783. // No theme, has colours
  784. assertEquals(0, colr.getTheme());
  785. assertNotNull( colr.getRgb() );
  786. // Column 0 has a font with colours from a theme
  787. XSSFCell ct = r.getCell(0);
  788. XSSFFont ft = wb.getFontAt( ct.getCellStyle().getFontIndex() );
  789. XSSFColor colt = ft.getXSSFColor();
  790. // Has a theme, which has the colours on it
  791. assertEquals(9, colt.getTheme());
  792. XSSFColor themeC = wb.getTheme().getThemeColor(colt.getTheme());
  793. assertNotNull( themeC.getRgb() );
  794. assertNotNull( colt.getRgb() );
  795. assertEquals( themeC.getARGBHex(), colt.getARGBHex() ); // The same colour
  796. }
  797. /**
  798. * New lines were being eaten when setting a font on
  799. * a rich text string
  800. */
  801. @Test
  802. public void bug48877() throws Exception {
  803. String text = "Use \n with word wrap on to create a new line.\n" +
  804. "This line finishes with two trailing spaces. ";
  805. XSSFWorkbook wb = new XSSFWorkbook();
  806. XSSFSheet sheet = wb.createSheet();
  807. Font font1 = wb.createFont();
  808. font1.setColor((short) 20);
  809. Font font2 = wb.createFont();
  810. font2.setColor(Font.COLOR_RED);
  811. Font font3 = wb.getFontAt((short)0);
  812. XSSFRow row = sheet.createRow(2);
  813. XSSFCell cell = row.createCell(2);
  814. XSSFRichTextString richTextString =
  815. wb.getCreationHelper().createRichTextString(text);
  816. // Check the text has the newline
  817. assertEquals(text, richTextString.getString());
  818. // Apply the font
  819. richTextString.applyFont(font3);
  820. richTextString.applyFont(0, 3, font1);
  821. cell.setCellValue(richTextString);
  822. // To enable newlines you need set a cell styles with wrap=true
  823. CellStyle cs = wb.createCellStyle();
  824. cs.setWrapText(true);
  825. cell.setCellStyle(cs);
  826. // Check the text has the
  827. assertEquals(text, cell.getStringCellValue());
  828. // Save the file and re-read it
  829. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  830. sheet = wb.getSheetAt(0);
  831. row = sheet.getRow(2);
  832. cell = row.getCell(2);
  833. assertEquals(text, cell.getStringCellValue());
  834. // Now add a 2nd, and check again
  835. int fontAt = text.indexOf("\n", 6);
  836. cell.getRichStringCellValue().applyFont(10, fontAt+1, font2);
  837. assertEquals(text, cell.getStringCellValue());
  838. assertEquals(4, cell.getRichStringCellValue().numFormattingRuns());
  839. assertEquals("Use", cell.getRichStringCellValue().getCTRst().getRArray(0).getT());
  840. String r3 = cell.getRichStringCellValue().getCTRst().getRArray(2).getT();
  841. assertEquals("line.\n", r3.substring(r3.length()-6));
  842. // Save and re-check
  843. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  844. sheet = wb.getSheetAt(0);
  845. row = sheet.getRow(2);
  846. cell = row.getCell(2);
  847. assertEquals(text, cell.getStringCellValue());
  848. wb.close();
  849. // FileOutputStream out = new FileOutputStream("/tmp/test48877.xlsx");
  850. // wb.write(out);
  851. // out.close();
  852. }
  853. /**
  854. * Adding sheets when one has a table, then re-ordering
  855. */
  856. @Test
  857. public void bug50867() throws Exception {
  858. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50867_with_table.xlsx");
  859. assertEquals(3, wb.getNumberOfSheets());
  860. XSSFSheet s1 = wb.getSheetAt(0);
  861. XSSFSheet s2 = wb.getSheetAt(1);
  862. XSSFSheet s3 = wb.getSheetAt(2);
  863. assertEquals(1, s1.getTables().size());
  864. assertEquals(0, s2.getTables().size());
  865. assertEquals(0, s3.getTables().size());
  866. XSSFTable t = s1.getTables().get(0);
  867. assertEquals("Tabella1", t.getName());
  868. assertEquals("Tabella1", t.getDisplayName());
  869. assertEquals("A1:C3", t.getCTTable().getRef());
  870. // Add a sheet and re-order
  871. XSSFSheet s4 = wb.createSheet("NewSheet");
  872. wb.setSheetOrder(s4.getSheetName(), 0);
  873. // Check on tables
  874. assertEquals(1, s1.getTables().size());
  875. assertEquals(0, s2.getTables().size());
  876. assertEquals(0, s3.getTables().size());
  877. assertEquals(0, s4.getTables().size());
  878. // Refetch to get the new order
  879. s1 = wb.getSheetAt(0);
  880. s2 = wb.getSheetAt(1);
  881. s3 = wb.getSheetAt(2);
  882. s4 = wb.getSheetAt(3);
  883. assertEquals(0, s1.getTables().size());
  884. assertEquals(1, s2.getTables().size());
  885. assertEquals(0, s3.getTables().size());
  886. assertEquals(0, s4.getTables().size());
  887. // Save and re-load
  888. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  889. s1 = wb.getSheetAt(0);
  890. s2 = wb.getSheetAt(1);
  891. s3 = wb.getSheetAt(2);
  892. s4 = wb.getSheetAt(3);
  893. assertEquals(0, s1.getTables().size());
  894. assertEquals(1, s2.getTables().size());
  895. assertEquals(0, s3.getTables().size());
  896. assertEquals(0, s4.getTables().size());
  897. t = s2.getTables().get(0);
  898. assertEquals("Tabella1", t.getName());
  899. assertEquals("Tabella1", t.getDisplayName());
  900. assertEquals("A1:C3", t.getCTTable().getRef());
  901. // Add some more tables, and check
  902. t = s2.createTable();
  903. t.setName("New 2");
  904. t.setDisplayName("New 2");
  905. t = s3.createTable();
  906. t.setName("New 3");
  907. t.setDisplayName("New 3");
  908. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  909. s1 = wb.getSheetAt(0);
  910. s2 = wb.getSheetAt(1);
  911. s3 = wb.getSheetAt(2);
  912. s4 = wb.getSheetAt(3);
  913. assertEquals(0, s1.getTables().size());
  914. assertEquals(2, s2.getTables().size());
  915. assertEquals(1, s3.getTables().size());
  916. assertEquals(0, s4.getTables().size());
  917. t = s2.getTables().get(0);
  918. assertEquals("Tabella1", t.getName());
  919. assertEquals("Tabella1", t.getDisplayName());
  920. assertEquals("A1:C3", t.getCTTable().getRef());
  921. t = s2.getTables().get(1);
  922. assertEquals("New 2", t.getName());
  923. assertEquals("New 2", t.getDisplayName());
  924. t = s3.getTables().get(0);
  925. assertEquals("New 3", t.getName());
  926. assertEquals("New 3", t.getDisplayName());
  927. // Check the relationships
  928. assertEquals(0, s1.getRelations().size());
  929. assertEquals(3, s2.getRelations().size());
  930. assertEquals(1, s3.getRelations().size());
  931. assertEquals(0, s4.getRelations().size());
  932. assertEquals(
  933. XSSFRelation.PRINTER_SETTINGS.getContentType(),
  934. s2.getRelations().get(0).getPackagePart().getContentType()
  935. );
  936. assertEquals(
  937. XSSFRelation.TABLE.getContentType(),
  938. s2.getRelations().get(1).getPackagePart().getContentType()
  939. );
  940. assertEquals(
  941. XSSFRelation.TABLE.getContentType(),
  942. s2.getRelations().get(2).getPackagePart().getContentType()
  943. );
  944. assertEquals(
  945. XSSFRelation.TABLE.getContentType(),
  946. s3.getRelations().get(0).getPackagePart().getContentType()
  947. );
  948. assertEquals(
  949. "/xl/tables/table3.xml",
  950. s3.getRelations().get(0).getPackagePart().getPartName().toString()
  951. );
  952. }
  953. /**
  954. * Setting repeating rows and columns shouldn't break
  955. * any print settings that were there before
  956. */
  957. @SuppressWarnings("deprecation")
  958. @Test
  959. public void bug49253() throws Exception {
  960. XSSFWorkbook wb1 = new XSSFWorkbook();
  961. XSSFWorkbook wb2 = new XSSFWorkbook();
  962. // No print settings before repeating
  963. XSSFSheet s1 = wb1.createSheet();
  964. assertEquals(false, s1.getCTWorksheet().isSetPageSetup());
  965. assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
  966. wb1.setRepeatingRowsAndColumns(0, 2, 3, 1, 2);
  967. assertEquals(true, s1.getCTWorksheet().isSetPageSetup());
  968. assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
  969. XSSFPrintSetup ps1 = s1.getPrintSetup();
  970. assertEquals(false, ps1.getValidSettings());
  971. assertEquals(false, ps1.getLandscape());
  972. // Had valid print settings before repeating
  973. XSSFSheet s2 = wb2.createSheet();
  974. XSSFPrintSetup ps2 = s2.getPrintSetup();
  975. assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
  976. assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
  977. ps2.setLandscape(false);
  978. assertEquals(true, ps2.getValidSettings());
  979. assertEquals(false, ps2.getLandscape());
  980. wb2.setRepeatingRowsAndColumns(0, 2, 3, 1, 2);
  981. ps2 = s2.getPrintSetup();
  982. assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
  983. assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
  984. assertEquals(true, ps2.getValidSettings());
  985. assertEquals(false, ps2.getLandscape());
  986. wb1.close();
  987. wb2.close();
  988. }
  989. /**
  990. * Default Column style
  991. */
  992. @Test
  993. public void bug51037() throws Exception {
  994. XSSFWorkbook wb = new XSSFWorkbook();
  995. XSSFSheet s = wb.createSheet();
  996. CellStyle defaultStyle = wb.getCellStyleAt((short)0);
  997. assertEquals(0, defaultStyle.getIndex());
  998. CellStyle blueStyle = wb.createCellStyle();
  999. blueStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
  1000. blueStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
  1001. assertEquals(1, blueStyle.getIndex());
  1002. CellStyle pinkStyle = wb.createCellStyle();
  1003. pinkStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());
  1004. pinkStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
  1005. assertEquals(2, pinkStyle.getIndex());
  1006. // Starts empty
  1007. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  1008. CTCols cols = s.getCTWorksheet().getColsArray(0);
  1009. assertEquals(0, cols.sizeOfColArray());
  1010. // Add some rows and columns
  1011. XSSFRow r1 = s.createRow(0);
  1012. XSSFRow r2 = s.createRow(1);
  1013. r1.createCell(0);
  1014. r1.createCell(2);
  1015. r2.createCell(0);
  1016. r2.createCell(3);
  1017. // Check no style is there
  1018. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  1019. assertEquals(0, cols.sizeOfColArray());
  1020. assertEquals(defaultStyle, s.getColumnStyle(0));
  1021. assertEquals(defaultStyle, s.getColumnStyle(2));
  1022. assertEquals(defaultStyle, s.getColumnStyle(3));
  1023. // Apply the styles
  1024. s.setDefaultColumnStyle(0, pinkStyle);
  1025. s.setDefaultColumnStyle(3, blueStyle);
  1026. // Check
  1027. assertEquals(pinkStyle, s.getColumnStyle(0));
  1028. assertEquals(defaultStyle, s.getColumnStyle(2));
  1029. assertEquals(blueStyle, s.getColumnStyle(3));
  1030. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  1031. assertEquals(2, cols.sizeOfColArray());
  1032. assertEquals(1, cols.getColArray(0).getMin());
  1033. assertEquals(1, cols.getColArray(0).getMax());
  1034. assertEquals(pinkStyle.getIndex(), cols.getColArray(0).getStyle());
  1035. assertEquals(4, cols.getColArray(1).getMin());
  1036. assertEquals(4, cols.getColArray(1).getMax());
  1037. assertEquals(blueStyle.getIndex(), cols.getColArray(1).getStyle());
  1038. // Save, re-load and re-check
  1039. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1040. s = wb.getSheetAt(0);
  1041. defaultStyle = wb.getCellStyleAt(defaultStyle.getIndex());
  1042. blueStyle = wb.getCellStyleAt(blueStyle.getIndex());
  1043. pinkStyle = wb.getCellStyleAt(pinkStyle.getIndex());
  1044. assertEquals(pinkStyle, s.getColumnStyle(0));
  1045. assertEquals(defaultStyle, s.getColumnStyle(2));
  1046. assertEquals(blueStyle, s.getColumnStyle(3));
  1047. wb.close();
  1048. }
  1049. /**
  1050. * Repeatedly writing a file.
  1051. * Something with the SharedStringsTable currently breaks...
  1052. */
  1053. @Test
  1054. public void bug46662() throws Exception {
  1055. // New file
  1056. XSSFWorkbook wb = new XSSFWorkbook();
  1057. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1058. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1059. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1060. // Simple file
  1061. wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
  1062. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1063. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1064. XSSFTestDataSamples.writeOutAndReadBack(wb);
  1065. // Complex file
  1066. // TODO
  1067. }
  1068. /**
  1069. * Colours and styles when the list has gaps in it
  1070. */
  1071. @Test
  1072. public void bug51222() throws Exception {
  1073. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51222.xlsx");
  1074. XSSFSheet s = wb.getSheetAt(0);
  1075. XSSFCell cA4_EEECE1 = s.getRow(3).getCell(0);
  1076. XSSFCell cA5_1F497D = s.getRow(4).getCell(0);
  1077. // Check the text
  1078. assertEquals("A4", cA4_EEECE1.getRichStringCellValue().getString());
  1079. assertEquals("A5", cA5_1F497D.getRichStringCellValue().getString());
  1080. // Check the styles assigned to them
  1081. assertEquals(4, cA4_EEECE1.getCTCell().getS());
  1082. assertEquals(5, cA5_1F497D.getCTCell().getS());
  1083. // Check we look up the correct style
  1084. assertEquals(4, cA4_EEECE1.getCellStyle().getIndex());
  1085. assertEquals(5, cA5_1F497D.getCellStyle().getIndex());
  1086. // Check the fills on them at the low level
  1087. assertEquals(5, cA4_EEECE1.getCellStyle().getCoreXf().getFillId());
  1088. assertEquals(6, cA5_1F497D.getCellStyle().getCoreXf().getFillId());
  1089. // These should reference themes 2 and 3
  1090. assertEquals(2, wb.getStylesSource().getFillAt(5).getCTFill().getPatternFill().getFgColor().getTheme());
  1091. assertEquals(3, wb.getStylesSource().getFillAt(6).getCTFill().getPatternFill().getFgColor().getTheme());
  1092. // Ensure we get the right colours for these themes
  1093. // TODO fix
  1094. // assertEquals("FFEEECE1", wb.getTheme().getThemeColor(2).getARGBHex());
  1095. // assertEquals("FF1F497D", wb.getTheme().getThemeColor(3).getARGBHex());
  1096. // Finally check the colours on the styles
  1097. // TODO fix
  1098. // assertEquals("FFEEECE1", cA4_EEECE1.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
  1099. // assertEquals("FF1F497D", cA5_1F497D.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
  1100. }
  1101. @Test
  1102. public void bug51470() throws Exception {
  1103. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
  1104. XSSFSheet sh0 = wb.getSheetAt(0);
  1105. XSSFSheet sh1 = wb.cloneSheet(0);
  1106. List<POIXMLDocumentPart> rels0 = sh0.getRelations();
  1107. List<POIXMLDocumentPart> rels1 = sh1.getRelations();
  1108. assertEquals(1, rels0.size());
  1109. assertEquals(1, rels1.size());
  1110. assertEquals(rels0.get(0).getPackageRelationship(), rels1.get(0).getPackageRelationship());
  1111. }
  1112. /**
  1113. * Add comments to Sheet 1, when Sheet 2 already has
  1114. * comments (so /xl/comments1.xml is taken)
  1115. */
  1116. @Test
  1117. public void bug51850() {
  1118. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51850.xlsx");
  1119. XSSFSheet sh1 = wb.getSheetAt(0);
  1120. XSSFSheet sh2 = wb.getSheetAt(1);
  1121. // Sheet 2 has comments
  1122. assertNotNull(sh2.getCommentsTable(false));
  1123. assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
  1124. // Sheet 1 doesn't (yet)
  1125. assertNull(sh1.getCommentsTable(false));
  1126. // Try to add comments to Sheet 1
  1127. CreationHelper factory = wb.getCreationHelper();
  1128. Drawing drawing = sh1.createDrawingPatriarch();
  1129. ClientAnchor anchor = factory.createClientAnchor();
  1130. anchor.setCol1(0);
  1131. anchor.setCol2(4);
  1132. anchor.setRow1(0);
  1133. anchor.setRow2(1);
  1134. Comment comment1 = drawing.createCellComment(anchor);
  1135. comment1.setString(
  1136. factory.createRichTextString("I like this cell. It's my favourite."));
  1137. comment1.setAuthor("Bob T. Fish");
  1138. anchor = factory.createClientAnchor();
  1139. anchor.setCol1(0);
  1140. anchor.setCol2(4);
  1141. anchor.setRow1(1);
  1142. anchor.setRow2(1);
  1143. Comment comment2 = drawing.createCellComment(anchor);
  1144. comment2.setString(
  1145. factory.createRichTextString("This is much less fun..."));
  1146. comment2.setAuthor("Bob T. Fish");
  1147. Cell c1 = sh1.getRow(0).createCell(4);
  1148. c1.setCellValue(2.3);
  1149. c1.setCellComment(comment1);
  1150. Cell c2 = sh1.getRow(0).createCell(5);
  1151. c2.setCellValue(2.1);
  1152. c2.setCellComment(comment2);
  1153. // Save and re-load
  1154. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1155. sh1 = wb.getSheetAt(0);
  1156. sh2 = wb.getSheetAt(1);
  1157. // Check the comments
  1158. assertNotNull(sh2.getCommentsTable(false));
  1159. assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
  1160. assertNotNull(sh1.getCommentsTable(false));
  1161. assertEquals(2, sh1.getCommentsTable(false).getNumberOfComments());
  1162. }
  1163. /**
  1164. * Sheet names with a , in them
  1165. */
  1166. @Test
  1167. public void bug51963() throws Exception {
  1168. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51963.xlsx");
  1169. XSSFSheet sheet = wb.getSheetAt(0);
  1170. assertEquals("Abc,1", sheet.getSheetName());
  1171. Name name = wb.getName("Intekon.ProdCodes");
  1172. assertEquals("'Abc,1'!$A$1:$A$2", name.getRefersToFormula());
  1173. AreaReference ref = new AreaReference(name.getRefersToFormula());
  1174. assertEquals(0, ref.getFirstCell().getRow());
  1175. assertEquals(0, ref.getFirstCell().getCol());
  1176. assertEquals(1, ref.getLastCell().getRow());
  1177. assertEquals(0, ref.getLastCell().getCol());
  1178. }
  1179. /**
  1180. * Sum across multiple workbooks
  1181. * eg =SUM($Sheet1.C1:$Sheet4.C1)
  1182. * DISABLED As we can't currently evaluate these
  1183. */
  1184. @Ignore
  1185. public void bug48703() throws Exception {
  1186. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48703.xlsx");
  1187. XSSFSheet sheet = wb.getSheetAt(0);
  1188. // Contains two forms, one with a range and one a list
  1189. XSSFRow r1 = sheet.getRow(0);
  1190. XSSFRow r2 = sheet.getRow(1);
  1191. XSSFCell c1 = r1.getCell(1);
  1192. XSSFCell c2 = r2.getCell(1);
  1193. assertEquals(20.0, c1.getNumericCellValue(), 0);
  1194. assertEquals("SUM(Sheet1!C1,Sheet2!C1,Sheet3!C1,Sheet4!C1)", c1.getCellFormula());
  1195. assertEquals(20.0, c2.getNumericCellValue(), 0);
  1196. assertEquals("SUM(Sheet1:Sheet4!C1)", c2.getCellFormula());
  1197. // Try evaluating both
  1198. XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
  1199. eval.evaluateFormulaCell(c1);
  1200. eval.evaluateFormulaCell(c2);
  1201. assertEquals(20.0, c1.getNumericCellValue(), 0);
  1202. assertEquals(20.0, c2.getNumericCellValue(), 0);
  1203. }
  1204. /**
  1205. * Bugzilla 51710: problems reading shared formuals from .xlsx
  1206. */
  1207. @Test
  1208. public void bug51710() {
  1209. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("51710.xlsx");
  1210. final String[] columns = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N"};
  1211. final int rowMax = 500; // bug triggers on row index 59
  1212. Sheet sheet = wb.getSheetAt(0);
  1213. // go through all formula cells
  1214. for (int rInd = 2; rInd <= rowMax; rInd++) {
  1215. Row row = sheet.getRow(rInd);
  1216. for (int cInd = 1; cInd <= 12; cInd++) {
  1217. Cell cell = row.getCell(cInd);
  1218. String formula = cell.getCellFormula();
  1219. CellReference ref = new CellReference(cell);
  1220. //simulate correct answer
  1221. String correct = "$A" + (rInd + 1) + "*" + columns[cInd] + "$2";
  1222. assertEquals("Incorrect formula in " + ref.formatAsString(), correct, formula);
  1223. }
  1224. }
  1225. }
  1226. /**
  1227. * Bug 53101:
  1228. */
  1229. @Test
  1230. public void bug5301(){
  1231. Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("53101.xlsx");
  1232. FormulaEvaluator evaluator =
  1233. workbook.getCreationHelper().createFormulaEvaluator();
  1234. // A1: SUM(B1: IZ1)
  1235. double a1Value =
  1236. evaluator.evaluate(workbook.getSheetAt(0).getRow(0).getCell(0)).getNumberValue();
  1237. // Assert
  1238. assertEquals(259.0, a1Value, 0.0);
  1239. // KY: SUM(B1: IZ1)
  1240. /*double ky1Value =*/
  1241. evaluator.evaluate(workbook.getSheetAt(0).getRow(0).getCell(310)).getNumberValue();
  1242. // Assert
  1243. assertEquals(259.0, a1Value, 0.0);
  1244. }
  1245. @Test
  1246. public void bug54436(){
  1247. Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("54436.xlsx");
  1248. if(!WorkbookEvaluator.getSupportedFunctionNames().contains("GETPIVOTDATA")){
  1249. Function func = new Function() {
  1250. public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
  1251. return ErrorEval.NA;
  1252. }
  1253. };
  1254. WorkbookEvaluator.registerFunction("GETPIVOTDATA", func);
  1255. }
  1256. workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
  1257. }
  1258. /**
  1259. * Password Protected .xlsx files should give a helpful
  1260. * error message when called via WorkbookFactory.
  1261. * (You need to supply a password explicitly for them)
  1262. */
  1263. @Test(expected=EncryptedDocumentException.class)
  1264. public void bug55692_stream() throws Exception {
  1265. // Directly on a Stream
  1266. WorkbookFactory.create(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
  1267. }
  1268. @Test(expected=EncryptedDocumentException.class)
  1269. public void bug55692_poifs() throws Exception {
  1270. // Via a POIFSFileSystem
  1271. POIFSFileSystem fsP = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
  1272. WorkbookFactory.create(fsP);
  1273. }
  1274. @Test(expected=EncryptedDocumentException.class)
  1275. public void bug55692_npoifs() throws Exception {
  1276. // Via a NPOIFSFileSystem
  1277. NPOIFSFileSystem fsNP = new NPOIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
  1278. WorkbookFactory.create(fsNP);
  1279. }
  1280. @Test
  1281. public void bug53282() {
  1282. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53282b.xlsx");
  1283. Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
  1284. assertEquals("#@_#", c.getStringCellValue());
  1285. assertEquals("http://invalid.uri", c.getHyperlink().getAddress());
  1286. }
  1287. /**
  1288. * Was giving NullPointerException
  1289. * at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead
  1290. * due to a lack of Styles Table
  1291. */
  1292. @Test
  1293. public void bug56278() throws Exception {
  1294. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56278.xlsx");
  1295. assertEquals(0, wb.getSheetIndex("Market Rates"));
  1296. // Save and re-check
  1297. Workbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1298. assertEquals(0, nwb.getSheetIndex("Market Rates"));
  1299. }
  1300. @Test
  1301. public void bug56315() {
  1302. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56315.xlsx");
  1303. Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
  1304. CellValue cv = wb.getCreationHelper().createFormulaEvaluator().evaluate(c);
  1305. double rounded = cv.getNumberValue();
  1306. assertEquals(0.1, rounded, 0.0);
  1307. }
  1308. @Test
  1309. public void bug56468() throws Exception {
  1310. XSSFWorkbook wb = new XSSFWorkbook();
  1311. XSSFSheet sheet = wb.createSheet();
  1312. XSSFRow row = sheet.createRow(0);
  1313. XSSFCell cell = row.createCell(0);
  1314. cell.setCellValue("Hi");
  1315. sheet.setRepeatingRows(new CellRangeAddress(0, 0, 0, 0));
  1316. ByteArrayOutputStream bos = new ByteArrayOutputStream(8096);
  1317. wb.write(bos);
  1318. byte firstSave[] = bos.toByteArray();
  1319. bos.reset();
  1320. wb.write(bos);
  1321. byte secondSave[] = bos.toByteArray();
  1322. assertArrayEquals("Had: \n" + Arrays.toString(firstSave) + " and \n" + Arrays.toString(secondSave),
  1323. firstSave, secondSave);
  1324. wb.close();
  1325. }
  1326. /**
  1327. * ISO-8601 style cell formats with a T in them, eg
  1328. * cell format of "yyyy-MM-ddTHH:mm:ss"
  1329. */
  1330. @Test
  1331. public void bug54034() throws IOException {
  1332. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54034.xlsx");
  1333. Sheet sheet = wb.getSheet("Sheet1");
  1334. Row row = sheet.getRow(1);
  1335. Cell cell = row.getCell(2);
  1336. assertTrue(DateUtil.isCellDateFormatted(cell));
  1337. DataFormatter fmt = new DataFormatter();
  1338. assertEquals("yyyy\\-mm\\-dd\\Thh:mm", cell.getCellStyle().getDataFormatString());
  1339. assertEquals("2012-08-08T22:59", fmt.formatCellValue(cell));
  1340. }
  1341. @Test
  1342. public void testBug53798XLSX() throws IOException {
  1343. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
  1344. File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
  1345. bug53798Work(wb, xlsOutput);
  1346. }
  1347. @Ignore("Shifting rows is not yet implemented in SXSSFSheet")
  1348. @Test
  1349. public void testBug53798XLSXStream() throws IOException {
  1350. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
  1351. File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
  1352. bug53798Work(new SXSSFWorkbook(wb), xlsOutput);
  1353. }
  1354. @Test
  1355. public void testBug53798XLS() throws IOException {
  1356. Workbook wb = HSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xls");
  1357. File xlsOutput = TempFile.createTempFile("testBug53798", ".xls");
  1358. bug53798Work(wb, xlsOutput);
  1359. }
  1360. /**
  1361. * SUMIF was throwing a NPE on some formulas
  1362. */
  1363. @Test
  1364. @Ignore("This bug is still to be fixed")
  1365. public void testBug56420SumIfNPE() throws Exception {
  1366. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56420.xlsx");
  1367. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1368. Sheet sheet = wb.getSheetAt(0);
  1369. Row r = sheet.getRow(2);
  1370. Cell c = r.getCell(2);
  1371. assertEquals("SUMIF($A$1:$A$4,A3,$B$1:$B$4)", c.getCellFormula());
  1372. evaluator.evaluateInCell(c);
  1373. }
  1374. private void bug53798Work(Workbook wb, File xlsOutput) throws IOException {
  1375. Sheet testSheet = wb.getSheetAt(0);
  1376. testSheet.shiftRows(2, 2, 1);
  1377. saveAndReloadReport(wb, xlsOutput);
  1378. // 1) corrupted xlsx (unreadable data in the first row of a shifted group) already comes about
  1379. // when shifted by less than -1 negative amount (try -2)
  1380. testSheet.shiftRows(3, 3, -1);
  1381. saveAndReloadReport(wb, xlsOutput);
  1382. testSheet.shiftRows(2, 2, 1);
  1383. saveAndReloadReport(wb, xlsOutput);
  1384. Row newRow = null;
  1385. Cell newCell = null;
  1386. // 2) attempt to create a new row IN PLACE of a removed row by a negative shift causes corrupted
  1387. // xlsx file with unreadable data in the negative shifted row.
  1388. // NOTE it's ok to create any other row.
  1389. newRow = testSheet.createRow(3);
  1390. saveAndReloadReport(wb, xlsOutput);
  1391. newCell = newRow.createCell(0);
  1392. saveAndReloadReport(wb, xlsOutput);
  1393. newCell.setCellValue("new Cell in row "+newRow.getRowNum());
  1394. saveAndReloadReport(wb, xlsOutput);
  1395. // 3) once a negative shift has been made any attempt to shift another group of rows
  1396. // (note: outside of previously negative shifted rows) by a POSITIVE amount causes POI exception:
  1397. // org.apache.xmlbeans.impl.values.XmlValueDisconnectedException.
  1398. // NOTE: another negative shift on another group of rows is successful, provided no new rows in
  1399. // place of previously shifted rows were attempted to be created as explained above.
  1400. testSheet.shiftRows(6, 7, 1); // -- CHANGE the shift to positive once the behaviour of
  1401. // the above has been tested
  1402. saveAndReloadReport(wb, xlsOutput);
  1403. }
  1404. /**
  1405. * XSSFCell.typeMismatch on certain blank cells when formatting
  1406. * with DataFormatter
  1407. */
  1408. @Test
  1409. public void bug56702() throws Exception {
  1410. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56702.xlsx");
  1411. Sheet sheet = wb.getSheetAt(0);
  1412. // Get wrong cell by row 8 & column 7
  1413. Cell cell = sheet.getRow(8).getCell(7);
  1414. assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1415. // Check the value - will be zero as it is <c><v/></c>
  1416. assertEquals(0.0, cell.getNumericCellValue(), 0.001);
  1417. // Try to format
  1418. DataFormatter formatter = new DataFormatter();
  1419. formatter.formatCellValue(cell);
  1420. // Check the formatting
  1421. assertEquals("0", formatter.formatCellValue(cell));
  1422. }
  1423. /**
  1424. * Formulas which reference named ranges, either in other
  1425. * sheets, or workbook scoped but in other workbooks.
  1426. * Used to fail with with errors like
  1427. * org.apache.poi.ss.formula.FormulaParseException: Cell reference expected after sheet name at index 9
  1428. * org.apache.poi.ss.formula.FormulaParseException: Parse error near char 0 '[' in specified formula '[0]!NR_Global_B2'. Expected number, string, or defined name
  1429. */
  1430. @Test
  1431. public void bug56737() throws IOException {
  1432. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx");
  1433. // Check the named range definitions
  1434. Name nSheetScope = wb.getName("NR_To_A1");
  1435. Name nWBScope = wb.getName("NR_Global_B2");
  1436. assertNotNull(nSheetScope);
  1437. assertNotNull(nWBScope);
  1438. assertEquals("Defines!$A$1", nSheetScope.getRefersToFormula());
  1439. assertEquals("Defines!$B$2", nWBScope.getRefersToFormula());
  1440. // Check the different kinds of formulas
  1441. Sheet s = wb.getSheetAt(0);
  1442. Cell cRefSName = s.getRow(1).getCell(3);
  1443. Cell cRefWName = s.getRow(2).getCell(3);
  1444. assertEquals("Defines!NR_To_A1", cRefSName.getCellFormula());
  1445. // Note the formula, as stored in the file, has the external name index not filename
  1446. // TODO Provide a way to get the one with the filename
  1447. assertEquals("[0]!NR_Global_B2", cRefWName.getCellFormula());
  1448. // Try to evaluate them
  1449. FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
  1450. assertEquals("Test A1", eval.evaluate(cRefSName).getStringValue());
  1451. assertEquals(142, (int)eval.evaluate(cRefWName).getNumberValue());
  1452. // Try to evaluate everything
  1453. eval.evaluateAll();
  1454. }
  1455. private void saveAndReloadReport(Workbook wb, File outFile) throws IOException {
  1456. // run some method on the font to verify if it is "disconnected" already
  1457. //for(short i = 0;i < 256;i++)
  1458. {
  1459. Font font = wb.getFontAt((short)0);
  1460. if(font instanceof XSSFFont) {
  1461. XSSFFont xfont = (XSSFFont) wb.getFontAt((short)0);
  1462. CTFontImpl ctFont = (CTFontImpl) xfont.getCTFont();
  1463. assertEquals(0, ctFont.sizeOfBArray());
  1464. }
  1465. }
  1466. FileOutputStream fileOutStream = new FileOutputStream(outFile);
  1467. wb.write(fileOutStream);
  1468. fileOutStream.close();
  1469. //System.out.println("File \""+outFile.getName()+"\" has been saved successfully");
  1470. FileInputStream is = new FileInputStream(outFile);
  1471. try {
  1472. Workbook newWB = null;
  1473. try {
  1474. if(wb instanceof XSSFWorkbook) {
  1475. newWB = new XSSFWorkbook(is);
  1476. } else if(wb instanceof HSSFWorkbook) {
  1477. newWB = new HSSFWorkbook(is);
  1478. } else if(wb instanceof SXSSFWorkbook) {
  1479. newWB = new SXSSFWorkbook(new XSSFWorkbook(is));
  1480. } else {
  1481. throw new IllegalStateException("Unknown workbook: " + wb);
  1482. }
  1483. assertNotNull(newWB.getSheet("test"));
  1484. } finally {
  1485. newWB.close();
  1486. }
  1487. } finally {
  1488. is.close();
  1489. }
  1490. }
  1491. @Test
  1492. public void testBug56688_1() {
  1493. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_1.xlsx");
  1494. checkValue(excel, "-1.0"); /* Not 0.0 because POI sees date "0" minus one month as invalid date, which is -1! */
  1495. }
  1496. @Test
  1497. public void testBug56688_2() {
  1498. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_2.xlsx");
  1499. checkValue(excel, "#VALUE!");
  1500. }
  1501. @Test
  1502. public void testBug56688_3() {
  1503. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_3.xlsx");
  1504. checkValue(excel, "#VALUE!");
  1505. }
  1506. @Test
  1507. public void testBug56688_4() {
  1508. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_4.xlsx");
  1509. Calendar calendar = Calendar.getInstance();
  1510. calendar.add(Calendar.MONTH, 2);
  1511. double excelDate = DateUtil.getExcelDate(calendar.getTime());
  1512. NumberEval eval = new NumberEval(Math.floor(excelDate));
  1513. checkValue(excel, eval.getStringValue() + ".0");
  1514. }
  1515. /**
  1516. * New hyperlink with no initial cell reference, still need
  1517. * to be able to change it
  1518. * @throws IOException
  1519. */
  1520. @Test
  1521. public void testBug56527() throws IOException {
  1522. XSSFWorkbook wb = new XSSFWorkbook();
  1523. XSSFSheet sheet = wb.createSheet();
  1524. XSSFCreationHelper creationHelper = wb.getCreationHelper();
  1525. XSSFHyperlink hyperlink;
  1526. // Try with a cell reference
  1527. hyperlink = creationHelper.createHyperlink(Hyperlink.LINK_URL);
  1528. sheet.addHyperlink(hyperlink);
  1529. hyperlink.setAddress("http://myurl");
  1530. hyperlink.setCellReference("B4");
  1531. assertEquals(3, hyperlink.getFirstRow());
  1532. assertEquals(1, hyperlink.getFirstColumn());
  1533. assertEquals(3, hyperlink.getLastRow());
  1534. assertEquals(1, hyperlink.getLastColumn());
  1535. // Try with explicit rows / columns
  1536. hyperlink = creationHelper.createHyperlink(Hyperlink.LINK_URL);
  1537. sheet.addHyperlink(hyperlink);
  1538. hyperlink.setAddress("http://myurl");
  1539. hyperlink.setFirstRow(5);
  1540. hyperlink.setFirstColumn(3);
  1541. assertEquals(5, hyperlink.getFirstRow());
  1542. assertEquals(3, hyperlink.getFirstColumn());
  1543. assertEquals(5, hyperlink.getLastRow());
  1544. assertEquals(3, hyperlink.getLastColumn());
  1545. wb.close();
  1546. }
  1547. /**
  1548. * Shifting rows with a formula that references a
  1549. * function in another file
  1550. */
  1551. @Test
  1552. public void bug56502() throws Exception {
  1553. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56502.xlsx");
  1554. Sheet sheet = wb.getSheetAt(0);
  1555. Cell cFunc = sheet.getRow(3).getCell(0);
  1556. assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
  1557. Cell cRef = sheet.getRow(3).createCell(1);
  1558. cRef.setCellFormula("A3");
  1559. // Shift it down one row
  1560. sheet.shiftRows(1, sheet.getLastRowNum(), 1);
  1561. // Check the new formulas: Function won't change, Reference will
  1562. cFunc = sheet.getRow(4).getCell(0);
  1563. assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
  1564. cRef = sheet.getRow(4).getCell(1);
  1565. assertEquals("A4", cRef.getCellFormula());
  1566. }
  1567. @Test
  1568. public void bug54764() throws Exception {
  1569. OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("54764.xlsx");
  1570. // Check the core properties - will be found but empty, due
  1571. // to the expansion being too much to be considered valid
  1572. POIXMLProperties props = new POIXMLProperties(pkg);
  1573. assertEquals(null, props.getCoreProperties().getTitle());
  1574. assertEquals(null, props.getCoreProperties().getSubject());
  1575. assertEquals(null, props.getCoreProperties().getDescription());
  1576. // Now check the spreadsheet itself
  1577. try {
  1578. new XSSFWorkbook(pkg);
  1579. fail("Should fail as too much expansion occurs");
  1580. } catch(POIXMLException e) {
  1581. // Expected
  1582. }
  1583. // Try with one with the entities in the Content Types
  1584. try {
  1585. XSSFTestDataSamples.openSamplePackage("54764-2.xlsx");
  1586. fail("Should fail as too much expansion occurs");
  1587. } catch(Exception e) {
  1588. // Expected
  1589. }
  1590. // Check we can still parse valid files after all that
  1591. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
  1592. assertEquals(3, wb.getNumberOfSheets());
  1593. }
  1594. /**
  1595. * CTDefinedNamesImpl should be included in the smaller
  1596. * poi-ooxml-schemas jar
  1597. */
  1598. @Test
  1599. public void bug57176() throws Exception {
  1600. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57176.xlsx");
  1601. CTDefinedNames definedNames = wb.getCTWorkbook().getDefinedNames();
  1602. List<CTDefinedName> definedNameList = definedNames.getDefinedNameList();
  1603. for (CTDefinedName defName : definedNameList) {
  1604. assertNotNull(defName.getName());
  1605. assertNotNull(defName.getStringValue());
  1606. }
  1607. assertEquals("TestDefinedName", definedNameList.get(0).getName());
  1608. }
  1609. /**
  1610. * .xlsb files are not supported, but we should generate a helpful
  1611. * error message if given one
  1612. */
  1613. @Test
  1614. public void bug56800_xlsb() throws Exception {
  1615. // Can be opened at the OPC level
  1616. OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("Simple.xlsb");
  1617. // XSSF Workbook gives helpful error
  1618. try {
  1619. new XSSFWorkbook(pkg);
  1620. fail(".xlsb files not supported");
  1621. } catch (XLSBUnsupportedException e) {
  1622. // Good, detected and warned
  1623. }
  1624. // Workbook Factory gives helpful error on package
  1625. try {
  1626. WorkbookFactory.create(pkg);
  1627. fail(".xlsb files not supported");
  1628. } catch (XLSBUnsupportedException e) {
  1629. // Good, detected and warned
  1630. }
  1631. // Workbook Factory gives helpful error on file
  1632. File xlsbFile = HSSFTestDataSamples.getSampleFile("Simple.xlsb");
  1633. try {
  1634. WorkbookFactory.create(xlsbFile);
  1635. fail(".xlsb files not supported");
  1636. } catch (XLSBUnsupportedException e) {
  1637. // Good, detected and warned
  1638. }
  1639. }
  1640. private void checkValue(XSSFWorkbook excel, String expect) {
  1641. XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);
  1642. evaluator.evaluateAll();
  1643. XSSFCell cell = excel.getSheetAt(0).getRow(1).getCell(1);
  1644. CellValue value = evaluator.evaluate(cell);
  1645. assertEquals(expect, value.formatAsString());
  1646. }
  1647. @Test
  1648. public void testBug57196() throws IOException {
  1649. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57196.xlsx");
  1650. Sheet sheet = wb.getSheet("Feuil1");
  1651. Row mod=sheet.getRow(1);
  1652. mod.getCell(1).setCellValue(3);
  1653. HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
  1654. // FileOutputStream fileOutput = new FileOutputStream("/tmp/57196.xlsx");
  1655. // wb.write(fileOutput);
  1656. // fileOutput.close();
  1657. wb.close();
  1658. }
  1659. @Test
  1660. public void test57196_Detail() {
  1661. XSSFWorkbook wb = new XSSFWorkbook();
  1662. XSSFSheet sheet = wb.createSheet("Sheet1");
  1663. XSSFRow row = sheet.createRow(0);
  1664. XSSFCell cell = row.createCell(0);
  1665. cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
  1666. XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
  1667. CellValue cv = fe.evaluate(cell);
  1668. assertNotNull(cv);
  1669. }
  1670. @Test
  1671. public void test57196_Detail2() {
  1672. XSSFWorkbook wb = new XSSFWorkbook();
  1673. XSSFSheet sheet = wb.createSheet("Sheet1");
  1674. XSSFRow row = sheet.createRow(0);
  1675. XSSFCell cell = row.createCell(0);
  1676. cell.setCellFormula("DEC2HEX(O2+D2)");
  1677. XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
  1678. CellValue cv = fe.evaluate(cell);
  1679. assertNotNull(cv);
  1680. }
  1681. @Test
  1682. public void test57196_WorkbookEvaluator() {
  1683. //System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger");
  1684. //System.setProperty("poi.log.level", "3");
  1685. try {
  1686. XSSFWorkbook wb = new XSSFWorkbook();
  1687. XSSFSheet sheet = wb.createSheet("Sheet1");
  1688. XSSFRow row = sheet.createRow(0);
  1689. XSSFCell cell = row.createCell(0);
  1690. cell.setCellValue("0");
  1691. cell = row.createCell(1);
  1692. cell.setCellValue(0);
  1693. cell = row.createCell(2);
  1694. cell.setCellValue(0);
  1695. // simple formula worked
  1696. cell.setCellFormula("DEC2HEX(O2+D2)");
  1697. WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1698. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1699. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1700. // this already failed! Hex2Dec did not correctly handle RefEval
  1701. cell.setCellFormula("HEX2DEC(O8)");
  1702. workbookEvaluator.clearAllCachedResultValues();
  1703. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1704. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1705. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1706. // slightly more complex one failed
  1707. cell.setCellFormula("HEX2DEC(O8)-O2+D2");
  1708. workbookEvaluator.clearAllCachedResultValues();
  1709. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1710. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1711. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1712. // more complicated failed
  1713. cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
  1714. workbookEvaluator.clearAllCachedResultValues();
  1715. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1716. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1717. // what other similar functions
  1718. cell.setCellFormula("DEC2BIN(O8)-O2+D2");
  1719. workbookEvaluator.clearAllCachedResultValues();
  1720. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1721. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1722. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1723. // what other similar functions
  1724. cell.setCellFormula("DEC2BIN(A1)");
  1725. workbookEvaluator.clearAllCachedResultValues();
  1726. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1727. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1728. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1729. // what other similar functions
  1730. cell.setCellFormula("BIN2DEC(B1)");
  1731. workbookEvaluator.clearAllCachedResultValues();
  1732. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1733. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1734. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1735. } finally {
  1736. System.clearProperty("org.apache.poi.util.POILogger");
  1737. System.clearProperty("poi.log.level");
  1738. }
  1739. }
  1740. @Test
  1741. public void bug57430() throws Exception {
  1742. XSSFWorkbook wb = new XSSFWorkbook();
  1743. try {
  1744. wb.createSheet("Sheet1");
  1745. XSSFName name1 = wb.createName();
  1746. name1.setNameName("FMLA");
  1747. name1.setRefersToFormula("Sheet1!$B$3");
  1748. } finally {
  1749. wb.close();
  1750. }
  1751. }
  1752. /**
  1753. * A .xlsx file with no Shared Strings table should open fine
  1754. * in read-only mode
  1755. */
  1756. @Test
  1757. public void bug57482() throws Exception {
  1758. for (PackageAccess access : new PackageAccess[] {
  1759. PackageAccess.READ_WRITE, PackageAccess.READ
  1760. }) {
  1761. File file = HSSFTestDataSamples.getSampleFile("57482-OnlyNumeric.xlsx");
  1762. OPCPackage pkg = OPCPackage.open(file, access);
  1763. try {
  1764. // Try to open it and read the contents
  1765. XSSFWorkbook wb = new XSSFWorkbook(pkg);
  1766. assertNotNull(wb.getSharedStringSource());
  1767. assertEquals(0, wb.getSharedStringSource().getCount());
  1768. DataFormatter fmt = new DataFormatter();
  1769. XSSFSheet s = wb.getSheetAt(0);
  1770. assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
  1771. assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
  1772. assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
  1773. // Add a text cell
  1774. s.getRow(0).createCell(3).setCellValue("Testing");
  1775. assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
  1776. // Try to write-out and read again, should only work
  1777. // in read-write mode, not read-only mode
  1778. try {
  1779. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1780. if (access == PackageAccess.READ)
  1781. fail("Shouln't be able to write from read-only mode");
  1782. } catch (InvalidOperationException e) {
  1783. if (access == PackageAccess.READ) {
  1784. // Expected
  1785. } else {
  1786. // Shouldn't occur in write-mode
  1787. throw e;
  1788. }
  1789. }
  1790. // Check again
  1791. s = wb.getSheetAt(0);
  1792. assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
  1793. assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
  1794. assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
  1795. assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
  1796. } finally {
  1797. pkg.revert();
  1798. }
  1799. }
  1800. }
  1801. /**
  1802. * "Unknown error type: -60" fetching formula error value
  1803. */
  1804. @Test
  1805. public void bug57535() throws Exception {
  1806. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57535.xlsx");
  1807. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1808. evaluator.clearAllCachedResultValues();
  1809. Sheet sheet = wb.getSheet("Sheet1");
  1810. Cell cell = sheet.getRow(5).getCell(4);
  1811. assertEquals(Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1812. assertEquals("E4+E5", cell.getCellFormula());
  1813. CellValue value = evaluator.evaluate(cell);
  1814. assertEquals(Cell.CELL_TYPE_ERROR, value.getCellType());
  1815. assertEquals(-60, value.getErrorValue());
  1816. assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
  1817. assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
  1818. }
  1819. @Test
  1820. public void test57165() throws IOException {
  1821. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
  1822. try {
  1823. removeAllSheetsBut(3, wb);
  1824. wb.cloneSheet(0); // Throws exception here
  1825. wb.setSheetName(1, "New Sheet");
  1826. //saveWorkbook(wb, fileName);
  1827. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1828. try {
  1829. } finally {
  1830. wbBack.close();
  1831. }
  1832. } finally {
  1833. wb.close();
  1834. }
  1835. }
  1836. @Test
  1837. public void test57165_create() throws IOException {
  1838. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
  1839. try {
  1840. removeAllSheetsBut(3, wb);
  1841. wb.createSheet("newsheet"); // Throws exception here
  1842. wb.setSheetName(1, "New Sheet");
  1843. //saveWorkbook(wb, fileName);
  1844. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1845. try {
  1846. } finally {
  1847. wbBack.close();
  1848. }
  1849. } finally {
  1850. wb.close();
  1851. }
  1852. }
  1853. private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
  1854. {
  1855. int sheetNb = wb.getNumberOfSheets();
  1856. // Move this sheet at the first position
  1857. wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
  1858. for (int sn = sheetNb - 1; sn > 0; sn--)
  1859. {
  1860. wb.removeSheetAt(sn);
  1861. }
  1862. }
  1863. /**
  1864. * Sums 2 plus the cell at the left, indirectly to avoid reference
  1865. * problems when deleting columns, conditionally to stop recursion
  1866. */
  1867. private static final String FORMULA1 =
  1868. "IF( INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) = 0, 0,"
  1869. + "INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) ) + 2";
  1870. /**
  1871. * Sums 2 plus the upper cell, indirectly to avoid reference
  1872. * problems when deleting rows, conditionally to stop recursion
  1873. */
  1874. private static final String FORMULA2 =
  1875. "IF( INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) = 0, 0,"
  1876. + "INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) ) + 2";
  1877. /**
  1878. * Expected:
  1879. * [ 0][ 2][ 4]
  1880. * @throws IOException
  1881. */
  1882. @Test
  1883. public void testBug56820_Formula1() throws IOException {
  1884. Workbook wb = new XSSFWorkbook();
  1885. try {
  1886. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1887. Sheet sh = wb.createSheet();
  1888. sh.createRow(0).createCell(0).setCellValue(0.0d);
  1889. Cell formulaCell1 = sh.getRow(0).createCell(1);
  1890. Cell formulaCell2 = sh.getRow(0).createCell(2);
  1891. formulaCell1.setCellFormula(FORMULA1);
  1892. formulaCell2.setCellFormula(FORMULA1);
  1893. double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
  1894. double A2 = evaluator.evaluate(formulaCell2).getNumberValue();
  1895. assertEquals(2, A1, 0);
  1896. assertEquals(4, A2, 0); //<-- FAILS EXPECTATIONS
  1897. } finally {
  1898. wb.close();
  1899. }
  1900. }
  1901. /**
  1902. * Expected:
  1903. * [ 0] <- number
  1904. * [ 2] <- formula
  1905. * [ 4] <- formula
  1906. * @throws IOException
  1907. */
  1908. @Test
  1909. public void testBug56820_Formula2() throws IOException {
  1910. Workbook wb = new XSSFWorkbook();
  1911. try {
  1912. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1913. Sheet sh = wb.createSheet();
  1914. sh.createRow(0).createCell(0).setCellValue(0.0d);
  1915. Cell formulaCell1 = sh.createRow(1).createCell(0);
  1916. Cell formulaCell2 = sh.createRow(2).createCell(0);
  1917. formulaCell1.setCellFormula(FORMULA2);
  1918. formulaCell2.setCellFormula(FORMULA2);
  1919. double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
  1920. double A2 = evaluator.evaluate(formulaCell2).getNumberValue(); //<-- FAILS EVALUATION
  1921. assertEquals(2, A1, 0);
  1922. assertEquals(4, A2, 0);
  1923. } finally {
  1924. wb.close();
  1925. }
  1926. }
  1927. @Test
  1928. public void test56467() throws IOException {
  1929. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("picture.xlsx");
  1930. try {
  1931. Sheet orig = wb.getSheetAt(0);
  1932. assertNotNull(orig);
  1933. Sheet sheet = wb.cloneSheet(0);
  1934. Drawing drawing = sheet.createDrawingPatriarch();
  1935. for (XSSFShape shape : ((XSSFDrawing) drawing).getShapes()) {
  1936. if (shape instanceof XSSFPicture) {
  1937. XSSFPictureData pictureData = ((XSSFPicture) shape).getPictureData();
  1938. assertNotNull(pictureData);
  1939. }
  1940. }
  1941. // OutputStream out = new FileOutputStream("/tmp/56467.xls");
  1942. // try {
  1943. // wb.write(out);
  1944. // } finally {
  1945. // out.close();
  1946. // }
  1947. } finally {
  1948. wb.close();
  1949. }
  1950. }
  1951. /**
  1952. * OOXML-Strict files
  1953. * Not currently working - namespace mis-match from XMLBeans
  1954. */
  1955. @Test
  1956. @Ignore("XMLBeans namespace mis-match on ooxml-strict files")
  1957. public void test57699() throws Exception {
  1958. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.strict.xlsx");
  1959. assertEquals(3, wb.getNumberOfSheets());
  1960. // TODO Check sheet contents
  1961. // TODO Check formula evaluation
  1962. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1963. assertEquals(3, wbBack.getNumberOfSheets());
  1964. // TODO Re-check sheet contents
  1965. // TODO Re-check formula evaluation
  1966. }
  1967. @Test
  1968. public void testBug56295_MergeXlslsWithStyles() throws IOException {
  1969. XSSFWorkbook xlsToAppendWorkbook = XSSFTestDataSamples.openSampleWorkbook("56295.xlsx");
  1970. XSSFSheet sheet = xlsToAppendWorkbook.getSheetAt(0);
  1971. XSSFRow srcRow = sheet.getRow(0);
  1972. XSSFCell oldCell = srcRow.getCell(0);
  1973. XSSFCellStyle cellStyle = oldCell.getCellStyle();
  1974. checkStyle(cellStyle);
  1975. // StylesTable table = xlsToAppendWorkbook.getStylesSource();
  1976. // List<XSSFCellFill> fills = table.getFills();
  1977. // System.out.println("Having " + fills.size() + " fills");
  1978. // for(XSSFCellFill fill : fills) {
  1979. // System.out.println("Fill: " + fill.getFillBackgroundColor() + "/" + fill.getFillForegroundColor());
  1980. // }
  1981. XSSFWorkbook targetWorkbook = new XSSFWorkbook();
  1982. XSSFSheet newSheet = targetWorkbook.createSheet(sheet.getSheetName());
  1983. XSSFRow destRow = newSheet.createRow(0);
  1984. XSSFCell newCell = destRow.createCell(0);
  1985. //newCell.getCellStyle().cloneStyleFrom(cellStyle);
  1986. CellStyle newCellStyle = targetWorkbook.createCellStyle();
  1987. newCellStyle.cloneStyleFrom(cellStyle);
  1988. newCell.setCellStyle(newCellStyle);
  1989. checkStyle(newCell.getCellStyle());
  1990. newCell.setCellValue(oldCell.getStringCellValue());
  1991. // OutputStream os = new FileOutputStream("output.xlsm");
  1992. // try {
  1993. // targetWorkbook.write(os);
  1994. // } finally {
  1995. // os.close();
  1996. // }
  1997. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(targetWorkbook);
  1998. XSSFCellStyle styleBack = wbBack.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
  1999. checkStyle(styleBack);
  2000. }
  2001. /**
  2002. * Paragraph with property BuFont but none of the properties
  2003. * BuNone, BuChar, and BuAutoNum, used to trigger a NPE
  2004. * Excel treats this as not-bulleted, so now do we
  2005. */
  2006. @Test
  2007. public void testBug57826() {
  2008. XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57826.xlsx");
  2009. assertTrue("no sheets in workbook", workbook.getNumberOfSheets() >= 1);
  2010. XSSFSheet sheet = workbook.getSheetAt(0);
  2011. XSSFDrawing drawing = sheet.getDrawingPatriarch();
  2012. assertNotNull(drawing);
  2013. List<XSSFShape> shapes = drawing.getShapes();
  2014. assertEquals(1, shapes.size());
  2015. assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
  2016. XSSFSimpleShape shape = (XSSFSimpleShape)shapes.get(0);
  2017. // Used to throw a NPE
  2018. String text = shape.getText();
  2019. // No bulleting info included
  2020. assertEquals("test ok", text);
  2021. }
  2022. private void checkStyle(XSSFCellStyle cellStyle) {
  2023. assertNotNull(cellStyle);
  2024. assertEquals(0, cellStyle.getFillForegroundColor());
  2025. assertNotNull(cellStyle.getFillForegroundXSSFColor());
  2026. XSSFColor fgColor = cellStyle.getFillForegroundColorColor();
  2027. assertNotNull(fgColor);
  2028. assertEquals("FF00FFFF", fgColor.getARGBHex());
  2029. assertEquals(0, cellStyle.getFillBackgroundColor());
  2030. assertNotNull(cellStyle.getFillBackgroundXSSFColor());
  2031. XSSFColor bgColor = cellStyle.getFillBackgroundColorColor();
  2032. assertNotNull(bgColor);
  2033. assertEquals("FF00FFFF", fgColor.getARGBHex());
  2034. }
  2035. @Test
  2036. public void bug57642() throws Exception {
  2037. XSSFWorkbook wb = new XSSFWorkbook();
  2038. XSSFSheet s = wb.createSheet("TestSheet");
  2039. XSSFCell c = s.createRow(0).createCell(0);
  2040. c.setCellFormula("ISERROR(TestSheet!A1)");
  2041. c = s.createRow(1).createCell(1);
  2042. c.setCellFormula("ISERROR(B2)");
  2043. wb.setSheetName(0, "CSN");
  2044. c = s.getRow(0).getCell(0);
  2045. assertEquals("ISERROR(CSN!A1)", c.getCellFormula());
  2046. c = s.getRow(1).getCell(1);
  2047. assertEquals("ISERROR(B2)", c.getCellFormula());
  2048. }
  2049. }