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

TestXSSFBugs.java 121KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234
  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.io.InputStream;
  30. import java.io.OutputStream;
  31. import java.util.Arrays;
  32. import java.util.Calendar;
  33. import java.util.HashMap;
  34. import java.util.HashSet;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.Set;
  38. import java.util.TimeZone;
  39. import java.util.TreeMap;
  40. import org.apache.poi.EncryptedDocumentException;
  41. import org.apache.poi.POIDataSamples;
  42. import org.apache.poi.POIXMLDocumentPart;
  43. import org.apache.poi.POIXMLDocumentPart.RelationPart;
  44. import org.apache.poi.POIXMLException;
  45. import org.apache.poi.POIXMLProperties;
  46. import org.apache.poi.common.usermodel.HyperlinkType;
  47. import org.apache.poi.hssf.HSSFTestDataSamples;
  48. import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
  49. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  50. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  51. import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
  52. import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
  53. import org.apache.poi.openxml4j.opc.OPCPackage;
  54. import org.apache.poi.openxml4j.opc.PackageAccess;
  55. import org.apache.poi.openxml4j.opc.PackagePart;
  56. import org.apache.poi.openxml4j.opc.PackageRelationship;
  57. import org.apache.poi.openxml4j.opc.PackagingURIHelper;
  58. import org.apache.poi.openxml4j.util.ZipSecureFile;
  59. import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
  60. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  61. import org.apache.poi.ss.SpreadsheetVersion;
  62. import org.apache.poi.ss.formula.ConditionalFormattingEvaluator;
  63. import org.apache.poi.ss.formula.EvaluationConditionalFormatRule;
  64. import org.apache.poi.ss.formula.FormulaParser;
  65. import org.apache.poi.ss.formula.FormulaRenderer;
  66. import org.apache.poi.ss.formula.FormulaShifter;
  67. import org.apache.poi.ss.formula.FormulaType;
  68. import org.apache.poi.ss.formula.WorkbookEvaluator;
  69. import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
  70. import org.apache.poi.ss.formula.eval.ErrorEval;
  71. import org.apache.poi.ss.formula.eval.NumberEval;
  72. import org.apache.poi.ss.formula.functions.Function;
  73. import org.apache.poi.ss.formula.ptg.Ptg;
  74. import org.apache.poi.ss.usermodel.*;
  75. import org.apache.poi.ss.util.AreaReference;
  76. import org.apache.poi.ss.util.CellRangeAddress;
  77. import org.apache.poi.ss.util.CellReference;
  78. import org.apache.poi.ss.util.CellUtil;
  79. import org.apache.poi.util.LocaleUtil;
  80. import org.apache.poi.util.NullOutputStream;
  81. import org.apache.poi.util.TempFile;
  82. import org.apache.poi.xssf.XLSBUnsupportedException;
  83. import org.apache.poi.xssf.XSSFITestDataProvider;
  84. import org.apache.poi.xssf.XSSFTestDataSamples;
  85. import org.apache.poi.xssf.model.CalculationChain;
  86. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  87. import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
  88. import org.apache.xmlbeans.XmlException;
  89. import org.junit.Ignore;
  90. import org.junit.Test;
  91. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcCell;
  92. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
  93. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
  94. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames;
  95. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
  96. import org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTFontImpl;
  97. public final class TestXSSFBugs extends BaseTestBugzillaIssues {
  98. public TestXSSFBugs() {
  99. super(XSSFITestDataProvider.instance);
  100. }
  101. /**
  102. * test writing a file with large number of unique strings,
  103. * open resulting file in Excel to check results!
  104. */
  105. @Test
  106. public void bug15375_2() throws IOException {
  107. bug15375(1000);
  108. }
  109. /**
  110. * Named ranges had the right reference, but
  111. * the wrong sheet name
  112. */
  113. @Test
  114. public void bug45430() throws IOException {
  115. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45430.xlsx");
  116. assertFalse(wb.isMacroEnabled());
  117. assertEquals(3, wb.getNumberOfNames());
  118. assertEquals(0, wb.getName("SheetAA1").getCTName().getLocalSheetId());
  119. assertFalse(wb.getName("SheetAA1").getCTName().isSetLocalSheetId());
  120. assertEquals("SheetA!$A$1", wb.getName("SheetAA1").getRefersToFormula());
  121. assertEquals("SheetA", wb.getName("SheetAA1").getSheetName());
  122. assertEquals(0, wb.getName("SheetBA1").getCTName().getLocalSheetId());
  123. assertFalse(wb.getName("SheetBA1").getCTName().isSetLocalSheetId());
  124. assertEquals("SheetB!$A$1", wb.getName("SheetBA1").getRefersToFormula());
  125. assertEquals("SheetB", wb.getName("SheetBA1").getSheetName());
  126. assertEquals(0, wb.getName("SheetCA1").getCTName().getLocalSheetId());
  127. assertFalse(wb.getName("SheetCA1").getCTName().isSetLocalSheetId());
  128. assertEquals("SheetC!$A$1", wb.getName("SheetCA1").getRefersToFormula());
  129. assertEquals("SheetC", wb.getName("SheetCA1").getSheetName());
  130. // Save and re-load, still there
  131. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  132. assertEquals(3, nwb.getNumberOfNames());
  133. assertEquals("SheetA!$A$1", nwb.getName("SheetAA1").getRefersToFormula());
  134. nwb.close();
  135. wb.close();
  136. }
  137. /**
  138. * We should carry vba macros over after save
  139. */
  140. @Test
  141. public void bug45431() throws IOException, InvalidFormatException {
  142. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("45431.xlsm");
  143. OPCPackage pkg1 = wb1.getPackage();
  144. assertTrue(wb1.isMacroEnabled());
  145. // Check the various macro related bits can be found
  146. PackagePart vba = pkg1.getPart(
  147. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  148. );
  149. assertNotNull(vba);
  150. // And the drawing bit
  151. PackagePart drw = pkg1.getPart(
  152. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  153. );
  154. assertNotNull(drw);
  155. // Save and re-open, both still there
  156. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  157. pkg1.close();
  158. wb1.close();
  159. OPCPackage pkg2 = wb2.getPackage();
  160. assertTrue(wb2.isMacroEnabled());
  161. vba = pkg2.getPart(
  162. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  163. );
  164. assertNotNull(vba);
  165. drw = pkg2.getPart(
  166. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  167. );
  168. assertNotNull(drw);
  169. // And again, just to be sure
  170. XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
  171. pkg2.close();
  172. wb2.close();
  173. OPCPackage pkg3 = wb3.getPackage();
  174. assertTrue(wb3.isMacroEnabled());
  175. vba = pkg3.getPart(
  176. PackagingURIHelper.createPartName("/xl/vbaProject.bin")
  177. );
  178. assertNotNull(vba);
  179. drw = pkg3.getPart(
  180. PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
  181. );
  182. assertNotNull(drw);
  183. pkg3.close();
  184. wb3.close();
  185. }
  186. @Test
  187. public void bug47504() throws IOException {
  188. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("47504.xlsx");
  189. assertEquals(1, wb1.getNumberOfSheets());
  190. XSSFSheet sh = wb1.getSheetAt(0);
  191. XSSFDrawing drawing = sh.createDrawingPatriarch();
  192. List<RelationPart> rels = drawing.getRelationParts();
  193. assertEquals(1, rels.size());
  194. assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());
  195. // And again, just to be sure
  196. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  197. wb1.close();
  198. assertEquals(1, wb2.getNumberOfSheets());
  199. sh = wb2.getSheetAt(0);
  200. drawing = sh.createDrawingPatriarch();
  201. rels = drawing.getRelationParts();
  202. assertEquals(1, rels.size());
  203. assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());
  204. wb2.close();
  205. }
  206. /**
  207. * Excel will sometimes write a button with a textbox
  208. * containing &gt;br&lt; (not closed!).
  209. * Clearly Excel shouldn't do this, but test that we can
  210. * read the file despite the naughtiness
  211. */
  212. @Test
  213. public void bug49020() throws IOException {
  214. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("BrNotClosed.xlsx");
  215. wb.close();
  216. }
  217. /**
  218. * ensure that CTPhoneticPr is loaded by the ooxml test suite so that it is included in poi-ooxml-schemas
  219. */
  220. @Test
  221. public void bug49325() throws IOException {
  222. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49325.xlsx");
  223. CTWorksheet sh = wb.getSheetAt(0).getCTWorksheet();
  224. assertNotNull(sh.getPhoneticPr());
  225. wb.close();
  226. }
  227. /**
  228. * Names which are defined with a Sheet
  229. * should return that sheet index properly
  230. */
  231. @Test
  232. public void bug48923() throws IOException {
  233. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48923.xlsx");
  234. assertEquals(4, wb.getNumberOfNames());
  235. Name b1 = wb.getName("NameB1");
  236. Name b2 = wb.getName("NameB2");
  237. Name sheet2 = wb.getName("NameSheet2");
  238. Name test = wb.getName("Test");
  239. assertNotNull(b1);
  240. assertEquals("NameB1", b1.getNameName());
  241. assertEquals("Sheet1", b1.getSheetName());
  242. assertEquals(-1, b1.getSheetIndex());
  243. assertNotNull(b2);
  244. assertEquals("NameB2", b2.getNameName());
  245. assertEquals("Sheet1", b2.getSheetName());
  246. assertEquals(-1, b2.getSheetIndex());
  247. assertNotNull(sheet2);
  248. assertEquals("NameSheet2", sheet2.getNameName());
  249. assertEquals("Sheet2", sheet2.getSheetName());
  250. assertEquals(-1, sheet2.getSheetIndex());
  251. assertNotNull(test);
  252. assertEquals("Test", test.getNameName());
  253. assertEquals("Sheet1", test.getSheetName());
  254. assertEquals(-1, test.getSheetIndex());
  255. wb.close();
  256. }
  257. /**
  258. * Problem with evaluation formulas due to
  259. * NameXPtgs.
  260. * Blows up on:
  261. * IF(B6= (ROUNDUP(B6,0) + ROUNDDOWN(B6,0))/2, MROUND(B6,2),ROUND(B6,0))
  262. * <p>
  263. * TODO: delete this test case when MROUND and VAR are implemented
  264. */
  265. @Test
  266. public void bug48539() throws IOException {
  267. try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48539.xlsx")) {
  268. assertEquals(3, wb.getNumberOfSheets());
  269. assertEquals(0, wb.getNumberOfNames());
  270. // Try each cell individually
  271. XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
  272. for (int i = 0; i < wb.getNumberOfSheets(); i++) {
  273. Sheet s = wb.getSheetAt(i);
  274. for (Row r : s) {
  275. for (Cell c : r) {
  276. if (c.getCellType() == CellType.FORMULA) {
  277. CellValue cv = eval.evaluate(c);
  278. if (cv.getCellType() == CellType.NUMERIC) {
  279. // assert that the calculated value agrees with
  280. // the cached formula result calculated by Excel
  281. String formula = c.getCellFormula();
  282. double cachedFormulaResult = c.getNumericCellValue();
  283. double evaluatedFormulaResult = cv.getNumberValue();
  284. assertEquals(formula, cachedFormulaResult, evaluatedFormulaResult, 1E-7);
  285. }
  286. }
  287. }
  288. }
  289. }
  290. // Now all of them
  291. XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
  292. }
  293. }
  294. /**
  295. * Foreground colours should be found even if
  296. * a theme is used
  297. */
  298. @Test
  299. public void bug48779() throws IOException {
  300. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48779.xlsx");
  301. XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
  302. XSSFCellStyle cs = cell.getCellStyle();
  303. assertNotNull(cs);
  304. assertEquals(1, cs.getIndex());
  305. // Look at the low level xml elements
  306. assertEquals(2, cs.getCoreXf().getFillId());
  307. assertEquals(0, cs.getCoreXf().getXfId());
  308. assertEquals(true, cs.getCoreXf().getApplyFill());
  309. XSSFCellFill fg = wb.getStylesSource().getFillAt(2);
  310. assertNotNull(fg.getFillForegroundColor());
  311. assertEquals(0, fg.getFillForegroundColor().getIndexed());
  312. assertEquals(0.0, fg.getFillForegroundColor().getTint(), 0);
  313. assertEquals("FFFF0000", fg.getFillForegroundColor().getARGBHex());
  314. assertNotNull(fg.getFillBackgroundColor());
  315. assertEquals(64, fg.getFillBackgroundColor().getIndexed());
  316. // Now look higher up
  317. assertNotNull(cs.getFillForegroundXSSFColor());
  318. assertEquals(0, cs.getFillForegroundColor());
  319. assertEquals("FFFF0000", cs.getFillForegroundXSSFColor().getARGBHex());
  320. assertEquals("FFFF0000", cs.getFillForegroundColorColor().getARGBHex());
  321. assertEquals(64, cs.getFillBackgroundColor());
  322. assertEquals(null, cs.getFillBackgroundXSSFColor().getARGBHex());
  323. assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex());
  324. wb.close();
  325. }
  326. /**
  327. * Ensure General and @ format are working properly
  328. * for integers
  329. */
  330. @Test
  331. public void bug47490() throws IOException {
  332. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("GeneralFormatTests.xlsx");
  333. Sheet s = wb.getSheetAt(1);
  334. Row r;
  335. DataFormatter df = new DataFormatter();
  336. r = s.getRow(1);
  337. assertEquals(1.0, r.getCell(2).getNumericCellValue(), 0);
  338. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  339. assertEquals("1", df.formatCellValue(r.getCell(2)));
  340. assertEquals("1", df.formatRawCellContents(1.0, -1, "@"));
  341. assertEquals("1", df.formatRawCellContents(1.0, -1, "General"));
  342. r = s.getRow(2);
  343. assertEquals(12.0, r.getCell(2).getNumericCellValue(), 0);
  344. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  345. assertEquals("12", df.formatCellValue(r.getCell(2)));
  346. assertEquals("12", df.formatRawCellContents(12.0, -1, "@"));
  347. assertEquals("12", df.formatRawCellContents(12.0, -1, "General"));
  348. r = s.getRow(3);
  349. assertEquals(123.0, r.getCell(2).getNumericCellValue(), 0);
  350. assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
  351. assertEquals("123", df.formatCellValue(r.getCell(2)));
  352. assertEquals("123", df.formatRawCellContents(123.0, -1, "@"));
  353. assertEquals("123", df.formatRawCellContents(123.0, -1, "General"));
  354. wb.close();
  355. }
  356. /**
  357. * A problem file from a non-standard source (a scientific instrument that saves its
  358. * output as an .xlsx file) that have two issues:
  359. * 1. The Content Type part name is lower-case: [content_types].xml
  360. * 2. The file appears to use backslashes as path separators
  361. * <p>
  362. * The OPC spec tolerates both of these peculiarities, so does POI
  363. */
  364. @Test
  365. public void bug49609() throws IOException {
  366. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49609.xlsx");
  367. assertEquals("FAM", wb.getSheetName(0));
  368. assertEquals("Cycle", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
  369. wb.close();
  370. }
  371. @Test
  372. public void bug49783() throws IOException {
  373. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49783.xlsx");
  374. Sheet sheet = wb.getSheetAt(0);
  375. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  376. Cell cell;
  377. cell = sheet.getRow(0).getCell(0);
  378. assertEquals("#REF!*#REF!", cell.getCellFormula());
  379. assertEquals(CellType.ERROR, evaluator.evaluateInCell(cell).getCellType());
  380. assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
  381. Name nm1 = wb.getName("sale_1");
  382. assertNotNull("name sale_1 should be present", nm1);
  383. assertEquals("Sheet1!#REF!", nm1.getRefersToFormula());
  384. Name nm2 = wb.getName("sale_2");
  385. assertNotNull("name sale_2 should be present", nm2);
  386. assertEquals("Sheet1!#REF!", nm2.getRefersToFormula());
  387. cell = sheet.getRow(1).getCell(0);
  388. assertEquals("sale_1*sale_2", cell.getCellFormula());
  389. assertEquals(CellType.ERROR, evaluator.evaluateInCell(cell).getCellType());
  390. assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
  391. wb.close();
  392. }
  393. /**
  394. * Creating a rich string of "hello world" and applying
  395. * a font to characters 1-5 means we have two strings,
  396. * "hello" and " world". As such, we need to apply
  397. * preserve spaces to the 2nd bit, lest we end up
  398. * with something like "helloworld" !
  399. */
  400. @Test
  401. public void bug49941() throws IOException {
  402. XSSFWorkbook wb1 = new XSSFWorkbook();
  403. XSSFSheet s = wb1.createSheet();
  404. XSSFRow r = s.createRow(0);
  405. XSSFCell c = r.createCell(0);
  406. // First without fonts
  407. c.setCellValue(
  408. new XSSFRichTextString(" with spaces ")
  409. );
  410. assertEquals(" with spaces ", c.getRichStringCellValue().toString());
  411. assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  412. assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
  413. // Should have the preserve set
  414. assertEquals(
  415. 1,
  416. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
  417. );
  418. assertEquals(
  419. "preserve",
  420. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().item(0).getNodeValue()
  421. );
  422. // Save and check
  423. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  424. wb1.close();
  425. s = wb2.getSheetAt(0);
  426. r = s.getRow(0);
  427. c = r.getCell(0);
  428. assertEquals(" with spaces ", c.getRichStringCellValue().toString());
  429. assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  430. assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
  431. // Change the string
  432. c.setCellValue(
  433. new XSSFRichTextString("hello world")
  434. );
  435. assertEquals("hello world", c.getRichStringCellValue().toString());
  436. // Won't have preserve
  437. assertEquals(
  438. 0,
  439. c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
  440. );
  441. // Apply a font
  442. XSSFFont f = wb2.createFont();
  443. f.setBold(true);
  444. c.getRichStringCellValue().applyFont(0, 5, f);
  445. assertEquals("hello world", c.getRichStringCellValue().toString());
  446. // Does need preserving on the 2nd part
  447. assertEquals(2, c.getRichStringCellValue().getCTRst().sizeOfRArray());
  448. assertEquals(
  449. 0,
  450. c.getRichStringCellValue().getCTRst().getRArray(0).xgetT().getDomNode().getAttributes().getLength()
  451. );
  452. assertEquals(
  453. 1,
  454. c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().getLength()
  455. );
  456. assertEquals(
  457. "preserve",
  458. c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().item(0).getNodeValue()
  459. );
  460. // Save and check
  461. XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
  462. wb2.close();
  463. s = wb3.getSheetAt(0);
  464. r = s.getRow(0);
  465. c = r.getCell(0);
  466. assertEquals("hello world", c.getRichStringCellValue().toString());
  467. wb3.close();
  468. }
  469. /**
  470. * Repeatedly writing the same file which has styles
  471. */
  472. @Test
  473. public void bug49940() throws IOException {
  474. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("styles.xlsx");
  475. assertEquals(3, wb.getNumberOfSheets());
  476. assertEquals(10, wb.getStylesSource().getNumCellStyles());
  477. ByteArrayOutputStream b1 = new ByteArrayOutputStream();
  478. ByteArrayOutputStream b2 = new ByteArrayOutputStream();
  479. ByteArrayOutputStream b3 = new ByteArrayOutputStream();
  480. wb.write(b1);
  481. wb.write(b2);
  482. wb.write(b3);
  483. for (byte[] data : new byte[][]{
  484. b1.toByteArray(), b2.toByteArray(), b3.toByteArray()
  485. }) {
  486. ByteArrayInputStream bais = new ByteArrayInputStream(data);
  487. XSSFWorkbook wb2 = new XSSFWorkbook(bais);
  488. assertEquals(3, wb2.getNumberOfSheets());
  489. assertEquals(10, wb2.getStylesSource().getNumCellStyles());
  490. wb2.close();
  491. }
  492. wb.close();
  493. }
  494. /**
  495. * Various ways of removing a cell formula should all zap the calcChain
  496. * entry.
  497. */
  498. @Test
  499. public void bug49966() throws IOException {
  500. XSSFWorkbook wb1 = XSSFTestDataSamples
  501. .openSampleWorkbook("shared_formulas.xlsx");
  502. XSSFSheet sheet = wb1.getSheetAt(0);
  503. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  504. // CalcChain has lots of entries
  505. CalculationChain cc = wb1.getCalculationChain();
  506. assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
  507. assertEquals("A3", cc.getCTCalcChain().getCArray(1).getR());
  508. assertEquals("A4", cc.getCTCalcChain().getCArray(2).getR());
  509. assertEquals("A5", cc.getCTCalcChain().getCArray(3).getR());
  510. assertEquals("A6", cc.getCTCalcChain().getCArray(4).getR());
  511. assertEquals("A7", cc.getCTCalcChain().getCArray(5).getR());
  512. assertEquals("A8", cc.getCTCalcChain().getCArray(6).getR());
  513. assertEquals(40, cc.getCTCalcChain().sizeOfCArray());
  514. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  515. // Try various ways of changing the formulas
  516. // If it stays a formula, chain entry should remain
  517. // Otherwise should go
  518. sheet.getRow(1).getCell(0).setCellFormula("A1"); // stay
  519. sheet.getRow(2).getCell(0).setCellFormula(null); // go
  520. sheet.getRow(3).getCell(0).setCellType(CellType.FORMULA); // stay
  521. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  522. sheet.getRow(4).getCell(0).setCellType(CellType.STRING); // go
  523. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  524. validateCells(sheet);
  525. sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
  526. validateCells(sheet);
  527. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  528. sheet.getRow(6).getCell(0).setCellType(CellType.BLANK); // go
  529. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  530. sheet.getRow(7).getCell(0).setCellValue((String) null); // go
  531. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  532. // Save and check
  533. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  534. wb1.close();
  535. assertEquals(35, cc.getCTCalcChain().sizeOfCArray());
  536. cc = wb2.getCalculationChain();
  537. assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
  538. assertEquals("A4", cc.getCTCalcChain().getCArray(1).getR());
  539. assertEquals("A9", cc.getCTCalcChain().getCArray(2).getR());
  540. wb2.close();
  541. }
  542. @Test
  543. public void bug49966Row() throws IOException {
  544. XSSFWorkbook wb = XSSFTestDataSamples
  545. .openSampleWorkbook("shared_formulas.xlsx");
  546. XSSFSheet sheet = wb.getSheetAt(0);
  547. validateCells(sheet);
  548. sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
  549. validateCells(sheet);
  550. wb.close();
  551. }
  552. private void validateCells(XSSFSheet sheet) {
  553. for (Row row : sheet) {
  554. // trigger handling
  555. ((XSSFRow) row).onDocumentWrite();
  556. }
  557. }
  558. @Test
  559. public void bug49156() throws IOException {
  560. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49156.xlsx");
  561. FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
  562. Sheet sheet = wb.getSheetAt(0);
  563. for (Row row : sheet) {
  564. for (Cell cell : row) {
  565. if (cell.getCellType() == CellType.FORMULA) {
  566. formulaEvaluator.evaluateInCell(cell); // caused NPE on some cells
  567. }
  568. }
  569. }
  570. wb.close();
  571. }
  572. /**
  573. * Newlines are valid characters in a formula
  574. */
  575. @Test
  576. public void bug50440And51875() throws IOException {
  577. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("NewlineInFormulas.xlsx");
  578. Sheet s = wb.getSheetAt(0);
  579. Cell c = s.getRow(0).getCell(0);
  580. assertEquals("SUM(\n1,2\n)", c.getCellFormula());
  581. assertEquals(3.0, c.getNumericCellValue(), 0);
  582. FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
  583. formulaEvaluator.evaluateFormulaCell(c);
  584. assertEquals("SUM(\n1,2\n)", c.getCellFormula());
  585. assertEquals(3.0, c.getNumericCellValue(), 0);
  586. // For 51875
  587. Cell b3 = s.getRow(2).getCell(1);
  588. formulaEvaluator.evaluateFormulaCell(b3);
  589. assertEquals("B1+B2", b3.getCellFormula()); // The newline is lost for shared formulas
  590. assertEquals(3.0, b3.getNumericCellValue(), 0);
  591. wb.close();
  592. }
  593. /**
  594. * Moving a cell comment from one cell to another
  595. */
  596. @Test
  597. public void bug50795() throws IOException {
  598. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("50795.xlsx");
  599. XSSFSheet sheet = wb1.getSheetAt(0);
  600. XSSFRow row = sheet.getRow(0);
  601. XSSFCell cellWith = row.getCell(0);
  602. XSSFCell cellWithoutComment = row.getCell(1);
  603. assertNotNull(cellWith.getCellComment());
  604. assertNull(cellWithoutComment.getCellComment());
  605. String exp = "\u0410\u0432\u0442\u043e\u0440:\ncomment";
  606. XSSFComment comment = cellWith.getCellComment();
  607. assertEquals(exp, comment.getString().getString());
  608. // Check we can write it out and read it back as-is
  609. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  610. wb1.close();
  611. sheet = wb2.getSheetAt(0);
  612. row = sheet.getRow(0);
  613. cellWith = row.getCell(0);
  614. cellWithoutComment = row.getCell(1);
  615. // Double check things are as expected
  616. assertNotNull(cellWith.getCellComment());
  617. assertNull(cellWithoutComment.getCellComment());
  618. comment = cellWith.getCellComment();
  619. assertEquals(exp, comment.getString().getString());
  620. // Move the comment
  621. cellWithoutComment.setCellComment(comment);
  622. // Write out and re-check
  623. XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
  624. wb2.close();
  625. sheet = wb3.getSheetAt(0);
  626. row = sheet.getRow(0);
  627. // Ensure it swapped over
  628. cellWith = row.getCell(0);
  629. cellWithoutComment = row.getCell(1);
  630. assertNull(cellWith.getCellComment());
  631. assertNotNull(cellWithoutComment.getCellComment());
  632. comment = cellWithoutComment.getCellComment();
  633. assertEquals(exp, comment.getString().getString());
  634. wb3.close();
  635. }
  636. /**
  637. * When the cell background colour is set with one of the first
  638. * two columns of the theme colour palette, the colours are
  639. * shades of white or black.
  640. * For those cases, ensure we don't break on reading the colour
  641. */
  642. @Test
  643. public void bug50299() throws IOException {
  644. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("50299.xlsx");
  645. // Check all the colours
  646. for (int sn = 0; sn < wb.getNumberOfSheets(); sn++) {
  647. Sheet s = wb.getSheetAt(sn);
  648. for (Row r : s) {
  649. for (Cell c : r) {
  650. CellStyle cs = c.getCellStyle();
  651. if (cs != null) {
  652. cs.getFillForegroundColor();
  653. }
  654. }
  655. }
  656. }
  657. // Check one bit in detail
  658. // Check that we get back foreground=0 for the theme colours,
  659. // and background=64 for the auto colouring
  660. Sheet s = wb.getSheetAt(0);
  661. assertEquals(0, s.getRow(0).getCell(8).getCellStyle().getFillForegroundColor());
  662. assertEquals(64, s.getRow(0).getCell(8).getCellStyle().getFillBackgroundColor());
  663. assertEquals(0, s.getRow(1).getCell(8).getCellStyle().getFillForegroundColor());
  664. assertEquals(64, s.getRow(1).getCell(8).getCellStyle().getFillBackgroundColor());
  665. wb.close();
  666. }
  667. /**
  668. * Excel .xls style indexed colours in a .xlsx file
  669. */
  670. @Test
  671. public void bug50786() throws IOException {
  672. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50786-indexed_colours.xlsx");
  673. XSSFSheet s = wb.getSheetAt(0);
  674. XSSFRow r = s.getRow(2);
  675. // Check we have the right cell
  676. XSSFCell c = r.getCell(1);
  677. assertEquals("test\u00a0", c.getRichStringCellValue().getString());
  678. // It should be light green
  679. XSSFCellStyle cs = c.getCellStyle();
  680. assertEquals(42, cs.getFillForegroundColor());
  681. assertEquals(42, cs.getFillForegroundColorColor().getIndexed());
  682. assertNotNull(cs.getFillForegroundColorColor().getRGB());
  683. assertEquals("FFCCFFCC", cs.getFillForegroundColorColor().getARGBHex());
  684. wb.close();
  685. }
  686. /**
  687. * If the border colours are set with themes, then we
  688. * should still be able to get colours
  689. */
  690. @Test
  691. public void bug50846() throws IOException {
  692. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50846-border_colours.xlsx");
  693. XSSFSheet sheet = wb.getSheetAt(0);
  694. XSSFRow row = sheet.getRow(0);
  695. // Border from a theme, brown
  696. XSSFCell cellT = row.getCell(0);
  697. XSSFCellStyle styleT = cellT.getCellStyle();
  698. XSSFColor colorT = styleT.getBottomBorderXSSFColor();
  699. assertEquals(5, colorT.getTheme());
  700. assertEquals("FFC0504D", colorT.getARGBHex());
  701. // Border from a style direct, red
  702. XSSFCell cellS = row.getCell(1);
  703. XSSFCellStyle styleS = cellS.getCellStyle();
  704. XSSFColor colorS = styleS.getBottomBorderXSSFColor();
  705. assertEquals(0, colorS.getTheme());
  706. assertEquals("FFFF0000", colorS.getARGBHex());
  707. wb.close();
  708. }
  709. /**
  710. * Fonts where their colours come from the theme rather
  711. * then being set explicitly still should allow the
  712. * fetching of the RGB.
  713. */
  714. @Test
  715. public void bug50784() throws IOException {
  716. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50784-font_theme_colours.xlsx");
  717. XSSFSheet s = wb.getSheetAt(0);
  718. XSSFRow r = s.getRow(0);
  719. // Column 1 has a font with regular colours
  720. XSSFCell cr = r.getCell(1);
  721. XSSFFont fr = wb.getFontAt(cr.getCellStyle().getFontIndex());
  722. XSSFColor colr = fr.getXSSFColor();
  723. // No theme, has colours
  724. assertEquals(0, colr.getTheme());
  725. assertNotNull(colr.getRGB());
  726. // Column 0 has a font with colours from a theme
  727. XSSFCell ct = r.getCell(0);
  728. XSSFFont ft = wb.getFontAt(ct.getCellStyle().getFontIndex());
  729. XSSFColor colt = ft.getXSSFColor();
  730. // Has a theme, which has the colours on it
  731. assertEquals(9, colt.getTheme());
  732. XSSFColor themeC = wb.getTheme().getThemeColor(colt.getTheme());
  733. assertNotNull(themeC.getRGB());
  734. assertNotNull(colt.getRGB());
  735. assertEquals(themeC.getARGBHex(), colt.getARGBHex()); // The same colour
  736. wb.close();
  737. }
  738. /**
  739. * New lines were being eaten when setting a font on
  740. * a rich text string
  741. */
  742. @Test
  743. public void bug48877() throws IOException {
  744. String text = "Use \n with word wrap on to create a new line.\n" +
  745. "This line finishes with two trailing spaces. ";
  746. XSSFWorkbook wb1 = new XSSFWorkbook();
  747. XSSFSheet sheet = wb1.createSheet();
  748. Font font1 = wb1.createFont();
  749. font1.setColor((short) 20);
  750. Font font2 = wb1.createFont();
  751. font2.setColor(Font.COLOR_RED);
  752. Font font3 = wb1.getFontAt((short) 0);
  753. XSSFRow row = sheet.createRow(2);
  754. XSSFCell cell = row.createCell(2);
  755. XSSFRichTextString richTextString =
  756. wb1.getCreationHelper().createRichTextString(text);
  757. // Check the text has the newline
  758. assertEquals(text, richTextString.getString());
  759. // Apply the font
  760. richTextString.applyFont(font3);
  761. richTextString.applyFont(0, 3, font1);
  762. cell.setCellValue(richTextString);
  763. // To enable newlines you need set a cell styles with wrap=true
  764. CellStyle cs = wb1.createCellStyle();
  765. cs.setWrapText(true);
  766. cell.setCellStyle(cs);
  767. // Check the text has the
  768. assertEquals(text, cell.getStringCellValue());
  769. // Save the file and re-read it
  770. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  771. wb1.close();
  772. sheet = wb2.getSheetAt(0);
  773. row = sheet.getRow(2);
  774. cell = row.getCell(2);
  775. assertEquals(text, cell.getStringCellValue());
  776. // Now add a 2nd, and check again
  777. int fontAt = text.indexOf("\n", 6);
  778. cell.getRichStringCellValue().applyFont(10, fontAt + 1, font2);
  779. assertEquals(text, cell.getStringCellValue());
  780. assertEquals(4, cell.getRichStringCellValue().numFormattingRuns());
  781. assertEquals("Use", cell.getRichStringCellValue().getCTRst().getRArray(0).getT());
  782. String r3 = cell.getRichStringCellValue().getCTRst().getRArray(2).getT();
  783. assertEquals("line.\n", r3.substring(r3.length() - 6));
  784. // Save and re-check
  785. XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
  786. wb2.close();
  787. sheet = wb3.getSheetAt(0);
  788. row = sheet.getRow(2);
  789. cell = row.getCell(2);
  790. assertEquals(text, cell.getStringCellValue());
  791. wb3.close();
  792. // FileOutputStream out = new FileOutputStream("/tmp/test48877.xlsx");
  793. // wb.write(out);
  794. // out.close();
  795. }
  796. /**
  797. * Adding sheets when one has a table, then re-ordering
  798. */
  799. @Test
  800. public void bug50867() throws IOException {
  801. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("50867_with_table.xlsx");
  802. assertEquals(3, wb1.getNumberOfSheets());
  803. XSSFSheet s1 = wb1.getSheetAt(0);
  804. XSSFSheet s2 = wb1.getSheetAt(1);
  805. XSSFSheet s3 = wb1.getSheetAt(2);
  806. assertEquals(1, s1.getTables().size());
  807. assertEquals(0, s2.getTables().size());
  808. assertEquals(0, s3.getTables().size());
  809. XSSFTable t = s1.getTables().get(0);
  810. assertEquals("Tabella1", t.getName());
  811. assertEquals("Tabella1", t.getDisplayName());
  812. assertEquals("A1:C3", t.getCTTable().getRef());
  813. // Add a sheet and re-order
  814. XSSFSheet s4 = wb1.createSheet("NewSheet");
  815. wb1.setSheetOrder(s4.getSheetName(), 0);
  816. // Check on tables
  817. assertEquals(1, s1.getTables().size());
  818. assertEquals(0, s2.getTables().size());
  819. assertEquals(0, s3.getTables().size());
  820. assertEquals(0, s4.getTables().size());
  821. // Refetch to get the new order
  822. s1 = wb1.getSheetAt(0);
  823. s2 = wb1.getSheetAt(1);
  824. s3 = wb1.getSheetAt(2);
  825. s4 = wb1.getSheetAt(3);
  826. assertEquals(0, s1.getTables().size());
  827. assertEquals(1, s2.getTables().size());
  828. assertEquals(0, s3.getTables().size());
  829. assertEquals(0, s4.getTables().size());
  830. // Save and re-load
  831. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  832. wb1.close();
  833. s1 = wb2.getSheetAt(0);
  834. s2 = wb2.getSheetAt(1);
  835. s3 = wb2.getSheetAt(2);
  836. s4 = wb2.getSheetAt(3);
  837. assertEquals(0, s1.getTables().size());
  838. assertEquals(1, s2.getTables().size());
  839. assertEquals(0, s3.getTables().size());
  840. assertEquals(0, s4.getTables().size());
  841. t = s2.getTables().get(0);
  842. assertEquals("Tabella1", t.getName());
  843. assertEquals("Tabella1", t.getDisplayName());
  844. assertEquals("A1:C3", t.getCTTable().getRef());
  845. // Add some more tables, and check
  846. t = s2.createTable();
  847. t.setName("New 2");
  848. t.setDisplayName("New 2");
  849. t = s3.createTable();
  850. t.setName("New 3");
  851. t.setDisplayName("New 3");
  852. XSSFWorkbook wb3 = XSSFTestDataSamples.writeOutAndReadBack(wb2);
  853. wb2.close();
  854. s1 = wb3.getSheetAt(0);
  855. s2 = wb3.getSheetAt(1);
  856. s3 = wb3.getSheetAt(2);
  857. s4 = wb3.getSheetAt(3);
  858. assertEquals(0, s1.getTables().size());
  859. assertEquals(2, s2.getTables().size());
  860. assertEquals(1, s3.getTables().size());
  861. assertEquals(0, s4.getTables().size());
  862. t = s2.getTables().get(0);
  863. assertEquals("Tabella1", t.getName());
  864. assertEquals("Tabella1", t.getDisplayName());
  865. assertEquals("A1:C3", t.getCTTable().getRef());
  866. t = s2.getTables().get(1);
  867. assertEquals("New 2", t.getName());
  868. assertEquals("New 2", t.getDisplayName());
  869. t = s3.getTables().get(0);
  870. assertEquals("New 3", t.getName());
  871. assertEquals("New 3", t.getDisplayName());
  872. // Check the relationships
  873. assertEquals(0, s1.getRelations().size());
  874. assertEquals(3, s2.getRelations().size());
  875. assertEquals(1, s3.getRelations().size());
  876. assertEquals(0, s4.getRelations().size());
  877. assertEquals(
  878. XSSFRelation.PRINTER_SETTINGS.getContentType(),
  879. s2.getRelations().get(0).getPackagePart().getContentType()
  880. );
  881. assertEquals(
  882. XSSFRelation.TABLE.getContentType(),
  883. s2.getRelations().get(1).getPackagePart().getContentType()
  884. );
  885. assertEquals(
  886. XSSFRelation.TABLE.getContentType(),
  887. s2.getRelations().get(2).getPackagePart().getContentType()
  888. );
  889. assertEquals(
  890. XSSFRelation.TABLE.getContentType(),
  891. s3.getRelations().get(0).getPackagePart().getContentType()
  892. );
  893. assertEquals(
  894. "/xl/tables/table3.xml",
  895. s3.getRelations().get(0).getPackagePart().getPartName().toString()
  896. );
  897. wb3.close();
  898. }
  899. /**
  900. * Setting repeating rows and columns shouldn't break
  901. * any print settings that were there before
  902. */
  903. @Test
  904. public void bug49253() throws IOException {
  905. XSSFWorkbook wb1 = new XSSFWorkbook();
  906. XSSFWorkbook wb2 = new XSSFWorkbook();
  907. CellRangeAddress cra = CellRangeAddress.valueOf("C2:D3");
  908. // No print settings before repeating
  909. XSSFSheet s1 = wb1.createSheet();
  910. assertEquals(false, s1.getCTWorksheet().isSetPageSetup());
  911. assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
  912. s1.setRepeatingColumns(cra);
  913. s1.setRepeatingRows(cra);
  914. assertEquals(true, s1.getCTWorksheet().isSetPageSetup());
  915. assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
  916. PrintSetup ps1 = s1.getPrintSetup();
  917. assertEquals(false, ps1.getValidSettings());
  918. assertEquals(false, ps1.getLandscape());
  919. // Had valid print settings before repeating
  920. XSSFSheet s2 = wb2.createSheet();
  921. PrintSetup ps2 = s2.getPrintSetup();
  922. assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
  923. assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
  924. ps2.setLandscape(false);
  925. assertEquals(true, ps2.getValidSettings());
  926. assertEquals(false, ps2.getLandscape());
  927. s2.setRepeatingColumns(cra);
  928. s2.setRepeatingRows(cra);
  929. ps2 = s2.getPrintSetup();
  930. assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
  931. assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
  932. assertEquals(true, ps2.getValidSettings());
  933. assertEquals(false, ps2.getLandscape());
  934. wb1.close();
  935. wb2.close();
  936. }
  937. /**
  938. * Default Column style
  939. */
  940. @Test
  941. public void bug51037() throws IOException {
  942. XSSFWorkbook wb = new XSSFWorkbook();
  943. XSSFSheet s = wb.createSheet();
  944. CellStyle defaultStyle = wb.getCellStyleAt((short) 0);
  945. assertEquals(0, defaultStyle.getIndex());
  946. CellStyle blueStyle = wb.createCellStyle();
  947. blueStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
  948. blueStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  949. assertEquals(1, blueStyle.getIndex());
  950. CellStyle pinkStyle = wb.createCellStyle();
  951. pinkStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());
  952. pinkStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  953. assertEquals(2, pinkStyle.getIndex());
  954. // Starts empty
  955. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  956. CTCols cols = s.getCTWorksheet().getColsArray(0);
  957. assertEquals(0, cols.sizeOfColArray());
  958. // Add some rows and columns
  959. XSSFRow r1 = s.createRow(0);
  960. XSSFRow r2 = s.createRow(1);
  961. r1.createCell(0);
  962. r1.createCell(2);
  963. r2.createCell(0);
  964. r2.createCell(3);
  965. // Check no style is there
  966. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  967. assertEquals(0, cols.sizeOfColArray());
  968. assertEquals(defaultStyle, s.getColumnStyle(0));
  969. assertEquals(defaultStyle, s.getColumnStyle(2));
  970. assertEquals(defaultStyle, s.getColumnStyle(3));
  971. // Apply the styles
  972. s.setDefaultColumnStyle(0, pinkStyle);
  973. s.setDefaultColumnStyle(3, blueStyle);
  974. // Check
  975. assertEquals(pinkStyle, s.getColumnStyle(0));
  976. assertEquals(defaultStyle, s.getColumnStyle(2));
  977. assertEquals(blueStyle, s.getColumnStyle(3));
  978. assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
  979. assertEquals(2, cols.sizeOfColArray());
  980. assertEquals(1, cols.getColArray(0).getMin());
  981. assertEquals(1, cols.getColArray(0).getMax());
  982. assertEquals(pinkStyle.getIndex(), cols.getColArray(0).getStyle());
  983. assertEquals(4, cols.getColArray(1).getMin());
  984. assertEquals(4, cols.getColArray(1).getMax());
  985. assertEquals(blueStyle.getIndex(), cols.getColArray(1).getStyle());
  986. // Save, re-load and re-check
  987. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  988. wb.close();
  989. s = wbBack.getSheetAt(0);
  990. defaultStyle = wbBack.getCellStyleAt(defaultStyle.getIndex());
  991. blueStyle = wbBack.getCellStyleAt(blueStyle.getIndex());
  992. pinkStyle = wbBack.getCellStyleAt(pinkStyle.getIndex());
  993. assertEquals(pinkStyle, s.getColumnStyle(0));
  994. assertEquals(defaultStyle, s.getColumnStyle(2));
  995. assertEquals(blueStyle, s.getColumnStyle(3));
  996. wbBack.close();
  997. }
  998. /**
  999. * Repeatedly writing a file.
  1000. * Something with the SharedStringsTable currently breaks...
  1001. */
  1002. @Test
  1003. public void bug46662() throws IOException {
  1004. // New file
  1005. XSSFWorkbook wb1 = new XSSFWorkbook();
  1006. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  1007. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  1008. XSSFTestDataSamples.writeOutAndReadBack(wb1).close();
  1009. wb1.close();
  1010. // Simple file
  1011. XSSFWorkbook wb2 = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
  1012. XSSFTestDataSamples.writeOutAndReadBack(wb2).close();
  1013. XSSFTestDataSamples.writeOutAndReadBack(wb2).close();
  1014. XSSFTestDataSamples.writeOutAndReadBack(wb2).close();
  1015. wb2.close();
  1016. // Complex file
  1017. // TODO
  1018. }
  1019. /**
  1020. * Colours and styles when the list has gaps in it
  1021. */
  1022. @Test
  1023. public void bug51222() throws IOException {
  1024. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51222.xlsx");
  1025. XSSFSheet s = wb.getSheetAt(0);
  1026. XSSFCell cA4_EEECE1 = s.getRow(3).getCell(0);
  1027. XSSFCell cA5_1F497D = s.getRow(4).getCell(0);
  1028. // Check the text
  1029. assertEquals("A4", cA4_EEECE1.getRichStringCellValue().getString());
  1030. assertEquals("A5", cA5_1F497D.getRichStringCellValue().getString());
  1031. // Check the styles assigned to them
  1032. assertEquals(4, cA4_EEECE1.getCTCell().getS());
  1033. assertEquals(5, cA5_1F497D.getCTCell().getS());
  1034. // Check we look up the correct style
  1035. assertEquals(4, cA4_EEECE1.getCellStyle().getIndex());
  1036. assertEquals(5, cA5_1F497D.getCellStyle().getIndex());
  1037. // Check the fills on them at the low level
  1038. assertEquals(5, cA4_EEECE1.getCellStyle().getCoreXf().getFillId());
  1039. assertEquals(6, cA5_1F497D.getCellStyle().getCoreXf().getFillId());
  1040. // These should reference themes 2 and 3
  1041. assertEquals(2, wb.getStylesSource().getFillAt(5).getCTFill().getPatternFill().getFgColor().getTheme());
  1042. assertEquals(3, wb.getStylesSource().getFillAt(6).getCTFill().getPatternFill().getFgColor().getTheme());
  1043. // Ensure we get the right colours for these themes
  1044. // TODO fix
  1045. // assertEquals("FFEEECE1", wb.getTheme().getThemeColor(2).getARGBHex());
  1046. // assertEquals("FF1F497D", wb.getTheme().getThemeColor(3).getARGBHex());
  1047. // Finally check the colours on the styles
  1048. // TODO fix
  1049. // assertEquals("FFEEECE1", cA4_EEECE1.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
  1050. // assertEquals("FF1F497D", cA5_1F497D.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
  1051. wb.close();
  1052. }
  1053. @Test
  1054. public void bug51470() throws IOException {
  1055. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
  1056. XSSFSheet sh0 = wb.getSheetAt(0);
  1057. XSSFSheet sh1 = wb.cloneSheet(0);
  1058. List<RelationPart> rels0 = sh0.getRelationParts();
  1059. List<RelationPart> rels1 = sh1.getRelationParts();
  1060. assertEquals(1, rels0.size());
  1061. assertEquals(1, rels1.size());
  1062. PackageRelationship pr0 = rels0.get(0).getRelationship();
  1063. PackageRelationship pr1 = rels1.get(0).getRelationship();
  1064. assertEquals(pr0.getTargetMode(), pr1.getTargetMode());
  1065. assertEquals(pr0.getTargetURI(), pr1.getTargetURI());
  1066. POIXMLDocumentPart doc0 = rels0.get(0).getDocumentPart();
  1067. POIXMLDocumentPart doc1 = rels1.get(0).getDocumentPart();
  1068. assertEquals(doc0, doc1);
  1069. wb.close();
  1070. }
  1071. /**
  1072. * Add comments to Sheet 1, when Sheet 2 already has
  1073. * comments (so /xl/comments1.xml is taken)
  1074. */
  1075. @Test
  1076. public void bug51850() throws IOException {
  1077. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("51850.xlsx");
  1078. XSSFSheet sh1 = wb1.getSheetAt(0);
  1079. XSSFSheet sh2 = wb1.getSheetAt(1);
  1080. // Sheet 2 has comments
  1081. assertNotNull(sh2.getCommentsTable(false));
  1082. assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
  1083. // Sheet 1 doesn't (yet)
  1084. assertNull(sh1.getCommentsTable(false));
  1085. // Try to add comments to Sheet 1
  1086. CreationHelper factory = wb1.getCreationHelper();
  1087. Drawing<?> drawing = sh1.createDrawingPatriarch();
  1088. ClientAnchor anchor = factory.createClientAnchor();
  1089. anchor.setCol1(0);
  1090. anchor.setCol2(4);
  1091. anchor.setRow1(0);
  1092. anchor.setRow2(1);
  1093. Comment comment1 = drawing.createCellComment(anchor);
  1094. comment1.setString(
  1095. factory.createRichTextString("I like this cell. It's my favourite."));
  1096. comment1.setAuthor("Bob T. Fish");
  1097. anchor = factory.createClientAnchor();
  1098. anchor.setCol1(0);
  1099. anchor.setCol2(4);
  1100. anchor.setRow1(1);
  1101. anchor.setRow2(1);
  1102. Comment comment2 = drawing.createCellComment(anchor);
  1103. comment2.setString(
  1104. factory.createRichTextString("This is much less fun..."));
  1105. comment2.setAuthor("Bob T. Fish");
  1106. Cell c1 = sh1.getRow(0).createCell(4);
  1107. c1.setCellValue(2.3);
  1108. c1.setCellComment(comment1);
  1109. Cell c2 = sh1.getRow(0).createCell(5);
  1110. c2.setCellValue(2.1);
  1111. c2.setCellComment(comment2);
  1112. // Save and re-load
  1113. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  1114. wb1.close();
  1115. sh1 = wb2.getSheetAt(0);
  1116. sh2 = wb2.getSheetAt(1);
  1117. // Check the comments
  1118. assertNotNull(sh2.getCommentsTable(false));
  1119. assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
  1120. assertNotNull(sh1.getCommentsTable(false));
  1121. assertEquals(2, sh1.getCommentsTable(false).getNumberOfComments());
  1122. wb2.close();
  1123. }
  1124. /**
  1125. * Sheet names with a , in them
  1126. */
  1127. @Test
  1128. public void bug51963() throws IOException {
  1129. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51963.xlsx");
  1130. Sheet sheet = wb.getSheetAt(0);
  1131. assertEquals("Abc,1", sheet.getSheetName());
  1132. Name name = wb.getName("Intekon.ProdCodes");
  1133. assertEquals("'Abc,1'!$A$1:$A$2", name.getRefersToFormula());
  1134. AreaReference ref = wb.getCreationHelper().createAreaReference(name.getRefersToFormula());
  1135. assertEquals(0, ref.getFirstCell().getRow());
  1136. assertEquals(0, ref.getFirstCell().getCol());
  1137. assertEquals(1, ref.getLastCell().getRow());
  1138. assertEquals(0, ref.getLastCell().getCol());
  1139. wb.close();
  1140. }
  1141. /**
  1142. * Sum across multiple workbooks
  1143. * eg =SUM($Sheet1.C1:$Sheet4.C1)
  1144. */
  1145. @Test
  1146. public void bug48703() throws IOException {
  1147. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48703.xlsx");
  1148. XSSFSheet sheet = wb.getSheetAt(0);
  1149. // Contains two forms, one with a range and one a list
  1150. XSSFRow r1 = sheet.getRow(0);
  1151. XSSFRow r2 = sheet.getRow(1);
  1152. XSSFCell c1 = r1.getCell(1);
  1153. XSSFCell c2 = r2.getCell(1);
  1154. assertEquals(20.0, c1.getNumericCellValue(), 0);
  1155. assertEquals("SUM(Sheet1!C1,Sheet2!C1,Sheet3!C1,Sheet4!C1)", c1.getCellFormula());
  1156. assertEquals(20.0, c2.getNumericCellValue(), 0);
  1157. assertEquals("SUM(Sheet1:Sheet4!C1)", c2.getCellFormula());
  1158. // Try evaluating both
  1159. XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
  1160. eval.evaluateFormulaCell(c1);
  1161. eval.evaluateFormulaCell(c2);
  1162. assertEquals(20.0, c1.getNumericCellValue(), 0);
  1163. assertEquals(20.0, c2.getNumericCellValue(), 0);
  1164. wb.close();
  1165. }
  1166. /**
  1167. * Bugzilla 51710: problems reading shared formuals from .xlsx
  1168. */
  1169. @Test
  1170. public void bug51710() throws IOException {
  1171. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("51710.xlsx");
  1172. final String[] columns = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"};
  1173. final int rowMax = 500; // bug triggers on row index 59
  1174. Sheet sheet = wb.getSheetAt(0);
  1175. // go through all formula cells
  1176. for (int rInd = 2; rInd <= rowMax; rInd++) {
  1177. Row row = sheet.getRow(rInd);
  1178. for (int cInd = 1; cInd <= 12; cInd++) {
  1179. Cell cell = row.getCell(cInd);
  1180. String formula = cell.getCellFormula();
  1181. CellReference ref = new CellReference(cell);
  1182. //simulate correct answer
  1183. String correct = "$A" + (rInd + 1) + "*" + columns[cInd] + "$2";
  1184. assertEquals("Incorrect formula in " + ref.formatAsString(), correct, formula);
  1185. }
  1186. }
  1187. wb.close();
  1188. }
  1189. /**
  1190. * Bug 53101:
  1191. */
  1192. @Test
  1193. public void bug5301() throws IOException {
  1194. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53101.xlsx");
  1195. FormulaEvaluator evaluator =
  1196. wb.getCreationHelper().createFormulaEvaluator();
  1197. // A1: SUM(B1: IZ1)
  1198. double a1Value =
  1199. evaluator.evaluate(wb.getSheetAt(0).getRow(0).getCell(0)).getNumberValue();
  1200. // Assert
  1201. assertEquals(259.0, a1Value, 0.0);
  1202. // KY: SUM(B1: IZ1)
  1203. /*double ky1Value =*/
  1204. assertEquals(259.0, evaluator.evaluate(wb.getSheetAt(0).getRow(0).getCell(310)).getNumberValue(), 0.0001);
  1205. // Assert
  1206. assertEquals(259.0, a1Value, 0.0);
  1207. wb.close();
  1208. }
  1209. @Test
  1210. public void bug54436() throws IOException {
  1211. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54436.xlsx");
  1212. if (!WorkbookEvaluator.getSupportedFunctionNames().contains("GETPIVOTDATA")) {
  1213. Function func = (args, srcRowIndex, srcColumnIndex) -> ErrorEval.NA;
  1214. WorkbookEvaluator.registerFunction("GETPIVOTDATA", func);
  1215. }
  1216. wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
  1217. wb.close();
  1218. }
  1219. /**
  1220. * Password Protected .xlsx files should give a helpful
  1221. * error message when called via WorkbookFactory with no password
  1222. */
  1223. @Test(expected = EncryptedDocumentException.class)
  1224. public void bug55692_poifs() throws IOException {
  1225. // Via a POIFSFileSystem
  1226. try (POIFSFileSystem fsP = new POIFSFileSystem(
  1227. POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"))) {
  1228. WorkbookFactory.create(fsP);
  1229. }
  1230. }
  1231. @Test
  1232. public void bug55692_stream() throws IOException, InvalidFormatException {
  1233. // Directly on a Stream, will go via NPOIFS and spot it's
  1234. // actually a .xlsx file encrypted with the default password, and open
  1235. Workbook wb = WorkbookFactory.create(
  1236. POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
  1237. assertNotNull(wb);
  1238. assertEquals(3, wb.getNumberOfSheets());
  1239. wb.close();
  1240. }
  1241. @Test
  1242. public void bug55692_npoifs() throws IOException {
  1243. // Via a NPOIFSFileSystem, will spot it's actually a .xlsx file
  1244. // encrypted with the default password, and open
  1245. NPOIFSFileSystem fsNP = new NPOIFSFileSystem(
  1246. POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
  1247. Workbook wb = WorkbookFactory.create(fsNP);
  1248. assertNotNull(wb);
  1249. assertEquals(3, wb.getNumberOfSheets());
  1250. wb.close();
  1251. fsNP.close();
  1252. }
  1253. @Test
  1254. public void bug53282() throws IOException {
  1255. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53282b.xlsx");
  1256. Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
  1257. assertEquals("#@_#", c.getStringCellValue());
  1258. assertEquals("http://invalid.uri", c.getHyperlink().getAddress());
  1259. wb.close();
  1260. }
  1261. /**
  1262. * Was giving NullPointerException
  1263. * at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead
  1264. * due to a lack of Styles Table
  1265. */
  1266. @Test
  1267. public void bug56278() throws IOException {
  1268. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56278.xlsx");
  1269. assertEquals(0, wb.getSheetIndex("Market Rates"));
  1270. // Save and re-check
  1271. Workbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1272. assertEquals(0, nwb.getSheetIndex("Market Rates"));
  1273. nwb.close();
  1274. wb.close();
  1275. }
  1276. @Test
  1277. public void bug56315() throws IOException {
  1278. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56315.xlsx");
  1279. Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
  1280. CellValue cv = wb.getCreationHelper().createFormulaEvaluator().evaluate(c);
  1281. double rounded = cv.getNumberValue();
  1282. assertEquals(0.1, rounded, 0.0);
  1283. wb.close();
  1284. }
  1285. @Test
  1286. public void bug56468() throws IOException, InterruptedException {
  1287. XSSFWorkbook wb = new XSSFWorkbook();
  1288. XSSFSheet sheet = wb.createSheet();
  1289. XSSFRow row = sheet.createRow(0);
  1290. XSSFCell cell = row.createCell(0);
  1291. cell.setCellValue("Hi");
  1292. sheet.setRepeatingRows(new CellRangeAddress(0, 0, 0, 0));
  1293. // small hack to try to make this test stable, previously it failed whenever the two written ZIP files had different file-creation
  1294. // dates stored.
  1295. // We try to do a loop until the current second changes in order to avoid problems with some date information that is written to the ZIP and thus
  1296. // causes differences
  1297. long start = System.currentTimeMillis() / 1000;
  1298. while (System.currentTimeMillis() / 1000 == start) {
  1299. Thread.sleep(10);
  1300. }
  1301. ByteArrayOutputStream bos = new ByteArrayOutputStream(8096);
  1302. wb.write(bos);
  1303. byte firstSave[] = bos.toByteArray();
  1304. bos.reset();
  1305. wb.write(bos);
  1306. byte secondSave[] = bos.toByteArray();
  1307. /*OutputStream stream = new FileOutputStream("C:\\temp\\poi.xlsx");
  1308. try {
  1309. wb.write(stream);
  1310. } finally {
  1311. stream.close();
  1312. }*/
  1313. assertArrayEquals("Had: \n" + Arrays.toString(firstSave) + " and \n" + Arrays.toString(secondSave),
  1314. firstSave, secondSave);
  1315. wb.close();
  1316. }
  1317. /**
  1318. * ISO-8601 style cell formats with a T in them, eg
  1319. * cell format of "yyyy-MM-ddTHH:mm:ss"
  1320. */
  1321. @Test
  1322. public void bug54034() throws IOException {
  1323. TimeZone tz = LocaleUtil.getUserTimeZone();
  1324. LocaleUtil.setUserTimeZone(TimeZone.getTimeZone("CET"));
  1325. try {
  1326. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54034.xlsx");
  1327. Sheet sheet = wb.getSheet("Sheet1");
  1328. Row row = sheet.getRow(1);
  1329. Cell cell = row.getCell(2);
  1330. assertTrue(DateUtil.isCellDateFormatted(cell));
  1331. DataFormatter fmt = new DataFormatter();
  1332. assertEquals("yyyy\\-mm\\-dd\\Thh:mm", cell.getCellStyle().getDataFormatString());
  1333. assertEquals("2012-08-08T22:59", fmt.formatCellValue(cell));
  1334. wb.close();
  1335. } finally {
  1336. LocaleUtil.setUserTimeZone(tz);
  1337. }
  1338. }
  1339. @Test
  1340. public void testBug53798XLSX() throws IOException {
  1341. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
  1342. File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
  1343. bug53798Work(wb, xlsOutput);
  1344. wb.close();
  1345. }
  1346. @Ignore("Shifting rows is not yet implemented in SXSSFSheet")
  1347. @Test
  1348. public void testBug53798XLSXStream() throws IOException {
  1349. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
  1350. File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
  1351. SXSSFWorkbook wb2 = new SXSSFWorkbook(wb);
  1352. bug53798Work(wb2, xlsOutput);
  1353. wb2.close();
  1354. wb.close();
  1355. }
  1356. @Test
  1357. public void testBug53798XLS() throws IOException {
  1358. Workbook wb = HSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xls");
  1359. File xlsOutput = TempFile.createTempFile("testBug53798", ".xls");
  1360. bug53798Work(wb, xlsOutput);
  1361. wb.close();
  1362. }
  1363. /**
  1364. * SUMIF was throwing a NPE on some formulas
  1365. */
  1366. @Test
  1367. public void testBug56420SumIfNPE() throws IOException {
  1368. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56420.xlsx");
  1369. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1370. Sheet sheet = wb.getSheetAt(0);
  1371. Row r = sheet.getRow(2);
  1372. Cell c = r.getCell(2);
  1373. assertEquals("SUMIF($A$1:$A$4,A3,$B$1:$B$4)", c.getCellFormula());
  1374. Cell eval = evaluator.evaluateInCell(c);
  1375. assertEquals(0.0, eval.getNumericCellValue(), 0.0001);
  1376. wb.close();
  1377. }
  1378. private void bug53798Work(Workbook wb, File xlsOutput) throws IOException {
  1379. Sheet testSheet = wb.getSheetAt(0);
  1380. testSheet.shiftRows(2, 2, 1);
  1381. saveAndReloadReport(wb, xlsOutput);
  1382. // 1) corrupted xlsx (unreadable data in the first row of a shifted group) already comes about
  1383. // when shifted by less than -1 negative amount (try -2)
  1384. testSheet.shiftRows(3, 3, -1);
  1385. saveAndReloadReport(wb, xlsOutput);
  1386. testSheet.shiftRows(2, 2, 1);
  1387. saveAndReloadReport(wb, xlsOutput);
  1388. // 2) attempt to create a new row IN PLACE of a removed row by a negative shift causes corrupted
  1389. // xlsx file with unreadable data in the negative shifted row.
  1390. // NOTE it's ok to create any other row.
  1391. Row newRow = testSheet.createRow(3);
  1392. saveAndReloadReport(wb, xlsOutput);
  1393. Cell newCell = newRow.createCell(0);
  1394. saveAndReloadReport(wb, xlsOutput);
  1395. newCell.setCellValue("new Cell in row " + newRow.getRowNum());
  1396. saveAndReloadReport(wb, xlsOutput);
  1397. // 3) once a negative shift has been made any attempt to shift another group of rows
  1398. // (note: outside of previously negative shifted rows) by a POSITIVE amount causes POI exception:
  1399. // org.apache.xmlbeans.impl.values.XmlValueDisconnectedException.
  1400. // NOTE: another negative shift on another group of rows is successful, provided no new rows in
  1401. // place of previously shifted rows were attempted to be created as explained above.
  1402. testSheet.shiftRows(6, 7, 1); // -- CHANGE the shift to positive once the behaviour of
  1403. // the above has been tested
  1404. saveAndReloadReport(wb, xlsOutput);
  1405. }
  1406. /**
  1407. * XSSFCell.typeMismatch on certain blank cells when formatting
  1408. * with DataFormatter
  1409. */
  1410. @Test
  1411. public void bug56702() throws IOException {
  1412. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56702.xlsx");
  1413. Sheet sheet = wb.getSheetAt(0);
  1414. // Get wrong cell by row 8 & column 7
  1415. Cell cell = sheet.getRow(8).getCell(7);
  1416. assertEquals(CellType.NUMERIC, cell.getCellType());
  1417. // Check the value - will be zero as it is <c><v/></c>
  1418. assertEquals(0.0, cell.getNumericCellValue(), 0.001);
  1419. // Try to format
  1420. DataFormatter formatter = new DataFormatter();
  1421. formatter.formatCellValue(cell);
  1422. // Check the formatting
  1423. assertEquals("0", formatter.formatCellValue(cell));
  1424. wb.close();
  1425. }
  1426. /**
  1427. * Formulas which reference named ranges, either in other
  1428. * sheets, or workbook scoped but in other workbooks.
  1429. * Used to fail with with errors like
  1430. * org.apache.poi.ss.formula.FormulaParseException: Cell reference expected after sheet name at index 9
  1431. * org.apache.poi.ss.formula.FormulaParseException: Parse error near char 0 '[' in specified formula '[0]!NR_Global_B2'. Expected number, string, or defined name
  1432. */
  1433. @Test
  1434. public void bug56737() throws IOException {
  1435. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx");
  1436. // Check the named range definitions
  1437. Name nSheetScope = wb.getName("NR_To_A1");
  1438. Name nWBScope = wb.getName("NR_Global_B2");
  1439. assertNotNull(nSheetScope);
  1440. assertNotNull(nWBScope);
  1441. assertEquals("Defines!$A$1", nSheetScope.getRefersToFormula());
  1442. assertEquals("Defines!$B$2", nWBScope.getRefersToFormula());
  1443. // Check the different kinds of formulas
  1444. Sheet s = wb.getSheetAt(0);
  1445. Cell cRefSName = s.getRow(1).getCell(3);
  1446. Cell cRefWName = s.getRow(2).getCell(3);
  1447. assertEquals("Defines!NR_To_A1", cRefSName.getCellFormula());
  1448. // Note the formula, as stored in the file, has the external name index not filename
  1449. // TODO Provide a way to get the one with the filename
  1450. assertEquals("[0]!NR_Global_B2", cRefWName.getCellFormula());
  1451. // Try to evaluate them
  1452. FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
  1453. assertEquals("Test A1", eval.evaluate(cRefSName).getStringValue());
  1454. assertEquals(142, (int) eval.evaluate(cRefWName).getNumberValue());
  1455. // Try to evaluate everything
  1456. eval.evaluateAll();
  1457. wb.close();
  1458. }
  1459. private void saveAndReloadReport(Workbook wb, File outFile) throws IOException {
  1460. // run some method on the font to verify if it is "disconnected" already
  1461. //for(short i = 0;i < 256;i++)
  1462. {
  1463. Font font = wb.getFontAt((short) 0);
  1464. if (font instanceof XSSFFont) {
  1465. XSSFFont xfont = (XSSFFont) wb.getFontAt((short) 0);
  1466. CTFontImpl ctFont = (CTFontImpl) xfont.getCTFont();
  1467. assertEquals(0, ctFont.sizeOfBArray());
  1468. }
  1469. }
  1470. try (FileOutputStream fileOutStream = new FileOutputStream(outFile)) {
  1471. wb.write(fileOutStream);
  1472. }
  1473. try (FileInputStream is = new FileInputStream(outFile)) {
  1474. Workbook newWB = null;
  1475. try {
  1476. if (wb instanceof XSSFWorkbook) {
  1477. newWB = new XSSFWorkbook(is);
  1478. } else if (wb instanceof HSSFWorkbook) {
  1479. newWB = new HSSFWorkbook(is);
  1480. } else if (wb instanceof SXSSFWorkbook) {
  1481. newWB = new SXSSFWorkbook(new XSSFWorkbook(is));
  1482. } else {
  1483. throw new IllegalStateException("Unknown workbook: " + wb);
  1484. }
  1485. assertNotNull(newWB.getSheet("test"));
  1486. } finally {
  1487. if (newWB != null) {
  1488. newWB.close();
  1489. }
  1490. }
  1491. }
  1492. }
  1493. @Test
  1494. public void testBug56688_1() throws IOException {
  1495. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_1.xlsx");
  1496. checkValue(excel, "-1.0"); /* Not 0.0 because POI sees date "0" minus one month as invalid date, which is -1! */
  1497. excel.close();
  1498. }
  1499. @Test
  1500. public void testBug56688_2() throws IOException {
  1501. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_2.xlsx");
  1502. checkValue(excel, "#VALUE!");
  1503. excel.close();
  1504. }
  1505. @Test
  1506. public void testBug56688_3() throws IOException {
  1507. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_3.xlsx");
  1508. checkValue(excel, "#VALUE!");
  1509. excel.close();
  1510. }
  1511. @Test
  1512. public void testBug56688_4() throws IOException {
  1513. XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_4.xlsx");
  1514. Calendar calendar = LocaleUtil.getLocaleCalendar();
  1515. calendar.add(Calendar.MONTH, 2);
  1516. double excelDate = DateUtil.getExcelDate(calendar.getTime());
  1517. NumberEval eval = new NumberEval(Math.floor(excelDate));
  1518. checkValue(excel, eval.getStringValue() + ".0");
  1519. excel.close();
  1520. }
  1521. /**
  1522. * New hyperlink with no initial cell reference, still need
  1523. * to be able to change it
  1524. */
  1525. @Test
  1526. public void testBug56527() throws IOException {
  1527. XSSFWorkbook wb = new XSSFWorkbook();
  1528. XSSFSheet sheet = wb.createSheet();
  1529. XSSFCreationHelper creationHelper = wb.getCreationHelper();
  1530. XSSFHyperlink hyperlink;
  1531. // Try with a cell reference
  1532. hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
  1533. sheet.addHyperlink(hyperlink);
  1534. hyperlink.setAddress("http://myurl");
  1535. hyperlink.setCellReference("B4");
  1536. assertEquals(3, hyperlink.getFirstRow());
  1537. assertEquals(1, hyperlink.getFirstColumn());
  1538. assertEquals(3, hyperlink.getLastRow());
  1539. assertEquals(1, hyperlink.getLastColumn());
  1540. // Try with explicit rows / columns
  1541. hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
  1542. sheet.addHyperlink(hyperlink);
  1543. hyperlink.setAddress("http://myurl");
  1544. hyperlink.setFirstRow(5);
  1545. hyperlink.setFirstColumn(3);
  1546. assertEquals(5, hyperlink.getFirstRow());
  1547. assertEquals(3, hyperlink.getFirstColumn());
  1548. assertEquals(5, hyperlink.getLastRow());
  1549. assertEquals(3, hyperlink.getLastColumn());
  1550. wb.close();
  1551. }
  1552. /**
  1553. * Shifting rows with a formula that references a
  1554. * function in another file
  1555. */
  1556. @Test
  1557. public void bug56502() throws IOException {
  1558. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56502.xlsx");
  1559. Sheet sheet = wb.getSheetAt(0);
  1560. Cell cFunc = sheet.getRow(3).getCell(0);
  1561. assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
  1562. Cell cRef = sheet.getRow(3).createCell(1);
  1563. cRef.setCellFormula("A3");
  1564. // Shift it down one row
  1565. sheet.shiftRows(1, sheet.getLastRowNum(), 1);
  1566. // Check the new formulas: Function won't change, Reference will
  1567. cFunc = sheet.getRow(4).getCell(0);
  1568. assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
  1569. cRef = sheet.getRow(4).getCell(1);
  1570. assertEquals("A4", cRef.getCellFormula());
  1571. wb.close();
  1572. }
  1573. @Test
  1574. public void bug54764() throws IOException, OpenXML4JException, XmlException {
  1575. OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("54764.xlsx");
  1576. // Check the core properties - will be found but empty, due
  1577. // to the expansion being too much to be considered valid
  1578. POIXMLProperties props = new POIXMLProperties(pkg);
  1579. assertEquals(null, props.getCoreProperties().getTitle());
  1580. assertEquals(null, props.getCoreProperties().getSubject());
  1581. assertEquals(null, props.getCoreProperties().getDescription());
  1582. // Now check the spreadsheet itself
  1583. try {
  1584. new XSSFWorkbook(pkg).close();
  1585. fail("Should fail as too much expansion occurs");
  1586. } catch (POIXMLException e) {
  1587. // Expected
  1588. }
  1589. pkg.close();
  1590. // Try with one with the entities in the Content Types
  1591. try {
  1592. XSSFTestDataSamples.openSamplePackage("54764-2.xlsx").close();
  1593. fail("Should fail as too much expansion occurs");
  1594. } catch (Exception e) {
  1595. // Expected
  1596. }
  1597. // Check we can still parse valid files after all that
  1598. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
  1599. assertEquals(3, wb.getNumberOfSheets());
  1600. wb.close();
  1601. }
  1602. /**
  1603. * CTDefinedNamesImpl should be included in the smaller
  1604. * poi-ooxml-schemas jar
  1605. */
  1606. @Test
  1607. public void bug57176() throws IOException {
  1608. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57176.xlsx");
  1609. CTDefinedNames definedNames = wb.getCTWorkbook().getDefinedNames();
  1610. List<CTDefinedName> definedNameList = definedNames.getDefinedNameList();
  1611. for (CTDefinedName defName : definedNameList) {
  1612. assertNotNull(defName.getName());
  1613. assertNotNull(defName.getStringValue());
  1614. }
  1615. assertEquals("TestDefinedName", definedNameList.get(0).getName());
  1616. wb.close();
  1617. }
  1618. /**
  1619. * .xlsb files are not supported, but we should generate a helpful
  1620. * error message if given one
  1621. */
  1622. @Test
  1623. public void bug56800_xlsb() throws IOException, InvalidFormatException {
  1624. // Can be opened at the OPC level
  1625. OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("Simple.xlsb");
  1626. // XSSF Workbook gives helpful error
  1627. try {
  1628. new XSSFWorkbook(pkg).close();
  1629. fail(".xlsb files not supported");
  1630. } catch (XLSBUnsupportedException e) {
  1631. // Good, detected and warned
  1632. }
  1633. // Workbook Factory gives helpful error on package
  1634. try {
  1635. WorkbookFactory.create(pkg).close();
  1636. fail(".xlsb files not supported");
  1637. } catch (XLSBUnsupportedException e) {
  1638. // Good, detected and warned
  1639. }
  1640. // Workbook Factory gives helpful error on file
  1641. File xlsbFile = HSSFTestDataSamples.getSampleFile("Simple.xlsb");
  1642. try {
  1643. WorkbookFactory.create(xlsbFile).close();
  1644. fail(".xlsb files not supported");
  1645. } catch (XLSBUnsupportedException e) {
  1646. // Good, detected and warned
  1647. }
  1648. pkg.close();
  1649. }
  1650. private void checkValue(XSSFWorkbook excel, String expect) {
  1651. XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);
  1652. evaluator.evaluateAll();
  1653. XSSFCell cell = excel.getSheetAt(0).getRow(1).getCell(1);
  1654. CellValue value = evaluator.evaluate(cell);
  1655. assertEquals(expect, value.formatAsString());
  1656. }
  1657. @Test
  1658. public void testBug57196() throws IOException {
  1659. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57196.xlsx");
  1660. Sheet sheet = wb.getSheet("Feuil1");
  1661. Row mod = sheet.getRow(1);
  1662. mod.getCell(1).setCellValue(3);
  1663. HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
  1664. // FileOutputStream fileOutput = new FileOutputStream("/tmp/57196.xlsx");
  1665. // wb.write(fileOutput);
  1666. // fileOutput.close();
  1667. wb.close();
  1668. }
  1669. @Test
  1670. public void test57196_Detail() throws IOException {
  1671. XSSFWorkbook wb = new XSSFWorkbook();
  1672. XSSFSheet sheet = wb.createSheet("Sheet1");
  1673. XSSFRow row = sheet.createRow(0);
  1674. XSSFCell cell = row.createCell(0);
  1675. cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
  1676. XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
  1677. CellValue cv = fe.evaluate(cell);
  1678. assertNotNull(cv);
  1679. wb.close();
  1680. }
  1681. @Test
  1682. public void test57196_Detail2() throws IOException {
  1683. XSSFWorkbook wb = new XSSFWorkbook();
  1684. XSSFSheet sheet = wb.createSheet("Sheet1");
  1685. XSSFRow row = sheet.createRow(0);
  1686. XSSFCell cell = row.createCell(0);
  1687. cell.setCellFormula("DEC2HEX(O2+D2)");
  1688. XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
  1689. CellValue cv = fe.evaluate(cell);
  1690. assertNotNull(cv);
  1691. wb.close();
  1692. }
  1693. @Test
  1694. public void test57196_WorkbookEvaluator() throws IOException {
  1695. String previousLogger = System.getProperty("org.apache.poi.util.POILogger");
  1696. //System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger");
  1697. //System.setProperty("poi.log.level", "3");
  1698. try {
  1699. XSSFWorkbook wb = new XSSFWorkbook();
  1700. XSSFSheet sheet = wb.createSheet("Sheet1");
  1701. XSSFRow row = sheet.createRow(0);
  1702. XSSFCell cell = row.createCell(0);
  1703. cell.setCellValue("0");
  1704. cell = row.createCell(1);
  1705. cell.setCellValue(0);
  1706. cell = row.createCell(2);
  1707. cell.setCellValue(0);
  1708. // simple formula worked
  1709. cell.setCellFormula("DEC2HEX(O2+D2)");
  1710. WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1711. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1712. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1713. // this already failed! Hex2Dec did not correctly handle RefEval
  1714. cell.setCellFormula("HEX2DEC(O8)");
  1715. workbookEvaluator.clearAllCachedResultValues();
  1716. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1717. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1718. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1719. // slightly more complex one failed
  1720. cell.setCellFormula("HEX2DEC(O8)-O2+D2");
  1721. workbookEvaluator.clearAllCachedResultValues();
  1722. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1723. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1724. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1725. // more complicated failed
  1726. cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
  1727. workbookEvaluator.clearAllCachedResultValues();
  1728. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1729. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1730. // what other similar functions
  1731. cell.setCellFormula("DEC2BIN(O8)-O2+D2");
  1732. workbookEvaluator.clearAllCachedResultValues();
  1733. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1734. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1735. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1736. // what other similar functions
  1737. cell.setCellFormula("DEC2BIN(A1)");
  1738. workbookEvaluator.clearAllCachedResultValues();
  1739. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1740. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1741. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1742. // what other similar functions
  1743. cell.setCellFormula("BIN2DEC(B1)");
  1744. workbookEvaluator.clearAllCachedResultValues();
  1745. workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
  1746. workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
  1747. workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
  1748. wb.close();
  1749. } finally {
  1750. if (previousLogger == null) {
  1751. System.clearProperty("org.apache.poi.util.POILogger");
  1752. } else {
  1753. System.setProperty("org.apache.poi.util.POILogger", previousLogger);
  1754. }
  1755. System.clearProperty("poi.log.level");
  1756. }
  1757. }
  1758. /**
  1759. * A .xlsx file with no Shared Strings table should open fine
  1760. * in read-only mode
  1761. */
  1762. @SuppressWarnings("resource")
  1763. @Test
  1764. public void bug57482() throws IOException, InvalidFormatException {
  1765. for (PackageAccess access : new PackageAccess[]{
  1766. PackageAccess.READ_WRITE, PackageAccess.READ
  1767. }) {
  1768. File file = HSSFTestDataSamples.getSampleFile("57482-OnlyNumeric.xlsx");
  1769. OPCPackage pkg = OPCPackage.open(file, access);
  1770. try {
  1771. // Try to open it and read the contents
  1772. XSSFWorkbook wb1 = new XSSFWorkbook(pkg);
  1773. assertNotNull(wb1.getSharedStringSource());
  1774. assertEquals(0, wb1.getSharedStringSource().getCount());
  1775. DataFormatter fmt = new DataFormatter();
  1776. XSSFSheet s = wb1.getSheetAt(0);
  1777. assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
  1778. assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
  1779. assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
  1780. // Add a text cell
  1781. s.getRow(0).createCell(3).setCellValue("Testing");
  1782. assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
  1783. // Try to write-out and read again, should only work
  1784. // in read-write mode, not read-only mode
  1785. XSSFWorkbook wb2 = null;
  1786. try {
  1787. wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  1788. if (access == PackageAccess.READ) {
  1789. fail("Shouln't be able to write from read-only mode");
  1790. }
  1791. // Check again
  1792. s = wb2.getSheetAt(0);
  1793. assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
  1794. assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
  1795. assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
  1796. assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
  1797. } catch (InvalidOperationException e) {
  1798. if (access == PackageAccess.READ_WRITE) {
  1799. // Shouldn't occur in write-mode
  1800. throw e;
  1801. }
  1802. } finally {
  1803. if (wb2 != null) {
  1804. wb2.getPackage().revert();
  1805. }
  1806. }
  1807. wb1.getPackage().revert();
  1808. } finally {
  1809. pkg.revert();
  1810. }
  1811. }
  1812. }
  1813. /**
  1814. * "Unknown error type: -60" fetching formula error value
  1815. */
  1816. @Test
  1817. public void bug57535() throws IOException {
  1818. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57535.xlsx");
  1819. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1820. evaluator.clearAllCachedResultValues();
  1821. Sheet sheet = wb.getSheet("Sheet1");
  1822. Cell cell = sheet.getRow(5).getCell(4);
  1823. assertEquals(CellType.FORMULA, cell.getCellType());
  1824. assertEquals("E4+E5", cell.getCellFormula());
  1825. CellValue value = evaluator.evaluate(cell);
  1826. assertEquals(CellType.ERROR, value.getCellType());
  1827. assertEquals(-60, value.getErrorValue());
  1828. assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
  1829. assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
  1830. wb.close();
  1831. }
  1832. @Test
  1833. public void test57165() throws IOException {
  1834. try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx")) {
  1835. removeAllSheetsBut(3, wb);
  1836. wb.cloneSheet(0); // Throws exception here
  1837. wb.setSheetName(1, "New Sheet");
  1838. //saveWorkbook(wb, fileName);
  1839. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1840. wbBack.close();
  1841. }
  1842. }
  1843. @Test
  1844. public void test57165_create() throws IOException {
  1845. try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx")) {
  1846. removeAllSheetsBut(3, wb);
  1847. wb.createSheet("newsheet"); // Throws exception here
  1848. wb.setSheetName(1, "New Sheet");
  1849. //saveWorkbook(wb, fileName);
  1850. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1851. wbBack.close();
  1852. }
  1853. }
  1854. private static void removeAllSheetsBut(@SuppressWarnings("SameParameterValue") int sheetIndex, Workbook wb) {
  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. wb.removeSheetAt(sn);
  1860. }
  1861. }
  1862. /**
  1863. * Sums 2 plus the cell at the left, indirectly to avoid reference
  1864. * problems when deleting columns, conditionally to stop recursion
  1865. */
  1866. private static final String FORMULA1 =
  1867. "IF( INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) = 0, 0,"
  1868. + "INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) ) + 2";
  1869. /**
  1870. * Sums 2 plus the upper cell, indirectly to avoid reference
  1871. * problems when deleting rows, conditionally to stop recursion
  1872. */
  1873. private static final String FORMULA2 =
  1874. "IF( INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) = 0, 0,"
  1875. + "INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) ) + 2";
  1876. /**
  1877. * Expected:
  1878. * <p>
  1879. * [ 0][ 2][ 4]
  1880. */
  1881. @Test
  1882. public void testBug56820_Formula1() throws IOException {
  1883. try (Workbook wb = new XSSFWorkbook()) {
  1884. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1885. Sheet sh = wb.createSheet();
  1886. sh.createRow(0).createCell(0).setCellValue(0.0d);
  1887. Cell formulaCell1 = sh.getRow(0).createCell(1);
  1888. Cell formulaCell2 = sh.getRow(0).createCell(2);
  1889. formulaCell1.setCellFormula(FORMULA1);
  1890. formulaCell2.setCellFormula(FORMULA1);
  1891. double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
  1892. double A2 = evaluator.evaluate(formulaCell2).getNumberValue();
  1893. assertEquals(2, A1, 0);
  1894. assertEquals(4, A2, 0); //<-- FAILS EXPECTATIONS
  1895. }
  1896. }
  1897. /**
  1898. * Expected:
  1899. * <p>
  1900. * [ 0] <- number
  1901. * [ 2] <- formula
  1902. * [ 4] <- formula
  1903. */
  1904. @Test
  1905. public void testBug56820_Formula2() throws IOException {
  1906. try (Workbook wb = new XSSFWorkbook()) {
  1907. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  1908. Sheet sh = wb.createSheet();
  1909. sh.createRow(0).createCell(0).setCellValue(0.0d);
  1910. Cell formulaCell1 = sh.createRow(1).createCell(0);
  1911. Cell formulaCell2 = sh.createRow(2).createCell(0);
  1912. formulaCell1.setCellFormula(FORMULA2);
  1913. formulaCell2.setCellFormula(FORMULA2);
  1914. double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
  1915. double A2 = evaluator.evaluate(formulaCell2).getNumberValue(); //<-- FAILS EVALUATION
  1916. assertEquals(2, A1, 0);
  1917. assertEquals(4, A2, 0);
  1918. }
  1919. }
  1920. @Test
  1921. public void test56467() throws IOException {
  1922. try (Workbook wb = XSSFTestDataSamples.openSampleWorkbook("picture.xlsx")) {
  1923. Sheet orig = wb.getSheetAt(0);
  1924. assertNotNull(orig);
  1925. Sheet sheet = wb.cloneSheet(0);
  1926. Drawing<?> drawing = sheet.createDrawingPatriarch();
  1927. for (XSSFShape shape : ((XSSFDrawing) drawing).getShapes()) {
  1928. if (shape instanceof XSSFPicture) {
  1929. XSSFPictureData pictureData = ((XSSFPicture) shape).getPictureData();
  1930. assertNotNull(pictureData);
  1931. }
  1932. }
  1933. }
  1934. }
  1935. /**
  1936. * OOXML-Strict files
  1937. * Not currently working - namespace mis-match from XMLBeans
  1938. */
  1939. @Test
  1940. @Ignore("XMLBeans namespace mis-match on ooxml-strict files")
  1941. public void test57699() throws IOException {
  1942. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.strict.xlsx");
  1943. assertEquals(3, wb.getNumberOfSheets());
  1944. // TODO Check sheet contents
  1945. // TODO Check formula evaluation
  1946. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  1947. assertEquals(3, wbBack.getNumberOfSheets());
  1948. // TODO Re-check sheet contents
  1949. // TODO Re-check formula evaluation
  1950. wb.close();
  1951. wbBack.close();
  1952. }
  1953. @Test
  1954. public void testBug56295_MergeXlslsWithStyles() throws IOException {
  1955. XSSFWorkbook xlsToAppendWorkbook = XSSFTestDataSamples.openSampleWorkbook("56295.xlsx");
  1956. XSSFSheet sheet = xlsToAppendWorkbook.getSheetAt(0);
  1957. XSSFRow srcRow = sheet.getRow(0);
  1958. XSSFCell oldCell = srcRow.getCell(0);
  1959. XSSFCellStyle cellStyle = oldCell.getCellStyle();
  1960. checkStyle(cellStyle);
  1961. // StylesTable table = xlsToAppendWorkbook.getStylesSource();
  1962. // List<XSSFCellFill> fills = table.getFills();
  1963. // System.out.println("Having " + fills.size() + " fills");
  1964. // for(XSSFCellFill fill : fills) {
  1965. // System.out.println("Fill: " + fill.getFillBackgroundColor() + "/" + fill.getFillForegroundColor());
  1966. // }
  1967. xlsToAppendWorkbook.close();
  1968. XSSFWorkbook targetWorkbook = new XSSFWorkbook();
  1969. XSSFSheet newSheet = targetWorkbook.createSheet(sheet.getSheetName());
  1970. XSSFRow destRow = newSheet.createRow(0);
  1971. XSSFCell newCell = destRow.createCell(0);
  1972. //newCell.getCellStyle().cloneStyleFrom(cellStyle);
  1973. CellStyle newCellStyle = targetWorkbook.createCellStyle();
  1974. newCellStyle.cloneStyleFrom(cellStyle);
  1975. newCell.setCellStyle(newCellStyle);
  1976. checkStyle(newCell.getCellStyle());
  1977. newCell.setCellValue(oldCell.getStringCellValue());
  1978. // OutputStream os = new FileOutputStream("output.xlsm");
  1979. // try {
  1980. // targetWorkbook.write(os);
  1981. // } finally {
  1982. // os.close();
  1983. // }
  1984. XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(targetWorkbook);
  1985. XSSFCellStyle styleBack = wbBack.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
  1986. checkStyle(styleBack);
  1987. targetWorkbook.close();
  1988. wbBack.close();
  1989. }
  1990. /**
  1991. * Paragraph with property BuFont but none of the properties
  1992. * BuNone, BuChar, and BuAutoNum, used to trigger a NPE
  1993. * Excel treats this as not-bulleted, so now do we
  1994. */
  1995. @Test
  1996. public void testBug57826() throws IOException {
  1997. XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57826.xlsx");
  1998. assertTrue("no sheets in workbook", workbook.getNumberOfSheets() >= 1);
  1999. XSSFSheet sheet = workbook.getSheetAt(0);
  2000. XSSFDrawing drawing = sheet.getDrawingPatriarch();
  2001. assertNotNull(drawing);
  2002. List<XSSFShape> shapes = drawing.getShapes();
  2003. assertEquals(1, shapes.size());
  2004. assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
  2005. XSSFSimpleShape shape = (XSSFSimpleShape) shapes.get(0);
  2006. // Used to throw a NPE
  2007. String text = shape.getText();
  2008. // No bulleting info included
  2009. assertEquals("test ok", text);
  2010. workbook.close();
  2011. }
  2012. private void checkStyle(XSSFCellStyle cellStyle) {
  2013. assertNotNull(cellStyle);
  2014. assertEquals(0, cellStyle.getFillForegroundColor());
  2015. assertNotNull(cellStyle.getFillForegroundXSSFColor());
  2016. XSSFColor fgColor = cellStyle.getFillForegroundColorColor();
  2017. assertNotNull(fgColor);
  2018. assertEquals("FF00FFFF", fgColor.getARGBHex());
  2019. assertEquals(0, cellStyle.getFillBackgroundColor());
  2020. assertNotNull(cellStyle.getFillBackgroundXSSFColor());
  2021. XSSFColor bgColor = cellStyle.getFillBackgroundColorColor();
  2022. assertNotNull(bgColor);
  2023. assertEquals("FF00FFFF", fgColor.getARGBHex());
  2024. }
  2025. @Test
  2026. public void bug57642() throws IOException {
  2027. XSSFWorkbook wb = new XSSFWorkbook();
  2028. XSSFSheet s = wb.createSheet("TestSheet");
  2029. XSSFCell c = s.createRow(0).createCell(0);
  2030. c.setCellFormula("ISERROR(TestSheet!A1)");
  2031. c = s.createRow(1).createCell(1);
  2032. c.setCellFormula("ISERROR(B2)");
  2033. wb.setSheetName(0, "CSN");
  2034. c = s.getRow(0).getCell(0);
  2035. assertEquals("ISERROR(CSN!A1)", c.getCellFormula());
  2036. c = s.getRow(1).getCell(1);
  2037. assertEquals("ISERROR(B2)", c.getCellFormula());
  2038. wb.close();
  2039. }
  2040. /**
  2041. * .xlsx supports 64000 cell styles, the style indexes after
  2042. * 32,767 must not be -32,768, then -32,767, -32,766
  2043. */
  2044. @Test
  2045. public void bug57880() throws IOException {
  2046. int numStyles = 33000;
  2047. XSSFWorkbook wb = new XSSFWorkbook();
  2048. for (int i = 1; i < numStyles; i++) {
  2049. // Create a style and use it
  2050. XSSFCellStyle style = wb.createCellStyle();
  2051. assertEquals(i, style.getUIndex());
  2052. }
  2053. assertEquals(numStyles, wb.getNumCellStyles());
  2054. // avoid OOM in Gump run
  2055. File file = XSSFTestDataSamples.writeOutAndClose(wb, "bug57880");
  2056. //noinspection UnusedAssignment
  2057. wb = null;
  2058. // Garbage collection may happen here
  2059. // avoid zip bomb detection
  2060. double ratio = ZipSecureFile.getMinInflateRatio();
  2061. ZipSecureFile.setMinInflateRatio(0.00005);
  2062. wb = XSSFTestDataSamples.readBackAndDelete(file);
  2063. ZipSecureFile.setMinInflateRatio(ratio);
  2064. //Assume identical cell styles aren't consolidated
  2065. //If XSSFWorkbooks ever implicitly optimize/consolidate cell styles (such as when the workbook is written to disk)
  2066. //then this unit test should be updated
  2067. assertEquals(numStyles, wb.getNumCellStyles());
  2068. for (int i = 1; i < numStyles; i++) {
  2069. XSSFCellStyle style = wb.getCellStyleAt(i);
  2070. assertNotNull(style);
  2071. assertEquals(i, style.getUIndex());
  2072. }
  2073. wb.close();
  2074. }
  2075. @Test
  2076. public void test56574() throws IOException {
  2077. runTest56574(false);
  2078. runTest56574(true);
  2079. }
  2080. private void runTest56574(boolean createRow) throws IOException {
  2081. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56574.xlsx");
  2082. Sheet sheet = wb.getSheet("Func");
  2083. assertNotNull(sheet);
  2084. Map<String, Object[]> data;
  2085. data = new TreeMap<>();
  2086. data.put("1", new Object[]{"ID", "NAME", "LASTNAME"});
  2087. data.put("2", new Object[]{2, "Amit", "Shukla"});
  2088. data.put("3", new Object[]{1, "Lokesh", "Gupta"});
  2089. data.put("4", new Object[]{4, "John", "Adwards"});
  2090. data.put("5", new Object[]{2, "Brian", "Schultz"});
  2091. int rownum = 1;
  2092. for (Map.Entry<String, Object[]> me : data.entrySet()) {
  2093. final Row row;
  2094. if (createRow) {
  2095. row = sheet.createRow(rownum++);
  2096. } else {
  2097. row = sheet.getRow(rownum++);
  2098. }
  2099. assertNotNull(row);
  2100. int cellnum = 0;
  2101. for (Object obj : me.getValue()) {
  2102. Cell cell = row.getCell(cellnum);
  2103. if (cell == null) {
  2104. cell = row.createCell(cellnum);
  2105. } else {
  2106. if (cell.getCellType() == CellType.FORMULA) {
  2107. cell.setCellFormula(null);
  2108. cell.getCellStyle().setDataFormat((short) 0);
  2109. }
  2110. }
  2111. if (obj instanceof String) {
  2112. cell.setCellValue((String) obj);
  2113. } else if (obj instanceof Integer) {
  2114. cell.setCellValue((Integer) obj);
  2115. }
  2116. cellnum++;
  2117. }
  2118. }
  2119. XSSFFormulaEvaluator.evaluateAllFormulaCells((XSSFWorkbook) wb);
  2120. wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
  2121. CalculationChain chain = ((XSSFWorkbook) wb).getCalculationChain();
  2122. checkCellsAreGone(chain);
  2123. Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  2124. Sheet sheetBack = wbBack.getSheet("Func");
  2125. assertNotNull(sheetBack);
  2126. chain = ((XSSFWorkbook) wbBack).getCalculationChain();
  2127. checkCellsAreGone(chain);
  2128. wbBack.close();
  2129. wb.close();
  2130. }
  2131. private void checkCellsAreGone(CalculationChain chain) {
  2132. for (CTCalcCell calc : chain.getCTCalcChain().getCList()) {
  2133. // A2 to A6 should be gone
  2134. assertFalse(calc.getR().equals("A2"));
  2135. assertFalse(calc.getR().equals("A3"));
  2136. assertFalse(calc.getR().equals("A4"));
  2137. assertFalse(calc.getR().equals("A5"));
  2138. assertFalse(calc.getR().equals("A6"));
  2139. }
  2140. }
  2141. /**
  2142. * Excel 2007 generated Macro-Enabled .xlsm file
  2143. */
  2144. @Test
  2145. public void bug57181() throws IOException {
  2146. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57181.xlsm");
  2147. assertEquals(9, wb.getNumberOfSheets());
  2148. wb.close();
  2149. }
  2150. @Test
  2151. public void bug52111() throws IOException {
  2152. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("Intersection-52111-xssf.xlsx");
  2153. Sheet s = wb.getSheetAt(0);
  2154. assertFormula(wb, s.getRow(2).getCell(0), "(C2:D3 D3:E4)", "4.0");
  2155. assertFormula(wb, s.getRow(6).getCell(0), "Tabelle2!E:E Tabelle2!11:11", "5.0");
  2156. assertFormula(wb, s.getRow(8).getCell(0), "Tabelle2!E:F Tabelle2!11:12", null);
  2157. wb.close();
  2158. }
  2159. @Test
  2160. public void test48962() throws IOException {
  2161. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("48962.xlsx");
  2162. Sheet sh = wb.getSheetAt(0);
  2163. Row row = sh.getRow(1);
  2164. Cell cell = row.getCell(0);
  2165. CellStyle style = cell.getCellStyle();
  2166. assertNotNull(style);
  2167. // color index
  2168. assertEquals(64, style.getFillBackgroundColor());
  2169. XSSFColor color = ((XSSFCellStyle) style).getFillBackgroundXSSFColor();
  2170. assertNotNull(color);
  2171. // indexed color
  2172. assertEquals(64, color.getIndexed());
  2173. assertEquals(64, color.getIndex());
  2174. // not an RGB color
  2175. assertFalse(color.isRGB());
  2176. assertNull(color.getRGB());
  2177. wb.close();
  2178. }
  2179. @Test
  2180. public void test50755_workday_formula_example() throws IOException {
  2181. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("50755_workday_formula_example.xlsx");
  2182. Sheet sheet = wb.getSheet("Sheet1");
  2183. for (Row aRow : sheet) {
  2184. Cell cell = aRow.getCell(1);
  2185. if (cell.getCellType() == CellType.FORMULA) {
  2186. String formula = cell.getCellFormula();
  2187. assertNotNull(formula);
  2188. assertTrue(formula.contains("WORKDAY"));
  2189. } else {
  2190. assertNotNull(cell.toString());
  2191. }
  2192. }
  2193. wb.close();
  2194. }
  2195. @Test
  2196. public void test51626() throws IOException, InvalidFormatException {
  2197. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("51626.xlsx");
  2198. assertNotNull(wb);
  2199. wb.close();
  2200. InputStream stream = HSSFTestDataSamples.openSampleFileStream("51626.xlsx");
  2201. wb = WorkbookFactory.create(stream);
  2202. stream.close();
  2203. wb.close();
  2204. wb = XSSFTestDataSamples.openSampleWorkbook("51626_contact.xlsx");
  2205. assertNotNull(wb);
  2206. wb.close();
  2207. stream = HSSFTestDataSamples.openSampleFileStream("51626_contact.xlsx");
  2208. wb = WorkbookFactory.create(stream);
  2209. stream.close();
  2210. wb.close();
  2211. }
  2212. @Test
  2213. public void test51451() throws IOException {
  2214. Workbook wb = new XSSFWorkbook();
  2215. Sheet sh = wb.createSheet();
  2216. Row row = sh.createRow(0);
  2217. Cell cell = row.createCell(0);
  2218. cell.setCellValue(239827342);
  2219. CellStyle style = wb.createCellStyle();
  2220. //style.setHidden(false);
  2221. DataFormat excelFormat = wb.createDataFormat();
  2222. style.setDataFormat(excelFormat.getFormat("#,##0"));
  2223. sh.setDefaultColumnStyle(0, style);
  2224. // FileOutputStream out = new FileOutputStream("/tmp/51451.xlsx");
  2225. // wb.write(out);
  2226. // out.close();
  2227. wb.close();
  2228. }
  2229. @Test
  2230. public void test53105() throws IOException {
  2231. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53105.xlsx");
  2232. assertNotNull(wb);
  2233. // Act
  2234. // evaluate SUM('Skye Lookup Input'!A4:XFD4), cells in range each contain "1"
  2235. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  2236. double numericValue = evaluator.evaluate(wb.getSheetAt(0).getRow(1).getCell(0)).getNumberValue();
  2237. // Assert
  2238. assertEquals(16384.0, numericValue, 0.0);
  2239. wb.close();
  2240. }
  2241. @Test
  2242. public void test58315() throws IOException {
  2243. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("58315.xlsx");
  2244. Cell cell = wb.getSheetAt(0).getRow(0).getCell(0);
  2245. assertNotNull(cell);
  2246. StringBuilder tmpCellContent = new StringBuilder(cell.getStringCellValue());
  2247. XSSFRichTextString richText = (XSSFRichTextString) cell.getRichStringCellValue();
  2248. for (int i = richText.length() - 1; i >= 0; i--) {
  2249. Font f = richText.getFontAtIndex(i);
  2250. if (f != null && f.getStrikeout()) {
  2251. tmpCellContent.deleteCharAt(i);
  2252. }
  2253. }
  2254. String result = tmpCellContent.toString();
  2255. assertEquals("320 350", result);
  2256. wb.close();
  2257. }
  2258. @Test
  2259. public void test55406() throws IOException {
  2260. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("55406_Conditional_formatting_sample.xlsx");
  2261. Sheet sheet = wb.getSheetAt(0);
  2262. Cell cellA1 = sheet.getRow(0).getCell(0);
  2263. Cell cellA2 = sheet.getRow(1).getCell(0);
  2264. assertEquals(0, cellA1.getCellStyle().getFillForegroundColor());
  2265. assertEquals("FFFDFDFD", ((XSSFColor) cellA1.getCellStyle().getFillForegroundColorColor()).getARGBHex());
  2266. assertEquals(0, cellA2.getCellStyle().getFillForegroundColor());
  2267. assertEquals("FFFDFDFD", ((XSSFColor) cellA2.getCellStyle().getFillForegroundColorColor()).getARGBHex());
  2268. SheetConditionalFormatting cond = sheet.getSheetConditionalFormatting();
  2269. assertEquals(2, cond.getNumConditionalFormattings());
  2270. assertEquals(1, cond.getConditionalFormattingAt(0).getNumberOfRules());
  2271. assertEquals(64, cond.getConditionalFormattingAt(0).getRule(0).getPatternFormatting().getFillForegroundColor());
  2272. assertEquals("ISEVEN(ROW())", cond.getConditionalFormattingAt(0).getRule(0).getFormula1());
  2273. assertNull(((XSSFColor) cond.getConditionalFormattingAt(0).getRule(0).getPatternFormatting().getFillForegroundColorColor()).getARGBHex());
  2274. assertEquals(1, cond.getConditionalFormattingAt(1).getNumberOfRules());
  2275. assertEquals(64, cond.getConditionalFormattingAt(1).getRule(0).getPatternFormatting().getFillForegroundColor());
  2276. assertEquals("ISEVEN(ROW())", cond.getConditionalFormattingAt(1).getRule(0).getFormula1());
  2277. assertNull(((XSSFColor) cond.getConditionalFormattingAt(1).getRule(0).getPatternFormatting().getFillForegroundColorColor()).getARGBHex());
  2278. wb.close();
  2279. }
  2280. @Test
  2281. public void test51998() throws IOException {
  2282. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("51998.xlsx");
  2283. Set<String> sheetNames = new HashSet<>();
  2284. for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
  2285. sheetNames.add(wb.getSheetName(sheetNum));
  2286. }
  2287. for (String sheetName : sheetNames) {
  2288. int sheetIndex = wb.getSheetIndex(sheetName);
  2289. wb.removeSheetAt(sheetIndex);
  2290. Sheet newSheet = wb.createSheet();
  2291. //Sheet newSheet = wb.createSheet(sheetName);
  2292. int newSheetIndex = wb.getSheetIndex(newSheet);
  2293. wb.setSheetName(newSheetIndex, sheetName);
  2294. wb.setSheetOrder(sheetName, sheetIndex);
  2295. }
  2296. Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
  2297. wb.close();
  2298. assertNotNull(wbBack);
  2299. wbBack.close();
  2300. }
  2301. @Test
  2302. public void test58731() throws IOException {
  2303. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("58731.xlsx");
  2304. Sheet sheet = wb.createSheet("Java Books");
  2305. Object[][] bookData = {
  2306. {"Head First Java", "Kathy Serria", 79},
  2307. {"Effective Java", "Joshua Bloch", 36},
  2308. {"Clean Code", "Robert martin", 42},
  2309. {"Thinking in Java", "Bruce Eckel", 35},
  2310. };
  2311. int rowCount = 0;
  2312. for (Object[] aBook : bookData) {
  2313. Row row = sheet.createRow(rowCount++);
  2314. int columnCount = 0;
  2315. for (Object field : aBook) {
  2316. Cell cell = row.createCell(columnCount++);
  2317. if (field instanceof String) {
  2318. cell.setCellValue((String) field);
  2319. } else if (field instanceof Integer) {
  2320. cell.setCellValue((Integer) field);
  2321. }
  2322. }
  2323. }
  2324. Workbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb);
  2325. sheet = wb2.getSheet("Java Books");
  2326. assertNotNull(sheet.getRow(0));
  2327. assertNotNull(sheet.getRow(0).getCell(0));
  2328. assertEquals(bookData[0][0], sheet.getRow(0).getCell(0).getStringCellValue());
  2329. wb2.close();
  2330. wb.close();
  2331. }
  2332. /**
  2333. * Regression between 3.10.1 and 3.13 -
  2334. * org.apache.poi.openxml4j.exceptions.InvalidFormatException:
  2335. * The part /xl/sharedStrings.xml does not have any content type
  2336. * ! Rule: Package require content types when retrieving a part from a package. [M.1.14]
  2337. */
  2338. @Test
  2339. public void test58760() throws IOException {
  2340. Workbook wb1 = XSSFTestDataSamples.openSampleWorkbook("58760.xlsx");
  2341. assertEquals(1, wb1.getNumberOfSheets());
  2342. assertEquals("Sheet1", wb1.getSheetName(0));
  2343. Workbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  2344. assertEquals(1, wb2.getNumberOfSheets());
  2345. assertEquals("Sheet1", wb2.getSheetName(0));
  2346. wb2.close();
  2347. wb1.close();
  2348. }
  2349. @Test
  2350. public void test57236() throws IOException {
  2351. // Having very small numbers leads to different formatting, Excel uses the scientific notation, but POI leads to "0"
  2352. /*
  2353. DecimalFormat format = new DecimalFormat("#.##########", new DecimalFormatSymbols(Locale.getDefault()));
  2354. double d = 3.0E-104;
  2355. assertEquals("3.0E-104", format.format(d));
  2356. */
  2357. DataFormatter formatter = new DataFormatter(true);
  2358. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57236.xlsx");
  2359. for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
  2360. Sheet sheet = wb.getSheetAt(sheetNum);
  2361. for (int rowNum = sheet.getFirstRowNum(); rowNum < sheet.getLastRowNum(); rowNum++) {
  2362. Row row = sheet.getRow(rowNum);
  2363. for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
  2364. Cell cell = row.getCell(cellNum);
  2365. String fmtCellValue = formatter.formatCellValue(cell);
  2366. assertNotNull(fmtCellValue);
  2367. assertFalse(fmtCellValue.equals("0"));
  2368. }
  2369. }
  2370. }
  2371. wb.close();
  2372. }
  2373. /**
  2374. * helper function for {@link #test58043()}
  2375. * Side-effects: closes the provided workbook!
  2376. *
  2377. * @param workbook the workbook to save for manual checking
  2378. * @param outputFile the output file location to save the workbook to
  2379. */
  2380. private void saveRotatedTextExample(Workbook workbook, File outputFile) throws IOException {
  2381. Sheet sheet = workbook.createSheet();
  2382. Row row = sheet.createRow((short) 0);
  2383. Cell cell = row.createCell(0);
  2384. cell.setCellValue("Unsuccessful rotated text.");
  2385. CellStyle style = workbook.createCellStyle();
  2386. style.setRotation((short) -90);
  2387. cell.setCellStyle(style);
  2388. OutputStream fos = new FileOutputStream(outputFile);
  2389. workbook.write(fos);
  2390. fos.close();
  2391. workbook.close();
  2392. }
  2393. @Ignore("Creates files for checking results manually, actual values are tested in Test*CellStyle")
  2394. @Test
  2395. public void test58043() throws IOException {
  2396. saveRotatedTextExample(new HSSFWorkbook(), TempFile.createTempFile("rotated", ".xls"));
  2397. saveRotatedTextExample(new XSSFWorkbook(), TempFile.createTempFile("rotated", ".xlsx"));
  2398. }
  2399. @Test
  2400. public void test59132() throws IOException {
  2401. Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("59132.xlsx");
  2402. Sheet worksheet = workbook.getSheet("sheet1");
  2403. // B3
  2404. Row row = worksheet.getRow(2);
  2405. Cell cell = row.getCell(1);
  2406. cell.setCellValue((String) null);
  2407. FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
  2408. // B3
  2409. row = worksheet.getRow(2);
  2410. cell = row.getCell(1);
  2411. assertEquals(CellType.BLANK, cell.getCellType());
  2412. assertEquals(CellType._NONE, evaluator.evaluateFormulaCell(cell));
  2413. // A3
  2414. row = worksheet.getRow(2);
  2415. cell = row.getCell(0);
  2416. assertEquals(CellType.FORMULA, cell.getCellType());
  2417. assertEquals("IF(ISBLANK(B3),\"\",B3)", cell.getCellFormula());
  2418. assertEquals(CellType.STRING, evaluator.evaluateFormulaCell(cell));
  2419. CellValue value = evaluator.evaluate(cell);
  2420. assertEquals("", value.getStringValue());
  2421. // A5
  2422. row = worksheet.getRow(4);
  2423. cell = row.getCell(0);
  2424. assertEquals(CellType.FORMULA, cell.getCellType());
  2425. assertEquals("COUNTBLANK(A1:A4)", cell.getCellFormula());
  2426. assertEquals(CellType.NUMERIC, evaluator.evaluateFormulaCell(cell));
  2427. value = evaluator.evaluate(cell);
  2428. assertEquals(1.0, value.getNumberValue(), 0.1);
  2429. /*FileOutputStream output = new FileOutputStream("C:\\temp\\59132.xlsx");
  2430. try {
  2431. workbook.write(output);
  2432. } finally {
  2433. output.close();
  2434. }*/
  2435. workbook.close();
  2436. }
  2437. @Ignore("bug 59442")
  2438. @Test
  2439. public void testSetRGBBackgroundColor() throws IOException {
  2440. XSSFWorkbook workbook = new XSSFWorkbook();
  2441. XSSFCell cell = workbook.createSheet().createRow(0).createCell(0);
  2442. XSSFColor color = new XSSFColor(java.awt.Color.RED, workbook.getStylesSource().getIndexedColors());
  2443. XSSFCellStyle style = workbook.createCellStyle();
  2444. style.setFillForegroundColor(color);
  2445. style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  2446. cell.setCellStyle(style);
  2447. // Everything is fine at this point, cell is red
  2448. Map<String, Object> properties = new HashMap<>();
  2449. properties.put(CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
  2450. CellUtil.setCellStyleProperties(cell, properties);
  2451. // Now the cell is all black
  2452. XSSFColor actual = cell.getCellStyle().getFillBackgroundColorColor();
  2453. assertNotNull(actual);
  2454. assertEquals(color.getARGBHex(), actual.getARGBHex());
  2455. XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(workbook);
  2456. workbook.close();
  2457. XSSFCell ncell = nwb.getSheetAt(0).getRow(0).getCell(0);
  2458. XSSFColor ncolor = new XSSFColor(java.awt.Color.RED, workbook.getStylesSource().getIndexedColors());
  2459. // Now the cell is all black
  2460. XSSFColor nactual = ncell.getCellStyle().getFillBackgroundColorColor();
  2461. assertNotNull(nactual);
  2462. assertEquals(ncolor.getARGBHex(), nactual.getARGBHex());
  2463. nwb.close();
  2464. }
  2465. @Ignore("currently fails on POI 3.15 beta 2")
  2466. @Test
  2467. public void test55273() {
  2468. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("ExcelTables.xlsx");
  2469. Sheet sheet = wb.getSheet("ExcelTable");
  2470. Name name = wb.getName("TableAsRangeName");
  2471. assertEquals("TableName[#All]", name.getRefersToFormula());
  2472. // POI 3.15-beta 2 (2016-06-15): getSheetName throws IllegalArgumentException: Invalid CellReference: TableName[#All]
  2473. assertEquals("TableName", name.getSheetName());
  2474. XSSFSheet xsheet = (XSSFSheet) sheet;
  2475. List<XSSFTable> tables = xsheet.getTables();
  2476. assertEquals(2, tables.size()); //FIXME: how many tables are there in this spreadsheet?
  2477. assertEquals("Table1", tables.get(0).getName()); //FIXME: what is the table name?
  2478. assertEquals("Table2", tables.get(1).getName()); //FIXME: what is the table name?
  2479. }
  2480. @Test
  2481. public void test57523() {
  2482. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57523.xlsx");
  2483. Sheet sheet = wb.getSheet("Attribute Master");
  2484. Row row = sheet.getRow(15);
  2485. int N = CellReference.convertColStringToIndex("N");
  2486. Cell N16 = row.getCell(N);
  2487. assertEquals(500.0, N16.getNumericCellValue(), 0.00001);
  2488. int P = CellReference.convertColStringToIndex("P");
  2489. Cell P16 = row.getCell(P);
  2490. assertEquals(10.0, P16.getNumericCellValue(), 0.00001);
  2491. }
  2492. /**
  2493. * Files produced by some scientific equipment neglect
  2494. * to include the row number on the row tags
  2495. */
  2496. @Test
  2497. public void noRowNumbers59746() {
  2498. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("59746_NoRowNums.xlsx");
  2499. Sheet sheet = wb.getSheetAt(0);
  2500. assertTrue("Last row num: " + sheet.getLastRowNum(), sheet.getLastRowNum() > 20);
  2501. assertEquals("Checked", sheet.getRow(0).getCell(0).getStringCellValue());
  2502. assertEquals("Checked", sheet.getRow(9).getCell(2).getStringCellValue());
  2503. assertEquals(false, sheet.getRow(70).getCell(8).getBooleanCellValue());
  2504. assertEquals(71, sheet.getPhysicalNumberOfRows());
  2505. assertEquals(70, sheet.getLastRowNum());
  2506. assertEquals(70, sheet.getRow(sheet.getLastRowNum()).getRowNum());
  2507. }
  2508. @Test
  2509. public void testWorkdayFunction() throws IOException {
  2510. XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("59106.xlsx");
  2511. XSSFSheet sheet = workbook.getSheet("Test");
  2512. Row row = sheet.getRow(1);
  2513. Cell cell = row.getCell(0);
  2514. DataFormatter form = new DataFormatter();
  2515. FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
  2516. String result = form.formatCellValue(cell, evaluator);
  2517. assertEquals("09 Mar 2016", result);
  2518. }
  2519. // This bug is currently open. When this bug is fixed, it should not throw an AssertionError
  2520. @Test(expected = AssertionError.class)
  2521. public void test55076_collapseColumnGroups() throws Exception {
  2522. Workbook wb = new XSSFWorkbook();
  2523. Sheet sheet = wb.createSheet();
  2524. // this column collapsing bug only occurs when the grouped columns are different widths
  2525. sheet.setColumnWidth(1, 400);
  2526. sheet.setColumnWidth(2, 600);
  2527. sheet.setColumnWidth(3, 800);
  2528. assertEquals(400, sheet.getColumnWidth(1));
  2529. assertEquals(600, sheet.getColumnWidth(2));
  2530. assertEquals(800, sheet.getColumnWidth(3));
  2531. sheet.groupColumn(1, 3);
  2532. sheet.setColumnGroupCollapsed(1, true);
  2533. assertEquals(0, sheet.getColumnOutlineLevel(0));
  2534. assertEquals(1, sheet.getColumnOutlineLevel(1));
  2535. assertEquals(1, sheet.getColumnOutlineLevel(2));
  2536. assertEquals(1, sheet.getColumnOutlineLevel(3));
  2537. assertEquals(0, sheet.getColumnOutlineLevel(4));
  2538. // none of the columns should be hidden
  2539. // column group collapsing is a different concept
  2540. for (int c = 0; c < 5; c++) {
  2541. assertFalse("Column " + c, sheet.isColumnHidden(c));
  2542. }
  2543. assertEquals(400, sheet.getColumnWidth(1));
  2544. assertEquals(600, sheet.getColumnWidth(2));
  2545. assertEquals(800, sheet.getColumnWidth(3));
  2546. wb.close();
  2547. }
  2548. /**
  2549. * Other things, including charts, may end up taking drawing part
  2550. * numbers. (Uses a test file hand-crafted with an extra non-drawing
  2551. * part with a part number)
  2552. */
  2553. @Test
  2554. public void drawingNumbersAlreadyTaken_60255() throws Exception {
  2555. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("60255_extra_drawingparts.xlsx");
  2556. assertEquals(4, wb.getNumberOfSheets());
  2557. // Sheet 3 starts with a drawing
  2558. Sheet sheet = wb.getSheetAt(0);
  2559. assertNull(sheet.getDrawingPatriarch());
  2560. sheet = wb.getSheetAt(1);
  2561. assertNull(sheet.getDrawingPatriarch());
  2562. sheet = wb.getSheetAt(2);
  2563. assertNotNull(sheet.getDrawingPatriarch());
  2564. sheet = wb.getSheetAt(3);
  2565. assertNull(sheet.getDrawingPatriarch());
  2566. // Add another sheet, and give it a drawing
  2567. sheet = wb.createSheet();
  2568. assertNull(sheet.getDrawingPatriarch());
  2569. sheet.createDrawingPatriarch();
  2570. assertNotNull(sheet.getDrawingPatriarch());
  2571. // Save and check
  2572. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  2573. assertEquals(5, wb.getNumberOfSheets());
  2574. // Sheets 3 and 5 now
  2575. sheet = wb.getSheetAt(0);
  2576. assertNull(sheet.getDrawingPatriarch());
  2577. sheet = wb.getSheetAt(1);
  2578. assertNull(sheet.getDrawingPatriarch());
  2579. sheet = wb.getSheetAt(2);
  2580. assertNotNull(sheet.getDrawingPatriarch());
  2581. sheet = wb.getSheetAt(3);
  2582. assertNull(sheet.getDrawingPatriarch());
  2583. sheet = wb.getSheetAt(4);
  2584. assertNotNull(sheet.getDrawingPatriarch());
  2585. }
  2586. @Test
  2587. public void test53611() throws IOException {
  2588. Workbook wb = new XSSFWorkbook();
  2589. Sheet sheet = wb.createSheet("test");
  2590. Row row = sheet.createRow(1);
  2591. Cell cell = row.createCell(1);
  2592. cell.setCellValue("blabla");
  2593. //0 1 2 3 4 5 6 7
  2594. //A B C D E F G H
  2595. row = sheet.createRow(4);
  2596. cell = row.createCell(7);
  2597. cell.setCellValue("blabla");
  2598. // we currently only populate the dimension during writing out
  2599. // to avoid having to iterate all rows/cells in each add/remove of a row or cell
  2600. wb.write(new NullOutputStream());
  2601. assertEquals("B2:H5", ((XSSFSheet) sheet).getCTWorksheet().getDimension().getRef());
  2602. wb.close();
  2603. }
  2604. @Test
  2605. public void test61798() throws IOException {
  2606. Workbook wb = new XSSFWorkbook();
  2607. Sheet sheet = wb.createSheet("test");
  2608. Row row = sheet.createRow(1);
  2609. Cell cell = row.createCell(1);
  2610. cell.setCellValue("blabla");
  2611. row = sheet.createRow(4);
  2612. // Allowable column range for EXCEL2007 is (0..16383) or ('A'..'XDF')
  2613. cell = row.createCell(16383);
  2614. cell.setCellValue("blabla");
  2615. // we currently only populate the dimension during writing out
  2616. // to avoid having to iterate all rows/cells in each add/remove of a row or cell
  2617. wb.write(new NullOutputStream());
  2618. assertEquals("B2:XFD5", ((XSSFSheet)sheet).getCTWorksheet().getDimension().getRef());
  2619. wb.close();
  2620. }
  2621. @Test
  2622. public void bug61063() throws Exception {
  2623. Workbook wb = XSSFTestDataSamples.openSampleWorkbook("61063.xlsx");
  2624. FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
  2625. Sheet s = wb.getSheetAt(0);
  2626. Row r = s.getRow(3);
  2627. Cell c = r.getCell(0);
  2628. assertEquals(CellType.FORMULA, c.getCellType());
  2629. eval.setDebugEvaluationOutputForNextEval(true);
  2630. CellValue cv = eval.evaluate(c);
  2631. assertNotNull(cv);
  2632. assertEquals("Had: " + cv, 2.0, cv.getNumberValue(), 0.00001);
  2633. wb.close();
  2634. }
  2635. @Test
  2636. public void bug61516(){
  2637. final String initialFormula = "A1";
  2638. final String expectedFormula = "#REF!"; // from ms excel
  2639. Workbook wb = new XSSFWorkbook();
  2640. Sheet sheet = wb.createSheet("sheet1");
  2641. sheet.createRow(0).createCell(0).setCellValue(1); // A1 = 1
  2642. {
  2643. Cell c3 = sheet.createRow(2).createCell(2);
  2644. c3.setCellFormula(initialFormula); // C3 = =A1
  2645. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  2646. CellValue cellValue = evaluator.evaluate(c3);
  2647. assertEquals(1, cellValue.getNumberValue(), 0.0001);
  2648. }
  2649. {
  2650. FormulaShifter formulaShifter = FormulaShifter.createForRowCopy(0, "sheet1", 2/*firstRowToShift*/, 2/*lastRowToShift*/
  2651. , -1/*step*/, SpreadsheetVersion.EXCEL2007); // parameters 2, 2, -1 should mean : move row range [2-2] one level up
  2652. XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
  2653. Ptg[] ptgs = FormulaParser.parse(initialFormula, fpb, FormulaType.CELL, 0); // [A1]
  2654. formulaShifter.adjustFormula(ptgs, 0); // adjusted to [A]
  2655. String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs); //A
  2656. //System.out.println(String.format("initial formula : A1; expected formula value after shifting up : #REF!; actual formula value : %s", shiftedFmla));
  2657. assertEquals("On copy we expect the formula to be adjusted, in this case it would point to row -1, which is an invalid REF",
  2658. expectedFormula, shiftedFmla);
  2659. }
  2660. {
  2661. FormulaShifter formulaShifter = FormulaShifter.createForRowShift(0, "sheet1", 2/*firstRowToShift*/, 2/*lastRowToShift*/
  2662. , -1/*step*/, SpreadsheetVersion.EXCEL2007); // parameters 2, 2, -1 should mean : move row range [2-2] one level up
  2663. XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
  2664. Ptg[] ptgs = FormulaParser.parse(initialFormula, fpb, FormulaType.CELL, 0); // [A1]
  2665. formulaShifter.adjustFormula(ptgs, 0); // adjusted to [A]
  2666. String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs); //A
  2667. //System.out.println(String.format("initial formula : A1; expected formula value after shifting up : #REF!; actual formula value : %s", shiftedFmla));
  2668. assertEquals("On move we expect the formula to stay the same, thus expecting the initial formula A1 here",
  2669. initialFormula, shiftedFmla);
  2670. }
  2671. sheet.shiftRows(2, 2, -1);
  2672. {
  2673. Cell c2 = sheet.getRow(1).getCell(2);
  2674. assertNotNull("cell C2 needs to exist now", c2);
  2675. assertEquals(CellType.FORMULA, c2.getCellType());
  2676. assertEquals(initialFormula, c2.getCellFormula());
  2677. FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  2678. CellValue cellValue = evaluator.evaluate(c2);
  2679. assertEquals(1, cellValue.getNumberValue(), 0.0001);
  2680. }
  2681. }
  2682. @Test
  2683. public void test61652() throws IOException {
  2684. try (Workbook wb = XSSFTestDataSamples.openSampleWorkbook("61652.xlsx")) {
  2685. Sheet sheet = wb.getSheet("IRPPCalc");
  2686. Row row = sheet.getRow(11);
  2687. Cell cell = row.getCell(18);
  2688. WorkbookEvaluatorProvider fe = (WorkbookEvaluatorProvider) wb.getCreationHelper().createFormulaEvaluator();
  2689. ConditionalFormattingEvaluator condfmt = new ConditionalFormattingEvaluator(wb, fe);
  2690. assertEquals("Conditional formatting is not triggered for this cell",
  2691. "[]", condfmt.getConditionalFormattingForCell(cell).toString());
  2692. // but we can read the conditional formatting itself
  2693. List<EvaluationConditionalFormatRule> rules = condfmt.getFormatRulesForSheet(sheet);
  2694. assertEquals(1, rules.size());
  2695. assertEquals("AND($A1>=EDATE($D$6,3),$B1>0)", rules.get(0).getFormula1());
  2696. }
  2697. }
  2698. }