|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
-
- package org.apache.poi.xssf.usermodel;
-
- import static org.junit.Assert.assertArrayEquals;
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertFalse;
- import static org.junit.Assert.assertNotNull;
- import static org.junit.Assert.assertNull;
- import static org.junit.Assert.assertTrue;
- import static org.junit.Assert.fail;
-
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Arrays;
- import java.util.Calendar;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.TreeMap;
-
- import org.apache.poi.EncryptedDocumentException;
- import org.apache.poi.POIDataSamples;
- import org.apache.poi.POIXMLDocumentPart;
- import org.apache.poi.POIXMLException;
- import org.apache.poi.POIXMLProperties;
- import org.apache.poi.hssf.HSSFTestDataSamples;
- import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.openxml4j.exceptions.InvalidOperationException;
- import org.apache.poi.openxml4j.opc.OPCPackage;
- import org.apache.poi.openxml4j.opc.PackageAccess;
- import org.apache.poi.openxml4j.opc.PackagePart;
- import org.apache.poi.openxml4j.opc.PackagingURIHelper;
- import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- import org.apache.poi.ss.formula.WorkbookEvaluator;
- import org.apache.poi.ss.formula.eval.ErrorEval;
- import org.apache.poi.ss.formula.eval.NumberEval;
- import org.apache.poi.ss.formula.eval.ValueEval;
- import org.apache.poi.ss.formula.functions.Function;
- import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.CellStyle;
- import org.apache.poi.ss.usermodel.CellValue;
- import org.apache.poi.ss.usermodel.ClientAnchor;
- import org.apache.poi.ss.usermodel.Comment;
- import org.apache.poi.ss.usermodel.CreationHelper;
- import org.apache.poi.ss.usermodel.DataFormatter;
- import org.apache.poi.ss.usermodel.DateUtil;
- import org.apache.poi.ss.usermodel.Drawing;
- import org.apache.poi.ss.usermodel.Font;
- import org.apache.poi.ss.usermodel.FormulaError;
- import org.apache.poi.ss.usermodel.FormulaEvaluator;
- import org.apache.poi.ss.usermodel.Hyperlink;
- import org.apache.poi.ss.usermodel.IndexedColors;
- import org.apache.poi.ss.usermodel.Name;
- import org.apache.poi.ss.usermodel.PrintSetup;
- import org.apache.poi.ss.usermodel.Row;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.ss.usermodel.WorkbookFactory;
- import org.apache.poi.ss.util.AreaReference;
- import org.apache.poi.ss.util.CellRangeAddress;
- import org.apache.poi.ss.util.CellReference;
- import org.apache.poi.util.TempFile;
- import org.apache.poi.xssf.XLSBUnsupportedException;
- import org.apache.poi.xssf.XSSFITestDataProvider;
- import org.apache.poi.xssf.XSSFTestDataSamples;
- import org.apache.poi.xssf.model.CalculationChain;
- import org.apache.poi.xssf.streaming.SXSSFWorkbook;
- import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
- import org.junit.Ignore;
- import org.junit.Test;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcCell;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
- import org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTFontImpl;
-
- public final class TestXSSFBugs extends BaseTestBugzillaIssues {
- public TestXSSFBugs() {
- super(XSSFITestDataProvider.instance);
- }
-
- /**
- * test writing a file with large number of unique strings,
- * open resulting file in Excel to check results!
- */
- @Test
- public void bug15375_2() {
- bug15375(1000);
- }
-
- /**
- * Named ranges had the right reference, but
- * the wrong sheet name
- */
- @Test
- public void bug45430() {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45430.xlsx");
- assertFalse(wb.isMacroEnabled());
- assertEquals(3, wb.getNumberOfNames());
-
- assertEquals(0, wb.getNameAt(0).getCTName().getLocalSheetId());
- assertFalse(wb.getNameAt(0).getCTName().isSetLocalSheetId());
- assertEquals("SheetA!$A$1", wb.getNameAt(0).getRefersToFormula());
- assertEquals("SheetA", wb.getNameAt(0).getSheetName());
-
- assertEquals(0, wb.getNameAt(1).getCTName().getLocalSheetId());
- assertFalse(wb.getNameAt(1).getCTName().isSetLocalSheetId());
- assertEquals("SheetB!$A$1", wb.getNameAt(1).getRefersToFormula());
- assertEquals("SheetB", wb.getNameAt(1).getSheetName());
-
- assertEquals(0, wb.getNameAt(2).getCTName().getLocalSheetId());
- assertFalse(wb.getNameAt(2).getCTName().isSetLocalSheetId());
- assertEquals("SheetC!$A$1", wb.getNameAt(2).getRefersToFormula());
- assertEquals("SheetC", wb.getNameAt(2).getSheetName());
-
- // Save and re-load, still there
- XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- assertEquals(3, nwb.getNumberOfNames());
- assertEquals("SheetA!$A$1", nwb.getNameAt(0).getRefersToFormula());
- }
-
- /**
- * We should carry vba macros over after save
- */
- @Test
- public void bug45431() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("45431.xlsm");
- OPCPackage pkg = wb.getPackage();
- assertTrue(wb.isMacroEnabled());
-
- // Check the various macro related bits can be found
- PackagePart vba = pkg.getPart(
- PackagingURIHelper.createPartName("/xl/vbaProject.bin")
- );
- assertNotNull(vba);
- // And the drawing bit
- PackagePart drw = pkg.getPart(
- PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
- );
- assertNotNull(drw);
-
-
- // Save and re-open, both still there
- XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- OPCPackage nPkg = nwb.getPackage();
- assertTrue(nwb.isMacroEnabled());
-
- vba = nPkg.getPart(
- PackagingURIHelper.createPartName("/xl/vbaProject.bin")
- );
- assertNotNull(vba);
- drw = nPkg.getPart(
- PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
- );
- assertNotNull(drw);
-
- // And again, just to be sure
- nwb = XSSFTestDataSamples.writeOutAndReadBack(nwb);
- nPkg = nwb.getPackage();
- assertTrue(nwb.isMacroEnabled());
-
- vba = nPkg.getPart(
- PackagingURIHelper.createPartName("/xl/vbaProject.bin")
- );
- assertNotNull(vba);
- drw = nPkg.getPart(
- PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
- );
- assertNotNull(drw);
- }
-
- @Test
- public void bug47504() {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47504.xlsx");
- assertEquals(1, wb.getNumberOfSheets());
- XSSFSheet sh = wb.getSheetAt(0);
- XSSFDrawing drawing = sh.createDrawingPatriarch();
- List<POIXMLDocumentPart> rels = drawing.getRelations();
- assertEquals(1, rels.size());
- assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
-
- // And again, just to be sure
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- assertEquals(1, wb.getNumberOfSheets());
- sh = wb.getSheetAt(0);
- drawing = sh.createDrawingPatriarch();
- rels = drawing.getRelations();
- assertEquals(1, rels.size());
- assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
- }
-
- /**
- * Excel will sometimes write a button with a textbox
- * containing >br< (not closed!).
- * Clearly Excel shouldn't do this, but test that we can
- * read the file despite the naughtyness
- */
- @Test
- public void bug49020() throws Exception {
- /*XSSFWorkbook wb =*/ XSSFTestDataSamples.openSampleWorkbook("BrNotClosed.xlsx");
- }
-
- /**
- * ensure that CTPhoneticPr is loaded by the ooxml test suite so that it is included in poi-ooxml-schemas
- */
- @Test
- public void bug49325() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49325.xlsx");
- CTWorksheet sh = wb.getSheetAt(0).getCTWorksheet();
- assertNotNull(sh.getPhoneticPr());
- }
-
- /**
- * Names which are defined with a Sheet
- * should return that sheet index properly
- */
- @Test
- public void bug48923() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48923.xlsx");
- assertEquals(4, wb.getNumberOfNames());
-
- Name b1 = wb.getName("NameB1");
- Name b2 = wb.getName("NameB2");
- Name sheet2 = wb.getName("NameSheet2");
- Name test = wb.getName("Test");
-
- assertNotNull(b1);
- assertEquals("NameB1", b1.getNameName());
- assertEquals("Sheet1", b1.getSheetName());
- assertEquals(-1, b1.getSheetIndex());
-
- assertNotNull(b2);
- assertEquals("NameB2", b2.getNameName());
- assertEquals("Sheet1", b2.getSheetName());
- assertEquals(-1, b2.getSheetIndex());
-
- assertNotNull(sheet2);
- assertEquals("NameSheet2", sheet2.getNameName());
- assertEquals("Sheet2", sheet2.getSheetName());
- assertEquals(-1, sheet2.getSheetIndex());
-
- assertNotNull(test);
- assertEquals("Test", test.getNameName());
- assertEquals("Sheet1", test.getSheetName());
- assertEquals(-1, test.getSheetIndex());
- }
-
- /**
- * Problem with evaluation formulas due to
- * NameXPtgs.
- * Blows up on:
- * IF(B6= (ROUNDUP(B6,0) + ROUNDDOWN(B6,0))/2, MROUND(B6,2),ROUND(B6,0))
- *
- * TODO: delete this test case when MROUND and VAR are implemented
- */
- @Test
- public void bug48539() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48539.xlsx");
- assertEquals(3, wb.getNumberOfSheets());
- assertEquals(0, wb.getNumberOfNames());
-
- // Try each cell individually
- XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
- for(int i=0; i<wb.getNumberOfSheets(); i++) {
- Sheet s = wb.getSheetAt(i);
- for(Row r : s) {
- for(Cell c : r) {
- if(c.getCellType() == Cell.CELL_TYPE_FORMULA) {
- String formula = c.getCellFormula();
- CellValue cv;
- try {
- cv = eval.evaluate(c);
- } catch (Exception e) {
- throw new RuntimeException("Can't evaluate formula: " + formula, e);
- }
-
- if(cv.getCellType() == Cell.CELL_TYPE_NUMERIC) {
- // assert that the calculated value agrees with
- // the cached formula result calculated by Excel
- double cachedFormulaResult = c.getNumericCellValue();
- double evaluatedFormulaResult = cv.getNumberValue();
- assertEquals(c.getCellFormula(), cachedFormulaResult, evaluatedFormulaResult, 1E-7);
- }
- }
- }
- }
- }
-
- // Now all of them
- XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
- }
-
- /**
- * Foreground colours should be found even if
- * a theme is used
- */
- @Test
- public void bug48779() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48779.xlsx");
- XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
- XSSFCellStyle cs = cell.getCellStyle();
-
- assertNotNull(cs);
- assertEquals(1, cs.getIndex());
-
- // Look at the low level xml elements
- assertEquals(2, cs.getCoreXf().getFillId());
- assertEquals(0, cs.getCoreXf().getXfId());
- assertEquals(true, cs.getCoreXf().getApplyFill());
-
- XSSFCellFill fg = wb.getStylesSource().getFillAt(2);
- assertEquals(0, fg.getFillForegroundColor().getIndexed());
- assertEquals(0.0, fg.getFillForegroundColor().getTint(), 0);
- assertEquals("FFFF0000", fg.getFillForegroundColor().getARGBHex());
- assertEquals(64, fg.getFillBackgroundColor().getIndexed());
-
- // Now look higher up
- assertNotNull(cs.getFillForegroundXSSFColor());
- assertEquals(0, cs.getFillForegroundColor());
- assertEquals("FFFF0000", cs.getFillForegroundXSSFColor().getARGBHex());
- assertEquals("FFFF0000", cs.getFillForegroundColorColor().getARGBHex());
-
- assertNotNull(cs.getFillBackgroundColor());
- assertEquals(64, cs.getFillBackgroundColor());
- assertEquals(null, cs.getFillBackgroundXSSFColor().getARGBHex());
- assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex());
- }
-
- /**
- * Ensure General and @ format are working properly
- * for integers
- */
- @Test
- public void bug47490() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("GeneralFormatTests.xlsx");
- Sheet s = wb.getSheetAt(1);
- Row r;
- DataFormatter df = new DataFormatter();
-
- r = s.getRow(1);
- assertEquals(1.0, r.getCell(2).getNumericCellValue(), 0);
- assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
- assertEquals("1", df.formatCellValue(r.getCell(2)));
- assertEquals("1", df.formatRawCellContents(1.0, -1, "@"));
- assertEquals("1", df.formatRawCellContents(1.0, -1, "General"));
-
- r = s.getRow(2);
- assertEquals(12.0, r.getCell(2).getNumericCellValue(), 0);
- assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
- assertEquals("12", df.formatCellValue(r.getCell(2)));
- assertEquals("12", df.formatRawCellContents(12.0, -1, "@"));
- assertEquals("12", df.formatRawCellContents(12.0, -1, "General"));
-
- r = s.getRow(3);
- assertEquals(123.0, r.getCell(2).getNumericCellValue(), 0);
- assertEquals("General", r.getCell(2).getCellStyle().getDataFormatString());
- assertEquals("123", df.formatCellValue(r.getCell(2)));
- assertEquals("123", df.formatRawCellContents(123.0, -1, "@"));
- assertEquals("123", df.formatRawCellContents(123.0, -1, "General"));
- }
-
- /**
- * A problem file from a non-standard source (a scientific instrument that saves its
- * output as an .xlsx file) that have two issues:
- * 1. The Content Type part name is lower-case: [content_types].xml
- * 2. The file appears to use backslashes as path separators
- *
- * The OPC spec tolerates both of these peculiarities, so does POI
- */
- @Test
- public void bug49609() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("49609.xlsx");
- assertEquals("FAM", wb.getSheetName(0));
- assertEquals("Cycle", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
-
- }
-
- @Test
- public void bug49783() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49783.xlsx");
- Sheet sheet = wb.getSheetAt(0);
- FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
- Cell cell;
-
- cell = sheet.getRow(0).getCell(0);
- assertEquals("#REF!*#REF!", cell.getCellFormula());
- assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
- assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
-
- Name nm1 = wb.getName("sale_1");
- assertNotNull("name sale_1 should be present", nm1);
- assertEquals("Sheet1!#REF!", nm1.getRefersToFormula());
- Name nm2 = wb.getName("sale_2");
- assertNotNull("name sale_2 should be present", nm2);
- assertEquals("Sheet1!#REF!", nm2.getRefersToFormula());
-
- cell = sheet.getRow(1).getCell(0);
- assertEquals("sale_1*sale_2", cell.getCellFormula());
- assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
- assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
- }
-
- /**
- * Creating a rich string of "hello world" and applying
- * a font to characters 1-5 means we have two strings,
- * "hello" and " world". As such, we need to apply
- * preserve spaces to the 2nd bit, lest we end up
- * with something like "helloworld" !
- */
- @Test
- public void bug49941() throws Exception {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet s = wb.createSheet();
- XSSFRow r = s.createRow(0);
- XSSFCell c = r.createCell(0);
-
- // First without fonts
- c.setCellValue(
- new XSSFRichTextString(" with spaces ")
- );
- assertEquals(" with spaces ", c.getRichStringCellValue().toString());
- assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
- assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
- // Should have the preserve set
- assertEquals(
- 1,
- c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
- );
- assertEquals(
- "preserve",
- c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().item(0).getNodeValue()
- );
-
- // Save and check
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- wb.close();
- s = wbBack.getSheetAt(0);
- r = s.getRow(0);
- c = r.getCell(0);
- assertEquals(" with spaces ", c.getRichStringCellValue().toString());
- assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
- assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
-
- // Change the string
- c.setCellValue(
- new XSSFRichTextString("hello world")
- );
- assertEquals("hello world", c.getRichStringCellValue().toString());
- // Won't have preserve
- assertEquals(
- 0,
- c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
- );
-
- // Apply a font
- XSSFFont f = wbBack.createFont();
- f.setBold(true);
- c.getRichStringCellValue().applyFont(0, 5, f);
- assertEquals("hello world", c.getRichStringCellValue().toString());
- // Does need preserving on the 2nd part
- assertEquals(2, c.getRichStringCellValue().getCTRst().sizeOfRArray());
- assertEquals(
- 0,
- c.getRichStringCellValue().getCTRst().getRArray(0).xgetT().getDomNode().getAttributes().getLength()
- );
- assertEquals(
- 1,
- c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().getLength()
- );
- assertEquals(
- "preserve",
- c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().item(0).getNodeValue()
- );
-
- // Save and check
- wbBack = XSSFTestDataSamples.writeOutAndReadBack(wbBack);
- s = wbBack.getSheetAt(0);
- r = s.getRow(0);
- c = r.getCell(0);
- assertEquals("hello world", c.getRichStringCellValue().toString());
- wbBack.close();
- }
-
- /**
- * Repeatedly writing the same file which has styles
- */
- @Test
- public void bug49940() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("styles.xlsx");
- assertEquals(3, wb.getNumberOfSheets());
- assertEquals(10, wb.getStylesSource().getNumCellStyles());
-
- ByteArrayOutputStream b1 = new ByteArrayOutputStream();
- ByteArrayOutputStream b2 = new ByteArrayOutputStream();
- ByteArrayOutputStream b3 = new ByteArrayOutputStream();
- wb.write(b1);
- wb.write(b2);
- wb.write(b3);
-
- for(byte[] data : new byte[][] {
- b1.toByteArray(), b2.toByteArray(), b3.toByteArray()
- }) {
- ByteArrayInputStream bais = new ByteArrayInputStream(data);
- wb = new XSSFWorkbook(bais);
- assertEquals(3, wb.getNumberOfSheets());
- assertEquals(10, wb.getStylesSource().getNumCellStyles());
- }
- }
-
- /**
- * Various ways of removing a cell formula should all zap the calcChain
- * entry.
- */
- @Test
- public void bug49966() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples
- .openSampleWorkbook("shared_formulas.xlsx");
- XSSFSheet sheet = wb.getSheetAt(0);
-
- Workbook wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- // CalcChain has lots of entries
- CalculationChain cc = wb.getCalculationChain();
- assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
- assertEquals("A3", cc.getCTCalcChain().getCArray(1).getR());
- assertEquals("A4", cc.getCTCalcChain().getCArray(2).getR());
- assertEquals("A5", cc.getCTCalcChain().getCArray(3).getR());
- assertEquals("A6", cc.getCTCalcChain().getCArray(4).getR());
- assertEquals("A7", cc.getCTCalcChain().getCArray(5).getR());
- assertEquals("A8", cc.getCTCalcChain().getCArray(6).getR());
- assertEquals(40, cc.getCTCalcChain().sizeOfCArray());
- wbRead.close();
-
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- // Try various ways of changing the formulas
- // If it stays a formula, chain entry should remain
- // Otherwise should go
- sheet.getRow(1).getCell(0).setCellFormula("A1"); // stay
- sheet.getRow(2).getCell(0).setCellFormula(null); // go
- sheet.getRow(3).getCell(0).setCellType(Cell.CELL_TYPE_FORMULA); // stay
- wbRead.close();
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
- sheet.getRow(4).getCell(0).setCellType(Cell.CELL_TYPE_STRING); // go
- wbRead.close();
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- validateCells(sheet);
- sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
- validateCells(sheet);
- wbRead.close();
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- sheet.getRow(6).getCell(0).setCellType(Cell.CELL_TYPE_BLANK); // go
- wbRead.close();
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
- sheet.getRow(7).getCell(0).setCellValue((String) null); // go
- wbRead.close();
-
- wbRead = XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- // Save and check
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- assertEquals(35, cc.getCTCalcChain().sizeOfCArray());
-
- cc = wb.getCalculationChain();
- assertEquals("A2", cc.getCTCalcChain().getCArray(0).getR());
- assertEquals("A4", cc.getCTCalcChain().getCArray(1).getR());
- assertEquals("A9", cc.getCTCalcChain().getCArray(2).getR());
- wbRead.close();
- }
-
- @Test
- public void bug49966Row() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples
- .openSampleWorkbook("shared_formulas.xlsx");
- XSSFSheet sheet = wb.getSheetAt(0);
-
- validateCells(sheet);
- sheet.getRow(5).removeCell(sheet.getRow(5).getCell(0)); // go
- validateCells(sheet);
- }
-
- private void validateCells(XSSFSheet sheet) {
- for(Row row : sheet) {
- // trigger handling
- ((XSSFRow)row).onDocumentWrite();
- }
- }
-
- @Test
- public void bug49156() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49156.xlsx");
- FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
-
- Sheet sheet = wb.getSheetAt(0);
- for(Row row : sheet){
- for(Cell cell : row){
- if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
- formulaEvaluator.evaluateInCell(cell); // caused NPE on some cells
- }
- }
- }
- }
-
- /**
- * Newlines are valid characters in a formula
- */
- @Test
- public void bug50440And51875() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("NewlineInFormulas.xlsx");
- Sheet s = wb.getSheetAt(0);
- Cell c = s.getRow(0).getCell(0);
-
- assertEquals("SUM(\n1,2\n)", c.getCellFormula());
- assertEquals(3.0, c.getNumericCellValue(), 0);
-
- FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
- formulaEvaluator.evaluateFormulaCell(c);
-
- assertEquals("SUM(\n1,2\n)", c.getCellFormula());
- assertEquals(3.0, c.getNumericCellValue(), 0);
-
- // For 51875
- Cell b3 = s.getRow(2).getCell(1);
- formulaEvaluator.evaluateFormulaCell(b3);
- assertEquals("B1+B2", b3.getCellFormula()); // The newline is lost for shared formulas
- assertEquals(3.0, b3.getNumericCellValue(), 0);
- }
-
- /**
- * Moving a cell comment from one cell to another
- */
- @Test
- public void bug50795() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50795.xlsx");
- XSSFSheet sheet = wb.getSheetAt(0);
- XSSFRow row = sheet.getRow(0);
-
- XSSFCell cellWith = row.getCell(0);
- XSSFCell cellWithoutComment = row.getCell(1);
-
- assertNotNull(cellWith.getCellComment());
- assertNull(cellWithoutComment.getCellComment());
-
- String exp = "\u0410\u0432\u0442\u043e\u0440:\ncomment";
- XSSFComment comment = cellWith.getCellComment();
- assertEquals(exp, comment.getString().getString());
-
-
- // Check we can write it out and read it back as-is
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
- cellWith = row.getCell(0);
- cellWithoutComment = row.getCell(1);
-
- // Double check things are as expected
- assertNotNull(cellWith.getCellComment());
- assertNull(cellWithoutComment.getCellComment());
- comment = cellWith.getCellComment();
- assertEquals(exp, comment.getString().getString());
-
-
- // Move the comment
- cellWithoutComment.setCellComment(comment);
-
-
- // Write out and re-check
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
-
- // Ensure it swapped over
- cellWith = row.getCell(0);
- cellWithoutComment = row.getCell(1);
- assertNull(cellWith.getCellComment());
- assertNotNull(cellWithoutComment.getCellComment());
-
- comment = cellWithoutComment.getCellComment();
- assertEquals(exp, comment.getString().getString());
- }
-
- /**
- * When the cell background colour is set with one of the first
- * two columns of the theme colour palette, the colours are
- * shades of white or black.
- * For those cases, ensure we don't break on reading the colour
- */
- @Test
- public void bug50299() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("50299.xlsx");
-
- // Check all the colours
- for(int sn=0; sn<wb.getNumberOfSheets(); sn++) {
- Sheet s = wb.getSheetAt(sn);
- for(Row r : s) {
- for(Cell c : r) {
- CellStyle cs = c.getCellStyle();
- if(cs != null) {
- cs.getFillForegroundColor();
- }
- }
- }
- }
-
- // Check one bit in detail
- // Check that we get back foreground=0 for the theme colours,
- // and background=64 for the auto colouring
- Sheet s = wb.getSheetAt(0);
- assertEquals(0, s.getRow(0).getCell(8).getCellStyle().getFillForegroundColor());
- assertEquals(64, s.getRow(0).getCell(8).getCellStyle().getFillBackgroundColor());
- assertEquals(0, s.getRow(1).getCell(8).getCellStyle().getFillForegroundColor());
- assertEquals(64, s.getRow(1).getCell(8).getCellStyle().getFillBackgroundColor());
- }
-
- /**
- * Excel .xls style indexed colours in a .xlsx file
- */
- @Test
- public void bug50786() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50786-indexed_colours.xlsx");
- XSSFSheet s = wb.getSheetAt(0);
- XSSFRow r = s.getRow(2);
-
- // Check we have the right cell
- XSSFCell c = r.getCell(1);
- assertEquals("test\u00a0", c.getRichStringCellValue().getString());
-
- // It should be light green
- XSSFCellStyle cs = c.getCellStyle();
- assertEquals(42, cs.getFillForegroundColor());
- assertEquals(42, cs.getFillForegroundColorColor().getIndexed());
- assertNotNull(cs.getFillForegroundColorColor().getRgb());
- assertEquals("FFCCFFCC", cs.getFillForegroundColorColor().getARGBHex());
- }
-
- /**
- * If the border colours are set with themes, then we
- * should still be able to get colours
- */
- @Test
- public void bug50846() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50846-border_colours.xlsx");
-
- XSSFSheet sheet = wb.getSheetAt(0);
- XSSFRow row = sheet.getRow(0);
-
- // Border from a theme, brown
- XSSFCell cellT = row.getCell(0);
- XSSFCellStyle styleT = cellT.getCellStyle();
- XSSFColor colorT = styleT.getBottomBorderXSSFColor();
-
- assertEquals(5, colorT.getTheme());
- assertEquals("FFC0504D", colorT.getARGBHex());
-
- // Border from a style direct, red
- XSSFCell cellS = row.getCell(1);
- XSSFCellStyle styleS = cellS.getCellStyle();
- XSSFColor colorS = styleS.getBottomBorderXSSFColor();
-
- assertEquals(0, colorS.getTheme());
- assertEquals("FFFF0000", colorS.getARGBHex());
- }
-
- /**
- * Fonts where their colours come from the theme rather
- * then being set explicitly still should allow the
- * fetching of the RGB.
- */
- @Test
- public void bug50784() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50784-font_theme_colours.xlsx");
- XSSFSheet s = wb.getSheetAt(0);
- XSSFRow r = s.getRow(0);
-
- // Column 1 has a font with regular colours
- XSSFCell cr = r.getCell(1);
- XSSFFont fr = wb.getFontAt( cr.getCellStyle().getFontIndex() );
- XSSFColor colr = fr.getXSSFColor();
- // No theme, has colours
- assertEquals(0, colr.getTheme());
- assertNotNull( colr.getRgb() );
-
- // Column 0 has a font with colours from a theme
- XSSFCell ct = r.getCell(0);
- XSSFFont ft = wb.getFontAt( ct.getCellStyle().getFontIndex() );
- XSSFColor colt = ft.getXSSFColor();
- // Has a theme, which has the colours on it
- assertEquals(9, colt.getTheme());
- XSSFColor themeC = wb.getTheme().getThemeColor(colt.getTheme());
- assertNotNull( themeC.getRgb() );
- assertNotNull( colt.getRgb() );
- assertEquals( themeC.getARGBHex(), colt.getARGBHex() ); // The same colour
- }
-
- /**
- * New lines were being eaten when setting a font on
- * a rich text string
- */
- @Test
- public void bug48877() throws Exception {
- String text = "Use \n with word wrap on to create a new line.\n" +
- "This line finishes with two trailing spaces. ";
-
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet();
-
- Font font1 = wb.createFont();
- font1.setColor((short) 20);
- Font font2 = wb.createFont();
- font2.setColor(Font.COLOR_RED);
- Font font3 = wb.getFontAt((short)0);
-
- XSSFRow row = sheet.createRow(2);
- XSSFCell cell = row.createCell(2);
-
- XSSFRichTextString richTextString =
- wb.getCreationHelper().createRichTextString(text);
-
- // Check the text has the newline
- assertEquals(text, richTextString.getString());
-
- // Apply the font
- richTextString.applyFont(font3);
- richTextString.applyFont(0, 3, font1);
- cell.setCellValue(richTextString);
-
- // To enable newlines you need set a cell styles with wrap=true
- CellStyle cs = wb.createCellStyle();
- cs.setWrapText(true);
- cell.setCellStyle(cs);
-
- // Check the text has the
- assertEquals(text, cell.getStringCellValue());
-
- // Save the file and re-read it
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- wb.close();
- sheet = wbBack.getSheetAt(0);
- row = sheet.getRow(2);
- cell = row.getCell(2);
- assertEquals(text, cell.getStringCellValue());
-
- // Now add a 2nd, and check again
- int fontAt = text.indexOf("\n", 6);
- cell.getRichStringCellValue().applyFont(10, fontAt+1, font2);
- assertEquals(text, cell.getStringCellValue());
-
- assertEquals(4, cell.getRichStringCellValue().numFormattingRuns());
- assertEquals("Use", cell.getRichStringCellValue().getCTRst().getRArray(0).getT());
-
- String r3 = cell.getRichStringCellValue().getCTRst().getRArray(2).getT();
- assertEquals("line.\n", r3.substring(r3.length()-6));
-
- // Save and re-check
- wbBack = XSSFTestDataSamples.writeOutAndReadBack(wbBack);
- sheet = wbBack.getSheetAt(0);
- row = sheet.getRow(2);
- cell = row.getCell(2);
- assertEquals(text, cell.getStringCellValue());
- wbBack.close();
-
- // FileOutputStream out = new FileOutputStream("/tmp/test48877.xlsx");
- // wb.write(out);
- // out.close();
- }
-
- /**
- * Adding sheets when one has a table, then re-ordering
- */
- @Test
- public void bug50867() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50867_with_table.xlsx");
- assertEquals(3, wb.getNumberOfSheets());
-
- XSSFSheet s1 = wb.getSheetAt(0);
- XSSFSheet s2 = wb.getSheetAt(1);
- XSSFSheet s3 = wb.getSheetAt(2);
- assertEquals(1, s1.getTables().size());
- assertEquals(0, s2.getTables().size());
- assertEquals(0, s3.getTables().size());
-
- XSSFTable t = s1.getTables().get(0);
- assertEquals("Tabella1", t.getName());
- assertEquals("Tabella1", t.getDisplayName());
- assertEquals("A1:C3", t.getCTTable().getRef());
-
- // Add a sheet and re-order
- XSSFSheet s4 = wb.createSheet("NewSheet");
- wb.setSheetOrder(s4.getSheetName(), 0);
-
- // Check on tables
- assertEquals(1, s1.getTables().size());
- assertEquals(0, s2.getTables().size());
- assertEquals(0, s3.getTables().size());
- assertEquals(0, s4.getTables().size());
-
- // Refetch to get the new order
- s1 = wb.getSheetAt(0);
- s2 = wb.getSheetAt(1);
- s3 = wb.getSheetAt(2);
- s4 = wb.getSheetAt(3);
- assertEquals(0, s1.getTables().size());
- assertEquals(1, s2.getTables().size());
- assertEquals(0, s3.getTables().size());
- assertEquals(0, s4.getTables().size());
-
- // Save and re-load
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- s1 = wb.getSheetAt(0);
- s2 = wb.getSheetAt(1);
- s3 = wb.getSheetAt(2);
- s4 = wb.getSheetAt(3);
- assertEquals(0, s1.getTables().size());
- assertEquals(1, s2.getTables().size());
- assertEquals(0, s3.getTables().size());
- assertEquals(0, s4.getTables().size());
-
- t = s2.getTables().get(0);
- assertEquals("Tabella1", t.getName());
- assertEquals("Tabella1", t.getDisplayName());
- assertEquals("A1:C3", t.getCTTable().getRef());
-
-
- // Add some more tables, and check
- t = s2.createTable();
- t.setName("New 2");
- t.setDisplayName("New 2");
- t = s3.createTable();
- t.setName("New 3");
- t.setDisplayName("New 3");
-
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- s1 = wb.getSheetAt(0);
- s2 = wb.getSheetAt(1);
- s3 = wb.getSheetAt(2);
- s4 = wb.getSheetAt(3);
- assertEquals(0, s1.getTables().size());
- assertEquals(2, s2.getTables().size());
- assertEquals(1, s3.getTables().size());
- assertEquals(0, s4.getTables().size());
-
- t = s2.getTables().get(0);
- assertEquals("Tabella1", t.getName());
- assertEquals("Tabella1", t.getDisplayName());
- assertEquals("A1:C3", t.getCTTable().getRef());
-
- t = s2.getTables().get(1);
- assertEquals("New 2", t.getName());
- assertEquals("New 2", t.getDisplayName());
-
- t = s3.getTables().get(0);
- assertEquals("New 3", t.getName());
- assertEquals("New 3", t.getDisplayName());
-
- // Check the relationships
- assertEquals(0, s1.getRelations().size());
- assertEquals(3, s2.getRelations().size());
- assertEquals(1, s3.getRelations().size());
- assertEquals(0, s4.getRelations().size());
-
- assertEquals(
- XSSFRelation.PRINTER_SETTINGS.getContentType(),
- s2.getRelations().get(0).getPackagePart().getContentType()
- );
- assertEquals(
- XSSFRelation.TABLE.getContentType(),
- s2.getRelations().get(1).getPackagePart().getContentType()
- );
- assertEquals(
- XSSFRelation.TABLE.getContentType(),
- s2.getRelations().get(2).getPackagePart().getContentType()
- );
- assertEquals(
- XSSFRelation.TABLE.getContentType(),
- s3.getRelations().get(0).getPackagePart().getContentType()
- );
- assertEquals(
- "/xl/tables/table3.xml",
- s3.getRelations().get(0).getPackagePart().getPartName().toString()
- );
- }
-
- /**
- * Setting repeating rows and columns shouldn't break
- * any print settings that were there before
- */
- @SuppressWarnings("deprecation")
- @Test
- public void bug49253() throws Exception {
- XSSFWorkbook wb1 = new XSSFWorkbook();
- XSSFWorkbook wb2 = new XSSFWorkbook();
-
- // No print settings before repeating
- XSSFSheet s1 = wb1.createSheet();
- assertEquals(false, s1.getCTWorksheet().isSetPageSetup());
- assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
-
- wb1.setRepeatingRowsAndColumns(0, 2, 3, 1, 2);
-
- assertEquals(true, s1.getCTWorksheet().isSetPageSetup());
- assertEquals(true, s1.getCTWorksheet().isSetPageMargins());
-
- PrintSetup ps1 = s1.getPrintSetup();
- assertEquals(false, ps1.getValidSettings());
- assertEquals(false, ps1.getLandscape());
-
-
- // Had valid print settings before repeating
- XSSFSheet s2 = wb2.createSheet();
- PrintSetup ps2 = s2.getPrintSetup();
- assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
- assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
-
- ps2.setLandscape(false);
- assertEquals(true, ps2.getValidSettings());
- assertEquals(false, ps2.getLandscape());
-
- wb2.setRepeatingRowsAndColumns(0, 2, 3, 1, 2);
-
- ps2 = s2.getPrintSetup();
- assertEquals(true, s2.getCTWorksheet().isSetPageSetup());
- assertEquals(true, s2.getCTWorksheet().isSetPageMargins());
- assertEquals(true, ps2.getValidSettings());
- assertEquals(false, ps2.getLandscape());
-
- wb1.close();
- wb2.close();
- }
-
- /**
- * Default Column style
- */
- @Test
- public void bug51037() throws Exception {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet s = wb.createSheet();
-
- CellStyle defaultStyle = wb.getCellStyleAt((short)0);
- assertEquals(0, defaultStyle.getIndex());
-
- CellStyle blueStyle = wb.createCellStyle();
- blueStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
- blueStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
- assertEquals(1, blueStyle.getIndex());
-
- CellStyle pinkStyle = wb.createCellStyle();
- pinkStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());
- pinkStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
- assertEquals(2, pinkStyle.getIndex());
-
- // Starts empty
- assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
- CTCols cols = s.getCTWorksheet().getColsArray(0);
- assertEquals(0, cols.sizeOfColArray());
-
- // Add some rows and columns
- XSSFRow r1 = s.createRow(0);
- XSSFRow r2 = s.createRow(1);
- r1.createCell(0);
- r1.createCell(2);
- r2.createCell(0);
- r2.createCell(3);
-
- // Check no style is there
- assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
- assertEquals(0, cols.sizeOfColArray());
-
- assertEquals(defaultStyle, s.getColumnStyle(0));
- assertEquals(defaultStyle, s.getColumnStyle(2));
- assertEquals(defaultStyle, s.getColumnStyle(3));
-
-
- // Apply the styles
- s.setDefaultColumnStyle(0, pinkStyle);
- s.setDefaultColumnStyle(3, blueStyle);
-
- // Check
- assertEquals(pinkStyle, s.getColumnStyle(0));
- assertEquals(defaultStyle, s.getColumnStyle(2));
- assertEquals(blueStyle, s.getColumnStyle(3));
-
- assertEquals(1, s.getCTWorksheet().sizeOfColsArray());
- assertEquals(2, cols.sizeOfColArray());
-
- assertEquals(1, cols.getColArray(0).getMin());
- assertEquals(1, cols.getColArray(0).getMax());
- assertEquals(pinkStyle.getIndex(), cols.getColArray(0).getStyle());
-
- assertEquals(4, cols.getColArray(1).getMin());
- assertEquals(4, cols.getColArray(1).getMax());
- assertEquals(blueStyle.getIndex(), cols.getColArray(1).getStyle());
-
-
- // Save, re-load and re-check
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- wb.close();
- s = wbBack.getSheetAt(0);
- defaultStyle = wbBack.getCellStyleAt(defaultStyle.getIndex());
- blueStyle = wbBack.getCellStyleAt(blueStyle.getIndex());
- pinkStyle = wbBack.getCellStyleAt(pinkStyle.getIndex());
-
- assertEquals(pinkStyle, s.getColumnStyle(0));
- assertEquals(defaultStyle, s.getColumnStyle(2));
- assertEquals(blueStyle, s.getColumnStyle(3));
- wbBack.close();
- }
-
- /**
- * Repeatedly writing a file.
- * Something with the SharedStringsTable currently breaks...
- */
- @Test
- public void bug46662() throws Exception {
- // New file
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFTestDataSamples.writeOutAndReadBack(wb);
- XSSFTestDataSamples.writeOutAndReadBack(wb);
- XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- // Simple file
- wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
- XSSFTestDataSamples.writeOutAndReadBack(wb);
- XSSFTestDataSamples.writeOutAndReadBack(wb);
- XSSFTestDataSamples.writeOutAndReadBack(wb);
-
- // Complex file
- // TODO
- }
-
- /**
- * Colours and styles when the list has gaps in it
- */
- @Test
- public void bug51222() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51222.xlsx");
- XSSFSheet s = wb.getSheetAt(0);
-
- XSSFCell cA4_EEECE1 = s.getRow(3).getCell(0);
- XSSFCell cA5_1F497D = s.getRow(4).getCell(0);
-
- // Check the text
- assertEquals("A4", cA4_EEECE1.getRichStringCellValue().getString());
- assertEquals("A5", cA5_1F497D.getRichStringCellValue().getString());
-
- // Check the styles assigned to them
- assertEquals(4, cA4_EEECE1.getCTCell().getS());
- assertEquals(5, cA5_1F497D.getCTCell().getS());
-
- // Check we look up the correct style
- assertEquals(4, cA4_EEECE1.getCellStyle().getIndex());
- assertEquals(5, cA5_1F497D.getCellStyle().getIndex());
-
- // Check the fills on them at the low level
- assertEquals(5, cA4_EEECE1.getCellStyle().getCoreXf().getFillId());
- assertEquals(6, cA5_1F497D.getCellStyle().getCoreXf().getFillId());
-
- // These should reference themes 2 and 3
- assertEquals(2, wb.getStylesSource().getFillAt(5).getCTFill().getPatternFill().getFgColor().getTheme());
- assertEquals(3, wb.getStylesSource().getFillAt(6).getCTFill().getPatternFill().getFgColor().getTheme());
-
- // Ensure we get the right colours for these themes
- // TODO fix
- // assertEquals("FFEEECE1", wb.getTheme().getThemeColor(2).getARGBHex());
- // assertEquals("FF1F497D", wb.getTheme().getThemeColor(3).getARGBHex());
-
- // Finally check the colours on the styles
- // TODO fix
- // assertEquals("FFEEECE1", cA4_EEECE1.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
- // assertEquals("FF1F497D", cA5_1F497D.getCellStyle().getFillForegroundXSSFColor().getARGBHex());
- }
-
- @Test
- public void bug51470() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
- XSSFSheet sh0 = wb.getSheetAt(0);
- XSSFSheet sh1 = wb.cloneSheet(0);
- List<POIXMLDocumentPart> rels0 = sh0.getRelations();
- List<POIXMLDocumentPart> rels1 = sh1.getRelations();
- assertEquals(1, rels0.size());
- assertEquals(1, rels1.size());
-
- assertEquals(rels0.get(0).getPackageRelationship(), rels1.get(0).getPackageRelationship());
- }
-
- /**
- * Add comments to Sheet 1, when Sheet 2 already has
- * comments (so /xl/comments1.xml is taken)
- */
- @Test
- public void bug51850() {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51850.xlsx");
- XSSFSheet sh1 = wb.getSheetAt(0);
- XSSFSheet sh2 = wb.getSheetAt(1);
-
- // Sheet 2 has comments
- assertNotNull(sh2.getCommentsTable(false));
- assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
-
- // Sheet 1 doesn't (yet)
- assertNull(sh1.getCommentsTable(false));
-
- // Try to add comments to Sheet 1
- CreationHelper factory = wb.getCreationHelper();
- Drawing drawing = sh1.createDrawingPatriarch();
-
- ClientAnchor anchor = factory.createClientAnchor();
- anchor.setCol1(0);
- anchor.setCol2(4);
- anchor.setRow1(0);
- anchor.setRow2(1);
-
- Comment comment1 = drawing.createCellComment(anchor);
- comment1.setString(
- factory.createRichTextString("I like this cell. It's my favourite."));
- comment1.setAuthor("Bob T. Fish");
-
- anchor = factory.createClientAnchor();
- anchor.setCol1(0);
- anchor.setCol2(4);
- anchor.setRow1(1);
- anchor.setRow2(1);
- Comment comment2 = drawing.createCellComment(anchor);
- comment2.setString(
- factory.createRichTextString("This is much less fun..."));
- comment2.setAuthor("Bob T. Fish");
-
- Cell c1 = sh1.getRow(0).createCell(4);
- c1.setCellValue(2.3);
- c1.setCellComment(comment1);
-
- Cell c2 = sh1.getRow(0).createCell(5);
- c2.setCellValue(2.1);
- c2.setCellComment(comment2);
-
-
- // Save and re-load
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- sh1 = wb.getSheetAt(0);
- sh2 = wb.getSheetAt(1);
-
- // Check the comments
- assertNotNull(sh2.getCommentsTable(false));
- assertEquals(1, sh2.getCommentsTable(false).getNumberOfComments());
-
- assertNotNull(sh1.getCommentsTable(false));
- assertEquals(2, sh1.getCommentsTable(false).getNumberOfComments());
- }
-
- /**
- * Sheet names with a , in them
- */
- @Test
- public void bug51963() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51963.xlsx");
- Sheet sheet = wb.getSheetAt(0);
- assertEquals("Abc,1", sheet.getSheetName());
-
- Name name = wb.getName("Intekon.ProdCodes");
- assertEquals("'Abc,1'!$A$1:$A$2", name.getRefersToFormula());
-
- @SuppressWarnings("deprecation")
- AreaReference ref = new AreaReference(name.getRefersToFormula());
- assertEquals(0, ref.getFirstCell().getRow());
- assertEquals(0, ref.getFirstCell().getCol());
- assertEquals(1, ref.getLastCell().getRow());
- assertEquals(0, ref.getLastCell().getCol());
- }
-
- /**
- * Sum across multiple workbooks
- * eg =SUM($Sheet1.C1:$Sheet4.C1)
- * DISABLED As we can't currently evaluate these
- */
- @Ignore
- public void bug48703() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48703.xlsx");
- XSSFSheet sheet = wb.getSheetAt(0);
-
- // Contains two forms, one with a range and one a list
- XSSFRow r1 = sheet.getRow(0);
- XSSFRow r2 = sheet.getRow(1);
- XSSFCell c1 = r1.getCell(1);
- XSSFCell c2 = r2.getCell(1);
-
- assertEquals(20.0, c1.getNumericCellValue(), 0);
- assertEquals("SUM(Sheet1!C1,Sheet2!C1,Sheet3!C1,Sheet4!C1)", c1.getCellFormula());
-
- assertEquals(20.0, c2.getNumericCellValue(), 0);
- assertEquals("SUM(Sheet1:Sheet4!C1)", c2.getCellFormula());
-
- // Try evaluating both
- XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb);
- eval.evaluateFormulaCell(c1);
- eval.evaluateFormulaCell(c2);
-
- assertEquals(20.0, c1.getNumericCellValue(), 0);
- assertEquals(20.0, c2.getNumericCellValue(), 0);
- }
-
- /**
- * Bugzilla 51710: problems reading shared formuals from .xlsx
- */
- @Test
- public void bug51710() {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("51710.xlsx");
-
- final String[] columns = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N"};
- final int rowMax = 500; // bug triggers on row index 59
-
- Sheet sheet = wb.getSheetAt(0);
-
-
- // go through all formula cells
- for (int rInd = 2; rInd <= rowMax; rInd++) {
- Row row = sheet.getRow(rInd);
-
- for (int cInd = 1; cInd <= 12; cInd++) {
- Cell cell = row.getCell(cInd);
- String formula = cell.getCellFormula();
- CellReference ref = new CellReference(cell);
-
- //simulate correct answer
- String correct = "$A" + (rInd + 1) + "*" + columns[cInd] + "$2";
-
- assertEquals("Incorrect formula in " + ref.formatAsString(), correct, formula);
- }
-
- }
- }
-
- /**
- * Bug 53101:
- */
- @Test
- public void bug5301(){
- Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("53101.xlsx");
- FormulaEvaluator evaluator =
- workbook.getCreationHelper().createFormulaEvaluator();
- // A1: SUM(B1: IZ1)
- double a1Value =
- evaluator.evaluate(workbook.getSheetAt(0).getRow(0).getCell(0)).getNumberValue();
-
- // Assert
- assertEquals(259.0, a1Value, 0.0);
-
- // KY: SUM(B1: IZ1)
- /*double ky1Value =*/
- evaluator.evaluate(workbook.getSheetAt(0).getRow(0).getCell(310)).getNumberValue();
-
- // Assert
- assertEquals(259.0, a1Value, 0.0);
- }
-
- @Test
- public void bug54436(){
- Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("54436.xlsx");
- if(!WorkbookEvaluator.getSupportedFunctionNames().contains("GETPIVOTDATA")){
- Function func = new Function() {
- @Override
- public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
- return ErrorEval.NA;
- }
- };
-
- WorkbookEvaluator.registerFunction("GETPIVOTDATA", func);
- }
- workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
- }
-
- /**
- * Password Protected .xlsx files should give a helpful
- * error message when called via WorkbookFactory with no password
- */
- @Test(expected=EncryptedDocumentException.class)
- public void bug55692_poifs() throws Exception {
- // Via a POIFSFileSystem
- POIFSFileSystem fsP = new POIFSFileSystem(
- POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
- WorkbookFactory.create(fsP);
- }
-
- public void bug55692_stream() throws Exception {
- // Directly on a Stream, will go via NPOIFS and spot it's
- // actually a .xlsx file encrypted with the default password, and open
- Workbook wb = WorkbookFactory.create(
- POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
- assertNotNull(wb);
- assertEquals(3, wb.getNumberOfSheets());
- }
-
- public void bug55692_npoifs() throws Exception {
- // Via a NPOIFSFileSystem, will spot it's actually a .xlsx file
- // encrypted with the default password, and open
- NPOIFSFileSystem fsNP = new NPOIFSFileSystem(
- POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
- Workbook wb = WorkbookFactory.create(fsNP);
- assertNotNull(wb);
- assertEquals(3, wb.getNumberOfSheets());
- }
-
- @Test
- public void bug53282() {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53282b.xlsx");
- Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
- assertEquals("#@_#", c.getStringCellValue());
- assertEquals("http://invalid.uri", c.getHyperlink().getAddress());
- }
-
- /**
- * Was giving NullPointerException
- * at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead
- * due to a lack of Styles Table
- */
- @Test
- public void bug56278() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56278.xlsx");
- assertEquals(0, wb.getSheetIndex("Market Rates"));
-
- // Save and re-check
- Workbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- assertEquals(0, nwb.getSheetIndex("Market Rates"));
- }
-
- @Test
- public void bug56315() {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56315.xlsx");
- Cell c = wb.getSheetAt(0).getRow(1).getCell(0);
- CellValue cv = wb.getCreationHelper().createFormulaEvaluator().evaluate(c);
- double rounded = cv.getNumberValue();
- assertEquals(0.1, rounded, 0.0);
- }
-
- @Test
- public void bug56468() throws Exception {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet();
- XSSFRow row = sheet.createRow(0);
- XSSFCell cell = row.createCell(0);
- cell.setCellValue("Hi");
- sheet.setRepeatingRows(new CellRangeAddress(0, 0, 0, 0));
-
- // small hack to try to make this test stable, previously it failed whenever the two written ZIP files had different file-creation
- // dates stored.
- // 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
- // causes differences
- long start = System.currentTimeMillis()/1000;
- while(System.currentTimeMillis()/1000 == start) {
- Thread.sleep(10);
- }
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream(8096);
- wb.write(bos);
- byte firstSave[] = bos.toByteArray();
- bos.reset();
- wb.write(bos);
- byte secondSave[] = bos.toByteArray();
-
- /*OutputStream stream = new FileOutputStream("C:\\temp\\poi.xlsx");
- try {
- wb.write(stream);
- } finally {
- stream.close();
- }*/
-
- assertArrayEquals("Had: \n" + Arrays.toString(firstSave) + " and \n" + Arrays.toString(secondSave),
- firstSave, secondSave);
-
- wb.close();
- }
-
- /**
- * ISO-8601 style cell formats with a T in them, eg
- * cell format of "yyyy-MM-ddTHH:mm:ss"
- */
- @Test
- public void bug54034() throws IOException {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54034.xlsx");
- Sheet sheet = wb.getSheet("Sheet1");
- Row row = sheet.getRow(1);
- Cell cell = row.getCell(2);
- assertTrue(DateUtil.isCellDateFormatted(cell));
-
- DataFormatter fmt = new DataFormatter();
- assertEquals("yyyy\\-mm\\-dd\\Thh:mm", cell.getCellStyle().getDataFormatString());
- assertEquals("2012-08-08T22:59", fmt.formatCellValue(cell));
- }
-
-
- @Test
- public void testBug53798XLSX() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
- File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
- bug53798Work(wb, xlsOutput);
- }
-
- @Ignore("Shifting rows is not yet implemented in SXSSFSheet")
- @Test
- public void testBug53798XLSXStream() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xlsx");
- File xlsOutput = TempFile.createTempFile("testBug53798", ".xlsx");
- bug53798Work(new SXSSFWorkbook(wb), xlsOutput);
- }
-
- @Test
- public void testBug53798XLS() throws IOException {
- Workbook wb = HSSFTestDataSamples.openSampleWorkbook("53798_shiftNegative_TMPL.xls");
- File xlsOutput = TempFile.createTempFile("testBug53798", ".xls");
- bug53798Work(wb, xlsOutput);
- }
-
- /**
- * SUMIF was throwing a NPE on some formulas
- */
- @Test
- public void testBug56420SumIfNPE() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56420.xlsx");
-
- FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
-
- Sheet sheet = wb.getSheetAt(0);
- Row r = sheet.getRow(2);
- Cell c = r.getCell(2);
- assertEquals("SUMIF($A$1:$A$4,A3,$B$1:$B$4)", c.getCellFormula());
- Cell eval = evaluator.evaluateInCell(c);
- assertEquals(0.0, eval.getNumericCellValue(), 0.0001);
- }
-
- private void bug53798Work(Workbook wb, File xlsOutput) throws IOException {
- Sheet testSheet = wb.getSheetAt(0);
-
- testSheet.shiftRows(2, 2, 1);
-
- saveAndReloadReport(wb, xlsOutput);
-
- // 1) corrupted xlsx (unreadable data in the first row of a shifted group) already comes about
- // when shifted by less than -1 negative amount (try -2)
- testSheet.shiftRows(3, 3, -1);
-
- saveAndReloadReport(wb, xlsOutput);
-
- testSheet.shiftRows(2, 2, 1);
-
- saveAndReloadReport(wb, xlsOutput);
-
- Row newRow = null;
- Cell newCell = null;
- // 2) attempt to create a new row IN PLACE of a removed row by a negative shift causes corrupted
- // xlsx file with unreadable data in the negative shifted row.
- // NOTE it's ok to create any other row.
- newRow = testSheet.createRow(3);
-
- saveAndReloadReport(wb, xlsOutput);
-
- newCell = newRow.createCell(0);
-
- saveAndReloadReport(wb, xlsOutput);
-
- newCell.setCellValue("new Cell in row "+newRow.getRowNum());
-
- saveAndReloadReport(wb, xlsOutput);
-
- // 3) once a negative shift has been made any attempt to shift another group of rows
- // (note: outside of previously negative shifted rows) by a POSITIVE amount causes POI exception:
- // org.apache.xmlbeans.impl.values.XmlValueDisconnectedException.
- // NOTE: another negative shift on another group of rows is successful, provided no new rows in
- // place of previously shifted rows were attempted to be created as explained above.
- testSheet.shiftRows(6, 7, 1); // -- CHANGE the shift to positive once the behaviour of
- // the above has been tested
-
- saveAndReloadReport(wb, xlsOutput);
- }
-
- /**
- * XSSFCell.typeMismatch on certain blank cells when formatting
- * with DataFormatter
- */
- @Test
- public void bug56702() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56702.xlsx");
-
- Sheet sheet = wb.getSheetAt(0);
-
- // Get wrong cell by row 8 & column 7
- Cell cell = sheet.getRow(8).getCell(7);
- assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
-
- // Check the value - will be zero as it is <c><v/></c>
- assertEquals(0.0, cell.getNumericCellValue(), 0.001);
-
- // Try to format
- DataFormatter formatter = new DataFormatter();
- formatter.formatCellValue(cell);
-
- // Check the formatting
- assertEquals("0", formatter.formatCellValue(cell));
- }
-
- /**
- * Formulas which reference named ranges, either in other
- * sheets, or workbook scoped but in other workbooks.
- * Used to fail with with errors like
- * org.apache.poi.ss.formula.FormulaParseException: Cell reference expected after sheet name at index 9
- * org.apache.poi.ss.formula.FormulaParseException: Parse error near char 0 '[' in specified formula '[0]!NR_Global_B2'. Expected number, string, or defined name
- */
- @Test
- public void bug56737() throws IOException {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx");
-
- // Check the named range definitions
- Name nSheetScope = wb.getName("NR_To_A1");
- Name nWBScope = wb.getName("NR_Global_B2");
-
- assertNotNull(nSheetScope);
- assertNotNull(nWBScope);
-
- assertEquals("Defines!$A$1", nSheetScope.getRefersToFormula());
- assertEquals("Defines!$B$2", nWBScope.getRefersToFormula());
-
- // Check the different kinds of formulas
- Sheet s = wb.getSheetAt(0);
- Cell cRefSName = s.getRow(1).getCell(3);
- Cell cRefWName = s.getRow(2).getCell(3);
-
- assertEquals("Defines!NR_To_A1", cRefSName.getCellFormula());
- // Note the formula, as stored in the file, has the external name index not filename
- // TODO Provide a way to get the one with the filename
- assertEquals("[0]!NR_Global_B2", cRefWName.getCellFormula());
-
- // Try to evaluate them
- FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
- assertEquals("Test A1", eval.evaluate(cRefSName).getStringValue());
- assertEquals(142, (int)eval.evaluate(cRefWName).getNumberValue());
-
- // Try to evaluate everything
- eval.evaluateAll();
- }
-
- private void saveAndReloadReport(Workbook wb, File outFile) throws IOException {
- // run some method on the font to verify if it is "disconnected" already
- //for(short i = 0;i < 256;i++)
- {
- Font font = wb.getFontAt((short)0);
- if(font instanceof XSSFFont) {
- XSSFFont xfont = (XSSFFont) wb.getFontAt((short)0);
- CTFontImpl ctFont = (CTFontImpl) xfont.getCTFont();
- assertEquals(0, ctFont.sizeOfBArray());
- }
- }
-
- FileOutputStream fileOutStream = new FileOutputStream(outFile);
- wb.write(fileOutStream);
- fileOutStream.close();
- //System.out.println("File \""+outFile.getName()+"\" has been saved successfully");
-
- FileInputStream is = new FileInputStream(outFile);
- try {
- Workbook newWB = null;
- try {
- if(wb instanceof XSSFWorkbook) {
- newWB = new XSSFWorkbook(is);
- } else if(wb instanceof HSSFWorkbook) {
- newWB = new HSSFWorkbook(is);
- } else if(wb instanceof SXSSFWorkbook) {
- newWB = new SXSSFWorkbook(new XSSFWorkbook(is));
- } else {
- throw new IllegalStateException("Unknown workbook: " + wb);
- }
- assertNotNull(newWB.getSheet("test"));
- } finally {
- newWB.close();
- }
- } finally {
- is.close();
- }
- }
-
- @Test
- public void testBug56688_1() {
- XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_1.xlsx");
- checkValue(excel, "-1.0"); /* Not 0.0 because POI sees date "0" minus one month as invalid date, which is -1! */
- }
-
- @Test
- public void testBug56688_2() {
- XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_2.xlsx");
- checkValue(excel, "#VALUE!");
- }
-
- @Test
- public void testBug56688_3() {
- XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_3.xlsx");
- checkValue(excel, "#VALUE!");
- }
-
- @Test
- public void testBug56688_4() {
- XSSFWorkbook excel = XSSFTestDataSamples.openSampleWorkbook("56688_4.xlsx");
-
- Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.MONTH, 2);
- double excelDate = DateUtil.getExcelDate(calendar.getTime());
- NumberEval eval = new NumberEval(Math.floor(excelDate));
- checkValue(excel, eval.getStringValue() + ".0");
- }
-
- /**
- * New hyperlink with no initial cell reference, still need
- * to be able to change it
- * @throws IOException
- */
- @Test
- public void testBug56527() throws IOException {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet();
- XSSFCreationHelper creationHelper = wb.getCreationHelper();
- XSSFHyperlink hyperlink;
-
- // Try with a cell reference
- hyperlink = creationHelper.createHyperlink(Hyperlink.LINK_URL);
- sheet.addHyperlink(hyperlink);
- hyperlink.setAddress("http://myurl");
- hyperlink.setCellReference("B4");
- assertEquals(3, hyperlink.getFirstRow());
- assertEquals(1, hyperlink.getFirstColumn());
- assertEquals(3, hyperlink.getLastRow());
- assertEquals(1, hyperlink.getLastColumn());
-
- // Try with explicit rows / columns
- hyperlink = creationHelper.createHyperlink(Hyperlink.LINK_URL);
- sheet.addHyperlink(hyperlink);
- hyperlink.setAddress("http://myurl");
- hyperlink.setFirstRow(5);
- hyperlink.setFirstColumn(3);
-
- assertEquals(5, hyperlink.getFirstRow());
- assertEquals(3, hyperlink.getFirstColumn());
- assertEquals(5, hyperlink.getLastRow());
- assertEquals(3, hyperlink.getLastColumn());
- wb.close();
- }
-
- /**
- * Shifting rows with a formula that references a
- * function in another file
- */
- @Test
- public void bug56502() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56502.xlsx");
- Sheet sheet = wb.getSheetAt(0);
-
- Cell cFunc = sheet.getRow(3).getCell(0);
- assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
- Cell cRef = sheet.getRow(3).createCell(1);
- cRef.setCellFormula("A3");
-
- // Shift it down one row
- sheet.shiftRows(1, sheet.getLastRowNum(), 1);
-
- // Check the new formulas: Function won't change, Reference will
- cFunc = sheet.getRow(4).getCell(0);
- assertEquals("[1]!LUCANET(\"Ist\")", cFunc.getCellFormula());
- cRef = sheet.getRow(4).getCell(1);
- assertEquals("A4", cRef.getCellFormula());
- }
-
- @Test
- public void bug54764() throws Exception {
- OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("54764.xlsx");
-
- // Check the core properties - will be found but empty, due
- // to the expansion being too much to be considered valid
- POIXMLProperties props = new POIXMLProperties(pkg);
- assertEquals(null, props.getCoreProperties().getTitle());
- assertEquals(null, props.getCoreProperties().getSubject());
- assertEquals(null, props.getCoreProperties().getDescription());
-
- // Now check the spreadsheet itself
- try {
- new XSSFWorkbook(pkg);
- fail("Should fail as too much expansion occurs");
- } catch(POIXMLException e) {
- // Expected
- }
-
- // Try with one with the entities in the Content Types
- try {
- XSSFTestDataSamples.openSamplePackage("54764-2.xlsx");
- fail("Should fail as too much expansion occurs");
- } catch(Exception e) {
- // Expected
- }
-
- // Check we can still parse valid files after all that
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
- assertEquals(3, wb.getNumberOfSheets());
- }
-
- /**
- * CTDefinedNamesImpl should be included in the smaller
- * poi-ooxml-schemas jar
- */
- @Test
- public void bug57176() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57176.xlsx");
- CTDefinedNames definedNames = wb.getCTWorkbook().getDefinedNames();
- List<CTDefinedName> definedNameList = definedNames.getDefinedNameList();
- for (CTDefinedName defName : definedNameList) {
- assertNotNull(defName.getName());
- assertNotNull(defName.getStringValue());
- }
- assertEquals("TestDefinedName", definedNameList.get(0).getName());
- }
-
- /**
- * .xlsb files are not supported, but we should generate a helpful
- * error message if given one
- */
- @Test
- public void bug56800_xlsb() throws Exception {
- // Can be opened at the OPC level
- OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("Simple.xlsb");
-
- // XSSF Workbook gives helpful error
- try {
- new XSSFWorkbook(pkg);
- fail(".xlsb files not supported");
- } catch (XLSBUnsupportedException e) {
- // Good, detected and warned
- }
-
- // Workbook Factory gives helpful error on package
- try {
- WorkbookFactory.create(pkg);
- fail(".xlsb files not supported");
- } catch (XLSBUnsupportedException e) {
- // Good, detected and warned
- }
-
- // Workbook Factory gives helpful error on file
- File xlsbFile = HSSFTestDataSamples.getSampleFile("Simple.xlsb");
- try {
- WorkbookFactory.create(xlsbFile);
- fail(".xlsb files not supported");
- } catch (XLSBUnsupportedException e) {
- // Good, detected and warned
- }
- }
-
- private void checkValue(XSSFWorkbook excel, String expect) {
- XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);
- evaluator.evaluateAll();
-
- XSSFCell cell = excel.getSheetAt(0).getRow(1).getCell(1);
- CellValue value = evaluator.evaluate(cell);
-
- assertEquals(expect, value.formatAsString());
- }
-
- @Test
- public void testBug57196() throws IOException {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57196.xlsx");
- Sheet sheet = wb.getSheet("Feuil1");
- Row mod=sheet.getRow(1);
- mod.getCell(1).setCellValue(3);
- HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
- // FileOutputStream fileOutput = new FileOutputStream("/tmp/57196.xlsx");
- // wb.write(fileOutput);
- // fileOutput.close();
- wb.close();
- }
-
- @Test
- public void test57196_Detail() {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet("Sheet1");
- XSSFRow row = sheet.createRow(0);
- XSSFCell cell = row.createCell(0);
- cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
- XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
- CellValue cv = fe.evaluate(cell);
-
- assertNotNull(cv);
- }
-
- @Test
- public void test57196_Detail2() {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet("Sheet1");
- XSSFRow row = sheet.createRow(0);
- XSSFCell cell = row.createCell(0);
- cell.setCellFormula("DEC2HEX(O2+D2)");
- XSSFFormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
- CellValue cv = fe.evaluate(cell);
-
- assertNotNull(cv);
- }
-
- @Test
- public void test57196_WorkbookEvaluator() {
- //System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger");
- //System.setProperty("poi.log.level", "3");
- try {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet("Sheet1");
- XSSFRow row = sheet.createRow(0);
- XSSFCell cell = row.createCell(0);
- cell.setCellValue("0");
- cell = row.createCell(1);
- cell.setCellValue(0);
- cell = row.createCell(2);
- cell.setCellValue(0);
-
- // simple formula worked
- cell.setCellFormula("DEC2HEX(O2+D2)");
-
- WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // this already failed! Hex2Dec did not correctly handle RefEval
- cell.setCellFormula("HEX2DEC(O8)");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // slightly more complex one failed
- cell.setCellFormula("HEX2DEC(O8)-O2+D2");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // more complicated failed
- cell.setCellFormula("DEC2HEX(HEX2DEC(O8)-O2+D2)");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // what other similar functions
- cell.setCellFormula("DEC2BIN(O8)-O2+D2");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // what other similar functions
- cell.setCellFormula("DEC2BIN(A1)");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
-
- // what other similar functions
- cell.setCellFormula("BIN2DEC(B1)");
- workbookEvaluator.clearAllCachedResultValues();
-
- workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
- workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
- workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
- } finally {
- System.clearProperty("org.apache.poi.util.POILogger");
- System.clearProperty("poi.log.level");
- }
- }
-
- /**
- * A .xlsx file with no Shared Strings table should open fine
- * in read-only mode
- */
- @SuppressWarnings("resource")
- @Test
- public void bug57482() throws Exception {
- for (PackageAccess access : new PackageAccess[] {
- PackageAccess.READ_WRITE, PackageAccess.READ
- }) {
- File file = HSSFTestDataSamples.getSampleFile("57482-OnlyNumeric.xlsx");
- OPCPackage pkg = OPCPackage.open(file, access);
- try {
- // Try to open it and read the contents
- XSSFWorkbook wb = new XSSFWorkbook(pkg);
- assertNotNull(wb.getSharedStringSource());
- assertEquals(0, wb.getSharedStringSource().getCount());
-
- DataFormatter fmt = new DataFormatter();
- XSSFSheet s = wb.getSheetAt(0);
- assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
- assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
- assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
-
- // Add a text cell
- s.getRow(0).createCell(3).setCellValue("Testing");
- assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
-
- // Try to write-out and read again, should only work
- // in read-write mode, not read-only mode
- try {
- wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
- if (access == PackageAccess.READ)
- fail("Shouln't be able to write from read-only mode");
- } catch (InvalidOperationException e) {
- if (access == PackageAccess.READ) {
- // Expected
- } else {
- // Shouldn't occur in write-mode
- throw e;
- }
- }
-
- // Check again
- s = wb.getSheetAt(0);
- assertEquals("1", fmt.formatCellValue(s.getRow(0).getCell(0)));
- assertEquals("11", fmt.formatCellValue(s.getRow(0).getCell(1)));
- assertEquals("5", fmt.formatCellValue(s.getRow(4).getCell(0)));
- assertEquals("Testing", fmt.formatCellValue(s.getRow(0).getCell(3)));
- } finally {
- pkg.revert();
- }
- }
- }
-
- /**
- * "Unknown error type: -60" fetching formula error value
- */
- @Test
- public void bug57535() throws Exception {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57535.xlsx");
- FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
- evaluator.clearAllCachedResultValues();
-
- Sheet sheet = wb.getSheet("Sheet1");
- Cell cell = sheet.getRow(5).getCell(4);
- assertEquals(Cell.CELL_TYPE_FORMULA, cell.getCellType());
- assertEquals("E4+E5", cell.getCellFormula());
-
- CellValue value = evaluator.evaluate(cell);
- assertEquals(Cell.CELL_TYPE_ERROR, value.getCellType());
- assertEquals(-60, value.getErrorValue());
- assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
- assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
- }
-
-
- @Test
- public void test57165() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
- try {
- removeAllSheetsBut(3, wb);
- wb.cloneSheet(0); // Throws exception here
- wb.setSheetName(1, "New Sheet");
- //saveWorkbook(wb, fileName);
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- try {
-
- } finally {
- wbBack.close();
- }
- } finally {
- wb.close();
- }
- }
-
- @Test
- public void test57165_create() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
- try {
- removeAllSheetsBut(3, wb);
- wb.createSheet("newsheet"); // Throws exception here
- wb.setSheetName(1, "New Sheet");
- //saveWorkbook(wb, fileName);
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- try {
-
- } finally {
- wbBack.close();
- }
- } finally {
- wb.close();
- }
- }
-
- private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
- {
- int sheetNb = wb.getNumberOfSheets();
- // Move this sheet at the first position
- wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
- for (int sn = sheetNb - 1; sn > 0; sn--)
- {
- wb.removeSheetAt(sn);
- }
- }
-
- /**
- * Sums 2 plus the cell at the left, indirectly to avoid reference
- * problems when deleting columns, conditionally to stop recursion
- */
- private static final String FORMULA1 =
- "IF( INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) = 0, 0,"
- + "INDIRECT( ADDRESS( ROW(), COLUMN()-1 ) ) ) + 2";
-
- /**
- * Sums 2 plus the upper cell, indirectly to avoid reference
- * problems when deleting rows, conditionally to stop recursion
- */
- private static final String FORMULA2 =
- "IF( INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) = 0, 0,"
- + "INDIRECT( ADDRESS( ROW()-1, COLUMN() ) ) ) + 2";
-
- /**
- * Expected:
-
- * [ 0][ 2][ 4]
- * @throws IOException
- */
- @Test
- public void testBug56820_Formula1() throws IOException {
- Workbook wb = new XSSFWorkbook();
- try {
- FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
- Sheet sh = wb.createSheet();
-
- sh.createRow(0).createCell(0).setCellValue(0.0d);
- Cell formulaCell1 = sh.getRow(0).createCell(1);
- Cell formulaCell2 = sh.getRow(0).createCell(2);
- formulaCell1.setCellFormula(FORMULA1);
- formulaCell2.setCellFormula(FORMULA1);
-
- double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
- double A2 = evaluator.evaluate(formulaCell2).getNumberValue();
-
- assertEquals(2, A1, 0);
- assertEquals(4, A2, 0); //<-- FAILS EXPECTATIONS
- } finally {
- wb.close();
- }
- }
-
- /**
- * Expected:
-
- * [ 0] <- number
- * [ 2] <- formula
- * [ 4] <- formula
- * @throws IOException
- */
- @Test
- public void testBug56820_Formula2() throws IOException {
- Workbook wb = new XSSFWorkbook();
- try {
- FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
- Sheet sh = wb.createSheet();
-
- sh.createRow(0).createCell(0).setCellValue(0.0d);
- Cell formulaCell1 = sh.createRow(1).createCell(0);
- Cell formulaCell2 = sh.createRow(2).createCell(0);
- formulaCell1.setCellFormula(FORMULA2);
- formulaCell2.setCellFormula(FORMULA2);
-
- double A1 = evaluator.evaluate(formulaCell1).getNumberValue();
- double A2 = evaluator.evaluate(formulaCell2).getNumberValue(); //<-- FAILS EVALUATION
-
- assertEquals(2, A1, 0);
- assertEquals(4, A2, 0);
- } finally {
- wb.close();
- }
- }
-
- @Test
- public void test56467() throws IOException {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("picture.xlsx");
- try {
- Sheet orig = wb.getSheetAt(0);
- assertNotNull(orig);
-
- Sheet sheet = wb.cloneSheet(0);
- Drawing drawing = sheet.createDrawingPatriarch();
- for (XSSFShape shape : ((XSSFDrawing) drawing).getShapes()) {
- if (shape instanceof XSSFPicture) {
- XSSFPictureData pictureData = ((XSSFPicture) shape).getPictureData();
- assertNotNull(pictureData);
- }
- }
-
- // OutputStream out = new FileOutputStream("/tmp/56467.xls");
- // try {
- // wb.write(out);
- // } finally {
- // out.close();
- // }
- } finally {
- wb.close();
- }
- }
-
- /**
- * OOXML-Strict files
- * Not currently working - namespace mis-match from XMLBeans
- */
- @Test
- @Ignore("XMLBeans namespace mis-match on ooxml-strict files")
- public void test57699() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.strict.xlsx");
- assertEquals(3, wb.getNumberOfSheets());
- // TODO Check sheet contents
- // TODO Check formula evaluation
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- assertEquals(3, wbBack.getNumberOfSheets());
- // TODO Re-check sheet contents
- // TODO Re-check formula evaluation
- }
-
- @Test
- public void testBug56295_MergeXlslsWithStyles() throws IOException {
- XSSFWorkbook xlsToAppendWorkbook = XSSFTestDataSamples.openSampleWorkbook("56295.xlsx");
- XSSFSheet sheet = xlsToAppendWorkbook.getSheetAt(0);
- XSSFRow srcRow = sheet.getRow(0);
- XSSFCell oldCell = srcRow.getCell(0);
- XSSFCellStyle cellStyle = oldCell.getCellStyle();
-
- checkStyle(cellStyle);
-
- // StylesTable table = xlsToAppendWorkbook.getStylesSource();
- // List<XSSFCellFill> fills = table.getFills();
- // System.out.println("Having " + fills.size() + " fills");
- // for(XSSFCellFill fill : fills) {
- // System.out.println("Fill: " + fill.getFillBackgroundColor() + "/" + fill.getFillForegroundColor());
- // }
-
- XSSFWorkbook targetWorkbook = new XSSFWorkbook();
- XSSFSheet newSheet = targetWorkbook.createSheet(sheet.getSheetName());
- XSSFRow destRow = newSheet.createRow(0);
- XSSFCell newCell = destRow.createCell(0);
-
- //newCell.getCellStyle().cloneStyleFrom(cellStyle);
- CellStyle newCellStyle = targetWorkbook.createCellStyle();
- newCellStyle.cloneStyleFrom(cellStyle);
- newCell.setCellStyle(newCellStyle);
- checkStyle(newCell.getCellStyle());
- newCell.setCellValue(oldCell.getStringCellValue());
-
- // OutputStream os = new FileOutputStream("output.xlsm");
- // try {
- // targetWorkbook.write(os);
- // } finally {
- // os.close();
- // }
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(targetWorkbook);
- XSSFCellStyle styleBack = wbBack.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
- checkStyle(styleBack);
- }
-
- /**
- * Paragraph with property BuFont but none of the properties
- * BuNone, BuChar, and BuAutoNum, used to trigger a NPE
- * Excel treats this as not-bulleted, so now do we
- */
- @Test
- public void testBug57826() {
- XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("57826.xlsx");
-
- assertTrue("no sheets in workbook", workbook.getNumberOfSheets() >= 1);
- XSSFSheet sheet = workbook.getSheetAt(0);
-
- XSSFDrawing drawing = sheet.getDrawingPatriarch();
- assertNotNull(drawing);
-
- List<XSSFShape> shapes = drawing.getShapes();
- assertEquals(1, shapes.size());
- assertTrue(shapes.get(0) instanceof XSSFSimpleShape);
-
- XSSFSimpleShape shape = (XSSFSimpleShape)shapes.get(0);
-
- // Used to throw a NPE
- String text = shape.getText();
-
- // No bulleting info included
- assertEquals("test ok", text);
- }
-
- private void checkStyle(XSSFCellStyle cellStyle) {
- assertNotNull(cellStyle);
- assertEquals(0, cellStyle.getFillForegroundColor());
- assertNotNull(cellStyle.getFillForegroundXSSFColor());
- XSSFColor fgColor = cellStyle.getFillForegroundColorColor();
- assertNotNull(fgColor);
- assertEquals("FF00FFFF", fgColor.getARGBHex());
-
- assertEquals(0, cellStyle.getFillBackgroundColor());
- assertNotNull(cellStyle.getFillBackgroundXSSFColor());
- XSSFColor bgColor = cellStyle.getFillBackgroundColorColor();
- assertNotNull(bgColor);
- assertEquals("FF00FFFF", fgColor.getARGBHex());
- }
-
- @Test
- public void bug57642() throws Exception {
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet s = wb.createSheet("TestSheet");
- XSSFCell c = s.createRow(0).createCell(0);
- c.setCellFormula("ISERROR(TestSheet!A1)");
- c = s.createRow(1).createCell(1);
- c.setCellFormula("ISERROR(B2)");
-
- wb.setSheetName(0, "CSN");
- c = s.getRow(0).getCell(0);
- assertEquals("ISERROR(CSN!A1)", c.getCellFormula());
- c = s.getRow(1).getCell(1);
- assertEquals("ISERROR(B2)", c.getCellFormula());
-
- wb.close();
- }
-
- /**
- * .xlsx supports 64000 cell styles, the style indexes after
- * 32,767 must not be -32,768, then -32,767, -32,766
- */
- @Test
- public void bug57880() throws Exception {
- int numStyles = 33000;
- XSSFWorkbook wb = new XSSFWorkbook();
- XSSFSheet s = wb.createSheet("TestSheet");
- XSSFDataFormat fmt = wb.getCreationHelper().createDataFormat();
- for (int i=1; i<numStyles; i++) {
- short df = fmt.getFormat("test"+i);
- // Format indexes will be wrapped beyond 32,676
- assertEquals(164+i, df&0xffff);
- // Create a style and use it
- XSSFCellStyle style = wb.createCellStyle();
- assertEquals(i, style.getUIndex());
- style.setDataFormat(df);
- XSSFCell c = s.createRow(i).createCell(0, Cell.CELL_TYPE_NUMERIC);
- c.setCellStyle(style);
- c.setCellValue(i);
- }
-
- // using temp file instead of ByteArrayOutputStream because of OOM in gump run
- File tmp = TempFile.createTempFile("poi-test", ".bug57880");
- FileOutputStream fos = new FileOutputStream(tmp);
- wb.write(fos);
- fos.close();
-
- wb.close();
- fmt = null; s = null; wb = null;
- // System.gc();
-
- wb = new XSSFWorkbook(tmp);
- fmt = wb.getCreationHelper().createDataFormat();
- s = wb.getSheetAt(0);
- for (int i=1; i<numStyles; i++) {
- XSSFCellStyle style = wb.getCellStyleAt((short)i);
- assertNotNull(style);
- assertEquals(i, style.getUIndex());
- assertEquals(164+i, style.getDataFormat()&0xffff);
- assertEquals("test"+i, style.getDataFormatString());
- }
- wb.close();
- tmp.delete();
- }
-
-
- @Test
- public void test56574() throws IOException {
- runTest56574(false);
- runTest56574(true);
- }
-
- @SuppressWarnings("deprecation")
- private void runTest56574(boolean createRow) throws IOException {
- Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56574.xlsx");
-
- Sheet sheet = wb.getSheet("Func");
- assertNotNull(sheet);
-
- Map<String, Object[]> data;
- data = new TreeMap<String, Object[]>();
- data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
- data.put("2", new Object[] {2, "Amit", "Shukla"});
- data.put("3", new Object[] {1, "Lokesh", "Gupta"});
- data.put("4", new Object[] {4, "John", "Adwards"});
- data.put("5", new Object[] {2, "Brian", "Schultz"});
-
- Set<String> keyset = data.keySet();
- int rownum = 1;
- for (String key : keyset)
- {
- final Row row;
- if(createRow) {
- row = sheet.createRow(rownum++);
- } else {
- row = sheet.getRow(rownum++);
- }
- assertNotNull(row);
-
- Object [] objArr = data.get(key);
- int cellnum = 0;
- for (Object obj : objArr)
- {
- Cell cell = row.getCell(cellnum);
- if(cell == null){
- cell = row.createCell(cellnum);
- } else {
- if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
- cell.setCellFormula(null);
- cell.getCellStyle().setDataFormat((short) 0);
- }
- }
- if(obj instanceof String) {
- cell.setCellValue((String)obj);
- } else if(obj instanceof Integer) {
- cell.setCellValue((Integer)obj);
- }
- cellnum++;
- }
- }
-
- XSSFFormulaEvaluator.evaluateAllFormulaCells((XSSFWorkbook) wb);
- wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
-
- CalculationChain chain = ((XSSFWorkbook)wb).getCalculationChain();
- CTCalcCell[] cArray = chain.getCTCalcChain().getCArray();
- for(CTCalcCell calc : cArray) {
- // A2 to A6 should be gone
- assertFalse(calc.getR().equals("A2"));
- assertFalse(calc.getR().equals("A3"));
- assertFalse(calc.getR().equals("A4"));
- assertFalse(calc.getR().equals("A5"));
- assertFalse(calc.getR().equals("A6"));
- }
-
- /*FileOutputStream out = new FileOutputStream(new File("C:\\temp\\56574.xlsx"));
- try {
- wb.write(out);
- } finally {
- out.close();
- }*/
-
- Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- Sheet sheetBack = wbBack.getSheet("Func");
- assertNotNull(sheetBack);
-
- chain = ((XSSFWorkbook)wbBack).getCalculationChain();
- cArray = chain.getCTCalcChain().getCArray();
- for(CTCalcCell calc : cArray) {
- // A2 to A6 should be gone
- assertFalse(calc.getR().equals("A2"));
- assertFalse(calc.getR().equals("A3"));
- assertFalse(calc.getR().equals("A4"));
- assertFalse(calc.getR().equals("A5"));
- assertFalse(calc.getR().equals("A6"));
- }
-
- wb.close();
- }
-
- /**
- * Excel 2007 generated Macro-Enabled .xlsm file
- */
- @Test
- public void bug57181() throws Exception {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57181.xlsm");
- assertEquals(9, wb.getNumberOfSheets());
- }
- }
|