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.

TestHSSFWorkbook.java 41KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  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.hssf.usermodel;
  16. import static org.junit.Assert.assertEquals;
  17. import static org.junit.Assert.assertFalse;
  18. import static org.junit.Assert.assertNotNull;
  19. import static org.junit.Assert.assertNull;
  20. import static org.junit.Assert.assertTrue;
  21. import static org.junit.Assert.fail;
  22. import static org.apache.poi.POITestCase.assertContains;
  23. import java.io.ByteArrayInputStream;
  24. import java.io.ByteArrayOutputStream;
  25. import java.io.File;
  26. import java.io.FileInputStream;
  27. import java.io.FileNotFoundException;
  28. import java.io.FileOutputStream;
  29. import java.io.IOException;
  30. import java.io.InputStream;
  31. import java.util.List;
  32. import junit.framework.AssertionFailedError;
  33. import org.apache.poi.POIDataSamples;
  34. import org.apache.poi.ddf.EscherBSERecord;
  35. import org.apache.poi.hpsf.ClassID;
  36. import org.apache.poi.hssf.HSSFITestDataProvider;
  37. import org.apache.poi.hssf.HSSFTestDataSamples;
  38. import org.apache.poi.hssf.OldExcelFormatException;
  39. import org.apache.poi.hssf.model.HSSFFormulaParser;
  40. import org.apache.poi.hssf.model.InternalSheet;
  41. import org.apache.poi.hssf.model.InternalWorkbook;
  42. import org.apache.poi.hssf.record.CFRuleRecord;
  43. import org.apache.poi.hssf.record.NameRecord;
  44. import org.apache.poi.hssf.record.Record;
  45. import org.apache.poi.hssf.record.RecordBase;
  46. import org.apache.poi.hssf.record.RecordFormatException;
  47. import org.apache.poi.hssf.record.WindowOneRecord;
  48. import org.apache.poi.poifs.filesystem.DirectoryEntry;
  49. import org.apache.poi.poifs.filesystem.DirectoryNode;
  50. import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
  51. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  52. import org.apache.poi.ss.formula.ptg.Area3DPtg;
  53. import org.apache.poi.ss.usermodel.BaseTestWorkbook;
  54. import org.apache.poi.ss.usermodel.Name;
  55. import org.apache.poi.ss.util.CellRangeAddress;
  56. import org.apache.poi.util.LittleEndian;
  57. import org.apache.poi.util.TempFile;
  58. import org.junit.Test;
  59. /**
  60. * Tests for {@link HSSFWorkbook}
  61. */
  62. public final class TestHSSFWorkbook extends BaseTestWorkbook {
  63. public TestHSSFWorkbook() {
  64. super(HSSFITestDataProvider.instance);
  65. }
  66. /**
  67. * gives test code access to the {@link InternalWorkbook} within {@link HSSFWorkbook}
  68. */
  69. public static InternalWorkbook getInternalWorkbook(HSSFWorkbook wb) {
  70. return wb.getWorkbook();
  71. }
  72. @Test
  73. public void windowOneDefaults() {
  74. HSSFWorkbook b = new HSSFWorkbook( );
  75. try {
  76. assertEquals(b.getActiveSheetIndex(), 0);
  77. assertEquals(b.getFirstVisibleTab(), 0);
  78. } catch (NullPointerException npe) {
  79. fail("WindowOneRecord in Workbook is probably not initialized");
  80. }
  81. }
  82. /**
  83. * Tests for {@link HSSFWorkbook#isHidden()} etc
  84. */
  85. @Test
  86. public void hidden() {
  87. HSSFWorkbook wb = new HSSFWorkbook();
  88. WindowOneRecord w1 = wb.getWorkbook().getWindowOne();
  89. assertEquals(false, wb.isHidden());
  90. assertEquals(false, w1.getHidden());
  91. wb.setHidden(true);
  92. assertEquals(true, wb.isHidden());
  93. assertEquals(true, w1.getHidden());
  94. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  95. w1 = wb.getWorkbook().getWindowOne();
  96. wb.setHidden(true);
  97. assertEquals(true, wb.isHidden());
  98. assertEquals(true, w1.getHidden());
  99. wb.setHidden(false);
  100. assertEquals(false, wb.isHidden());
  101. assertEquals(false, w1.getHidden());
  102. }
  103. @Test
  104. public void sheetClone() {
  105. // First up, try a simple file
  106. HSSFWorkbook b = new HSSFWorkbook();
  107. assertEquals(0, b.getNumberOfSheets());
  108. b.createSheet("Sheet One");
  109. b.createSheet("Sheet Two");
  110. assertEquals(2, b.getNumberOfSheets());
  111. b.cloneSheet(0);
  112. assertEquals(3, b.getNumberOfSheets());
  113. // Now try a problem one with drawing records in it
  114. b = HSSFTestDataSamples.openSampleWorkbook("SheetWithDrawing.xls");
  115. assertEquals(1, b.getNumberOfSheets());
  116. b.cloneSheet(0);
  117. assertEquals(2, b.getNumberOfSheets());
  118. }
  119. @Test
  120. public void readWriteWithCharts() {
  121. HSSFWorkbook b;
  122. HSSFSheet s;
  123. // Single chart, two sheets
  124. b = HSSFTestDataSamples.openSampleWorkbook("44010-SingleChart.xls");
  125. assertEquals(2, b.getNumberOfSheets());
  126. assertEquals("Graph2", b.getSheetName(1));
  127. s = b.getSheetAt(1);
  128. assertEquals(0, s.getFirstRowNum());
  129. assertEquals(8, s.getLastRowNum());
  130. // Has chart on 1st sheet??
  131. // FIXME
  132. assertNotNull(b.getSheetAt(0).getDrawingPatriarch());
  133. assertNull(b.getSheetAt(1).getDrawingPatriarch());
  134. assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart());
  135. // We've now called getDrawingPatriarch() so
  136. // everything will be all screwy
  137. // So, start again
  138. b = HSSFTestDataSamples.openSampleWorkbook("44010-SingleChart.xls");
  139. b = HSSFTestDataSamples.writeOutAndReadBack(b);
  140. assertEquals(2, b.getNumberOfSheets());
  141. s = b.getSheetAt(1);
  142. assertEquals(0, s.getFirstRowNum());
  143. assertEquals(8, s.getLastRowNum());
  144. // Two charts, three sheets
  145. b = HSSFTestDataSamples.openSampleWorkbook("44010-TwoCharts.xls");
  146. assertEquals(3, b.getNumberOfSheets());
  147. s = b.getSheetAt(1);
  148. assertEquals(0, s.getFirstRowNum());
  149. assertEquals(8, s.getLastRowNum());
  150. s = b.getSheetAt(2);
  151. assertEquals(0, s.getFirstRowNum());
  152. assertEquals(8, s.getLastRowNum());
  153. // Has chart on 1st sheet??
  154. // FIXME
  155. assertNotNull(b.getSheetAt(0).getDrawingPatriarch());
  156. assertNull(b.getSheetAt(1).getDrawingPatriarch());
  157. assertNull(b.getSheetAt(2).getDrawingPatriarch());
  158. assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart());
  159. // We've now called getDrawingPatriarch() so
  160. // everything will be all screwy
  161. // So, start again
  162. b = HSSFTestDataSamples.openSampleWorkbook("44010-TwoCharts.xls");
  163. b = HSSFTestDataSamples.writeOutAndReadBack(b);
  164. assertEquals(3, b.getNumberOfSheets());
  165. s = b.getSheetAt(1);
  166. assertEquals(0, s.getFirstRowNum());
  167. assertEquals(8, s.getLastRowNum());
  168. s = b.getSheetAt(2);
  169. assertEquals(0, s.getFirstRowNum());
  170. assertEquals(8, s.getLastRowNum());
  171. }
  172. @SuppressWarnings("deprecation")
  173. @Test
  174. public void selectedSheet_bug44523() {
  175. HSSFWorkbook wb=new HSSFWorkbook();
  176. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  177. HSSFSheet sheet2 = wb.createSheet("Sheet2");
  178. HSSFSheet sheet3 = wb.createSheet("Sheet3");
  179. HSSFSheet sheet4 = wb.createSheet("Sheet4");
  180. confirmActiveSelected(sheet1, true);
  181. confirmActiveSelected(sheet2, false);
  182. confirmActiveSelected(sheet3, false);
  183. confirmActiveSelected(sheet4, false);
  184. wb.setSelectedTab(1);
  185. // see Javadoc, in this case selected means "active"
  186. assertEquals(wb.getActiveSheetIndex(), wb.getSelectedTab());
  187. // Demonstrate bug 44525:
  188. // Well... not quite, since isActive + isSelected were also added in the same bug fix
  189. if (sheet1.isSelected()) {
  190. throw new AssertionFailedError("Identified bug 44523 a");
  191. }
  192. wb.setActiveSheet(1);
  193. if (sheet1.isActive()) {
  194. throw new AssertionFailedError("Identified bug 44523 b");
  195. }
  196. confirmActiveSelected(sheet1, false);
  197. confirmActiveSelected(sheet2, true);
  198. confirmActiveSelected(sheet3, false);
  199. confirmActiveSelected(sheet4, false);
  200. }
  201. @SuppressWarnings("unused")
  202. @Test
  203. public void selectMultiple() {
  204. HSSFWorkbook wb=new HSSFWorkbook();
  205. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  206. HSSFSheet sheet2 = wb.createSheet("Sheet2");
  207. HSSFSheet sheet3 = wb.createSheet("Sheet3");
  208. HSSFSheet sheet4 = wb.createSheet("Sheet4");
  209. HSSFSheet sheet5 = wb.createSheet("Sheet5");
  210. HSSFSheet sheet6 = wb.createSheet("Sheet6");
  211. wb.setSelectedTabs(new int[] { 0, 2, 3});
  212. assertEquals(true, sheet1.isSelected());
  213. assertEquals(false, sheet2.isSelected());
  214. assertEquals(true, sheet3.isSelected());
  215. assertEquals(true, sheet4.isSelected());
  216. assertEquals(false, sheet5.isSelected());
  217. assertEquals(false, sheet6.isSelected());
  218. wb.setSelectedTabs(new int[] { 1, 3, 5});
  219. assertEquals(false, sheet1.isSelected());
  220. assertEquals(true, sheet2.isSelected());
  221. assertEquals(false, sheet3.isSelected());
  222. assertEquals(true, sheet4.isSelected());
  223. assertEquals(false, sheet5.isSelected());
  224. assertEquals(true, sheet6.isSelected());
  225. assertEquals(true, sheet1.isActive());
  226. assertEquals(false, sheet2.isActive());
  227. assertEquals(true, sheet1.isActive());
  228. assertEquals(false, sheet3.isActive());
  229. wb.setActiveSheet(2);
  230. assertEquals(false, sheet1.isActive());
  231. assertEquals(true, sheet3.isActive());
  232. if (false) { // helpful if viewing this workbook in excel:
  233. sheet1.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet1"));
  234. sheet2.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet2"));
  235. sheet3.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet3"));
  236. sheet4.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet4"));
  237. try {
  238. File fOut = TempFile.createTempFile("sheetMultiSelect", ".xls");
  239. FileOutputStream os = new FileOutputStream(fOut);
  240. wb.write(os);
  241. os.close();
  242. } catch (IOException e) {
  243. throw new RuntimeException(e);
  244. }
  245. }
  246. }
  247. @Test
  248. public void activeSheetAfterDelete_bug40414() {
  249. HSSFWorkbook wb=new HSSFWorkbook();
  250. HSSFSheet sheet0 = wb.createSheet("Sheet0");
  251. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  252. HSSFSheet sheet2 = wb.createSheet("Sheet2");
  253. HSSFSheet sheet3 = wb.createSheet("Sheet3");
  254. HSSFSheet sheet4 = wb.createSheet("Sheet4");
  255. // confirm default activation/selection
  256. confirmActiveSelected(sheet0, true);
  257. confirmActiveSelected(sheet1, false);
  258. confirmActiveSelected(sheet2, false);
  259. confirmActiveSelected(sheet3, false);
  260. confirmActiveSelected(sheet4, false);
  261. wb.setActiveSheet(3);
  262. wb.setSelectedTab(3);
  263. confirmActiveSelected(sheet0, false);
  264. confirmActiveSelected(sheet1, false);
  265. confirmActiveSelected(sheet2, false);
  266. confirmActiveSelected(sheet3, true);
  267. confirmActiveSelected(sheet4, false);
  268. wb.removeSheetAt(3);
  269. // after removing the only active/selected sheet, another should be active/selected in its place
  270. if (!sheet4.isSelected()) {
  271. throw new AssertionFailedError("identified bug 40414 a");
  272. }
  273. if (!sheet4.isActive()) {
  274. throw new AssertionFailedError("identified bug 40414 b");
  275. }
  276. confirmActiveSelected(sheet0, false);
  277. confirmActiveSelected(sheet1, false);
  278. confirmActiveSelected(sheet2, false);
  279. confirmActiveSelected(sheet4, true);
  280. sheet3 = sheet4; // re-align local vars in this test case
  281. // Some more cases of removing sheets
  282. // Starting with a multiple selection, and different active sheet
  283. wb.setSelectedTabs(new int[] { 1, 3, });
  284. wb.setActiveSheet(2);
  285. confirmActiveSelected(sheet0, false, false);
  286. confirmActiveSelected(sheet1, false, true);
  287. confirmActiveSelected(sheet2, true, false);
  288. confirmActiveSelected(sheet3, false, true);
  289. // removing a sheet that is not active, and not the only selected sheet
  290. wb.removeSheetAt(3);
  291. confirmActiveSelected(sheet0, false, false);
  292. confirmActiveSelected(sheet1, false, true);
  293. confirmActiveSelected(sheet2, true, false);
  294. // removing the only selected sheet
  295. wb.removeSheetAt(1);
  296. confirmActiveSelected(sheet0, false, false);
  297. confirmActiveSelected(sheet2, true, true);
  298. // The last remaining sheet should always be active+selected
  299. wb.removeSheetAt(1);
  300. confirmActiveSelected(sheet0, true, true);
  301. }
  302. private static void confirmActiveSelected(HSSFSheet sheet, boolean expected) {
  303. confirmActiveSelected(sheet, expected, expected);
  304. }
  305. private static void confirmActiveSelected(HSSFSheet sheet,
  306. boolean expectedActive, boolean expectedSelected) {
  307. assertEquals("active", expectedActive, sheet.isActive());
  308. assertEquals("selected", expectedSelected, sheet.isSelected());
  309. }
  310. /**
  311. * If Sheet.getSize() returns a different result to Sheet.serialize(), this will cause the BOF
  312. * records to be written with invalid offset indexes. Excel does not like this, and such
  313. * errors are particularly hard to track down. This test ensures that HSSFWorkbook throws
  314. * a specific exception as soon as the situation is detected. See bugzilla 45066
  315. */
  316. @Test
  317. public void sheetSerializeSizeMismatch_bug45066() {
  318. HSSFWorkbook wb = new HSSFWorkbook();
  319. InternalSheet sheet = wb.createSheet("Sheet1").getSheet();
  320. List<RecordBase> sheetRecords = sheet.getRecords();
  321. // one way (of many) to cause the discrepancy is with a badly behaved record:
  322. sheetRecords.add(new BadlyBehavedRecord());
  323. // There is also much logic inside Sheet that (if buggy) might also cause the discrepancy
  324. try {
  325. wb.getBytes();
  326. throw new AssertionFailedError("Identified bug 45066 a");
  327. } catch (IllegalStateException e) {
  328. // Expected badly behaved sheet record to cause exception
  329. assertTrue(e.getMessage().startsWith("Actual serialized sheet size"));
  330. }
  331. }
  332. /**
  333. * Checks that us and HSSFName play nicely with named ranges
  334. * that point to deleted sheets
  335. */
  336. @Test
  337. public void namesToDeleteSheets() {
  338. HSSFWorkbook b = HSSFTestDataSamples.openSampleWorkbook("30978-deleted.xls");
  339. assertEquals(3, b.getNumberOfNames());
  340. // Sheet 2 is deleted
  341. assertEquals("Sheet1", b.getSheetName(0));
  342. assertEquals("Sheet3", b.getSheetName(1));
  343. Area3DPtg ptg;
  344. NameRecord nr;
  345. HSSFName n;
  346. /* ======= Name pointing to deleted sheet ====== */
  347. // First at low level
  348. nr = b.getWorkbook().getNameRecord(0);
  349. assertEquals("On2", nr.getNameText());
  350. assertEquals(0, nr.getSheetNumber());
  351. assertEquals(1, nr.getExternSheetNumber());
  352. assertEquals(1, nr.getNameDefinition().length);
  353. ptg = (Area3DPtg)nr.getNameDefinition()[0];
  354. assertEquals(1, ptg.getExternSheetIndex());
  355. assertEquals(0, ptg.getFirstColumn());
  356. assertEquals(0, ptg.getFirstRow());
  357. assertEquals(0, ptg.getLastColumn());
  358. assertEquals(2, ptg.getLastRow());
  359. // Now at high level
  360. n = b.getNameAt(0);
  361. assertEquals("On2", n.getNameName());
  362. assertEquals("", n.getSheetName());
  363. assertEquals("#REF!$A$1:$A$3", n.getRefersToFormula());
  364. /* ======= Name pointing to 1st sheet ====== */
  365. // First at low level
  366. nr = b.getWorkbook().getNameRecord(1);
  367. assertEquals("OnOne", nr.getNameText());
  368. assertEquals(0, nr.getSheetNumber());
  369. assertEquals(0, nr.getExternSheetNumber());
  370. assertEquals(1, nr.getNameDefinition().length);
  371. ptg = (Area3DPtg)nr.getNameDefinition()[0];
  372. assertEquals(0, ptg.getExternSheetIndex());
  373. assertEquals(0, ptg.getFirstColumn());
  374. assertEquals(2, ptg.getFirstRow());
  375. assertEquals(0, ptg.getLastColumn());
  376. assertEquals(3, ptg.getLastRow());
  377. // Now at high level
  378. n = b.getNameAt(1);
  379. assertEquals("OnOne", n.getNameName());
  380. assertEquals("Sheet1", n.getSheetName());
  381. assertEquals("Sheet1!$A$3:$A$4", n.getRefersToFormula());
  382. /* ======= Name pointing to 3rd sheet ====== */
  383. // First at low level
  384. nr = b.getWorkbook().getNameRecord(2);
  385. assertEquals("OnSheet3", nr.getNameText());
  386. assertEquals(0, nr.getSheetNumber());
  387. assertEquals(2, nr.getExternSheetNumber());
  388. assertEquals(1, nr.getNameDefinition().length);
  389. ptg = (Area3DPtg)nr.getNameDefinition()[0];
  390. assertEquals(2, ptg.getExternSheetIndex());
  391. assertEquals(0, ptg.getFirstColumn());
  392. assertEquals(0, ptg.getFirstRow());
  393. assertEquals(0, ptg.getLastColumn());
  394. assertEquals(1, ptg.getLastRow());
  395. // Now at high level
  396. n = b.getNameAt(2);
  397. assertEquals("OnSheet3", n.getNameName());
  398. assertEquals("Sheet3", n.getSheetName());
  399. assertEquals("Sheet3!$A$1:$A$2", n.getRefersToFormula());
  400. }
  401. /**
  402. * result returned by getRecordSize() differs from result returned by serialize()
  403. */
  404. private static final class BadlyBehavedRecord extends Record {
  405. public BadlyBehavedRecord() {
  406. //
  407. }
  408. @Override
  409. public short getSid() {
  410. return 0x777;
  411. }
  412. @Override
  413. public int serialize(int offset, byte[] data) {
  414. return 4;
  415. }
  416. @Override
  417. public int getRecordSize() {
  418. return 8;
  419. }
  420. }
  421. /**
  422. * The sample file provided with bug 45582 seems to have one extra byte after the EOFRecord
  423. */
  424. @Test
  425. public void extraDataAfterEOFRecord() {
  426. try {
  427. HSSFTestDataSamples.openSampleWorkbook("ex45582-22397.xls");
  428. } catch (RecordFormatException e) {
  429. if (e.getCause() instanceof LittleEndian.BufferUnderrunException) {
  430. throw new AssertionFailedError("Identified bug 45582");
  431. }
  432. }
  433. }
  434. /**
  435. * Test to make sure that NameRecord.getSheetNumber() is interpreted as a
  436. * 1-based sheet tab index (not a 1-based extern sheet index)
  437. */
  438. @Test
  439. public void findBuiltInNameRecord() {
  440. // testRRaC has multiple (3) built-in name records
  441. // The second print titles name record has getSheetNumber()==4
  442. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("testRRaC.xls");
  443. NameRecord nr;
  444. assertEquals(3, wb.getWorkbook().getNumNames());
  445. nr = wb.getWorkbook().getNameRecord(2);
  446. // TODO - render full row and full column refs properly
  447. assertEquals("Sheet2!$A$1:$IV$1", HSSFFormulaParser.toFormulaString(wb, nr.getNameDefinition())); // 1:1
  448. try {
  449. wb.getSheetAt(3).setRepeatingRows(CellRangeAddress.valueOf("9:12"));
  450. wb.getSheetAt(3).setRepeatingColumns(CellRangeAddress.valueOf("E:F"));
  451. } catch (RuntimeException e) {
  452. if (e.getMessage().equals("Builtin (7) already exists for sheet (4)")) {
  453. // there was a problem in the code which locates the existing print titles name record
  454. throw new RuntimeException("Identified bug 45720b");
  455. }
  456. throw e;
  457. }
  458. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  459. assertEquals(3, wb.getWorkbook().getNumNames());
  460. nr = wb.getWorkbook().getNameRecord(2);
  461. assertEquals("Sheet2!E:F,Sheet2!$A$9:$IV$12", HSSFFormulaParser.toFormulaString(wb, nr.getNameDefinition())); // E:F,9:12
  462. }
  463. /**
  464. * Test that the storage clsid property is preserved
  465. */
  466. @Test
  467. public void bug47920() throws IOException {
  468. POIFSFileSystem fs1 = new POIFSFileSystem(POIDataSamples.getSpreadSheetInstance().openResourceAsStream("47920.xls"));
  469. HSSFWorkbook wb = new HSSFWorkbook(fs1);
  470. ClassID clsid1 = fs1.getRoot().getStorageClsid();
  471. ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
  472. wb.write(out);
  473. byte[] bytes = out.toByteArray();
  474. POIFSFileSystem fs2 = new POIFSFileSystem(new ByteArrayInputStream(bytes));
  475. ClassID clsid2 = fs2.getRoot().getStorageClsid();
  476. assertTrue(clsid1.equals(clsid2));
  477. }
  478. /**
  479. * If we try to open an old (pre-97) workbook, we get a helpful
  480. * Exception give to explain what we've done wrong
  481. */
  482. @Test
  483. public void helpfulExceptionOnOldFiles() throws Exception {
  484. InputStream excel4 = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("testEXCEL_4.xls");
  485. try {
  486. new HSSFWorkbook(excel4);
  487. fail("Shouldn't be able to load an Excel 4 file");
  488. } catch (OldExcelFormatException e) {
  489. assertContains(e.getMessage(), "BIFF4");
  490. }
  491. excel4.close();
  492. InputStream excel5 = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("testEXCEL_5.xls");
  493. try {
  494. new HSSFWorkbook(excel5);
  495. fail("Shouldn't be able to load an Excel 5 file");
  496. } catch (OldExcelFormatException e) {
  497. assertContains(e.getMessage(), "BIFF5");
  498. }
  499. excel5.close();
  500. InputStream excel95 = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("testEXCEL_95.xls");
  501. try {
  502. new HSSFWorkbook(excel95);
  503. fail("Shouldn't be able to load an Excel 95 file");
  504. } catch (OldExcelFormatException e) {
  505. assertContains(e.getMessage(), "BIFF5");
  506. }
  507. excel95.close();
  508. }
  509. /**
  510. * Tests that we can work with both {@link POIFSFileSystem}
  511. * and {@link NPOIFSFileSystem}
  512. */
  513. @Test
  514. public void differentPOIFS() throws Exception {
  515. // Open the two filesystems
  516. DirectoryNode[] files = new DirectoryNode[2];
  517. files[0] = (new POIFSFileSystem(HSSFTestDataSamples.openSampleFileStream("Simple.xls"))).getRoot();
  518. NPOIFSFileSystem npoifsFileSystem = new NPOIFSFileSystem(HSSFTestDataSamples.getSampleFile("Simple.xls"));
  519. try {
  520. files[1] = npoifsFileSystem.getRoot();
  521. // Open without preserving nodes
  522. for(DirectoryNode dir : files) {
  523. HSSFWorkbook workbook = new HSSFWorkbook(dir, false);
  524. HSSFSheet sheet = workbook.getSheetAt(0);
  525. HSSFCell cell = sheet.getRow(0).getCell(0);
  526. assertEquals("replaceMe", cell .getRichStringCellValue().getString());
  527. }
  528. // Now re-check with preserving
  529. for(DirectoryNode dir : files) {
  530. HSSFWorkbook workbook = new HSSFWorkbook(dir, true);
  531. HSSFSheet sheet = workbook.getSheetAt(0);
  532. HSSFCell cell = sheet.getRow(0).getCell(0);
  533. assertEquals("replaceMe", cell .getRichStringCellValue().getString());
  534. }
  535. } finally {
  536. npoifsFileSystem.close();
  537. }
  538. }
  539. @Test
  540. public void wordDocEmbeddedInXls() throws IOException {
  541. // Open the two filesystems
  542. DirectoryNode[] files = new DirectoryNode[2];
  543. files[0] = (new POIFSFileSystem(HSSFTestDataSamples.openSampleFileStream("WithEmbeddedObjects.xls"))).getRoot();
  544. NPOIFSFileSystem npoifsFileSystem = new NPOIFSFileSystem(HSSFTestDataSamples.getSampleFile("WithEmbeddedObjects.xls"));
  545. try {
  546. files[1] = npoifsFileSystem.getRoot();
  547. // Check the embedded parts
  548. for(DirectoryNode root : files) {
  549. HSSFWorkbook hw = new HSSFWorkbook(root, true);
  550. List<HSSFObjectData> objects = hw.getAllEmbeddedObjects();
  551. boolean found = false;
  552. for (int i = 0; i < objects.size(); i++) {
  553. HSSFObjectData embeddedObject = objects.get(i);
  554. if (embeddedObject.hasDirectoryEntry()) {
  555. DirectoryEntry dir = embeddedObject.getDirectory();
  556. if (dir instanceof DirectoryNode) {
  557. DirectoryNode dNode = (DirectoryNode)dir;
  558. if (hasEntry(dNode,"WordDocument")) {
  559. found = true;
  560. }
  561. }
  562. }
  563. }
  564. assertTrue(found);
  565. }
  566. } finally {
  567. npoifsFileSystem.close();
  568. }
  569. }
  570. /**
  571. * Checks that we can open a workbook with NPOIFS, and write it out
  572. * again (via POIFS) and have it be valid
  573. * @throws IOException
  574. */
  575. @Test
  576. public void writeWorkbookFromNPOIFS() throws IOException {
  577. InputStream is = HSSFTestDataSamples.openSampleFileStream("WithEmbeddedObjects.xls");
  578. try {
  579. NPOIFSFileSystem fs = new NPOIFSFileSystem(is);
  580. try {
  581. // Start as NPOIFS
  582. HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
  583. assertEquals(3, wb.getNumberOfSheets());
  584. assertEquals("Root xls", wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
  585. // Will switch to POIFS
  586. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  587. assertEquals(3, wb.getNumberOfSheets());
  588. assertEquals("Root xls", wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
  589. } finally {
  590. fs.close();
  591. }
  592. } finally {
  593. is.close();
  594. }
  595. }
  596. @Test
  597. public void cellStylesLimit() {
  598. HSSFWorkbook wb = new HSSFWorkbook();
  599. int numBuiltInStyles = wb.getNumCellStyles();
  600. int MAX_STYLES = 4030;
  601. int limit = MAX_STYLES - numBuiltInStyles;
  602. for(int i=0; i < limit; i++){
  603. /* HSSFCellStyle style =*/ wb.createCellStyle();
  604. }
  605. assertEquals(MAX_STYLES, wb.getNumCellStyles());
  606. try {
  607. /*HSSFCellStyle style =*/ wb.createCellStyle();
  608. fail("expected exception");
  609. } catch (IllegalStateException e){
  610. assertEquals("The maximum number of cell styles was exceeded. " +
  611. "You can define up to 4000 styles in a .xls workbook", e.getMessage());
  612. }
  613. assertEquals(MAX_STYLES, wb.getNumCellStyles());
  614. }
  615. @Test
  616. public void setSheetOrderHSSF(){
  617. HSSFWorkbook wb = new HSSFWorkbook();
  618. HSSFSheet s1 = wb.createSheet("first sheet");
  619. HSSFSheet s2 = wb.createSheet("other sheet");
  620. HSSFName name1 = wb.createName();
  621. name1.setNameName("name1");
  622. name1.setRefersToFormula("'first sheet'!D1");
  623. HSSFName name2 = wb.createName();
  624. name2.setNameName("name2");
  625. name2.setRefersToFormula("'other sheet'!C1");
  626. HSSFRow s1r1 = s1.createRow(2);
  627. HSSFCell c1 = s1r1.createCell(3);
  628. c1.setCellValue(30);
  629. HSSFCell c2 = s1r1.createCell(2);
  630. c2.setCellFormula("SUM('other sheet'!C1,'first sheet'!C1)");
  631. HSSFRow s2r1 = s2.createRow(0);
  632. HSSFCell c3 = s2r1.createCell(1);
  633. c3.setCellFormula("'first sheet'!D3");
  634. HSSFCell c4 = s2r1.createCell(2);
  635. c4.setCellFormula("'other sheet'!D3");
  636. // conditional formatting
  637. HSSFSheetConditionalFormatting sheetCF = s1.getSheetConditionalFormatting();
  638. HSSFConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(
  639. CFRuleRecord.ComparisonOperator.BETWEEN, "'first sheet'!D1", "'other sheet'!D1");
  640. HSSFConditionalFormattingRule [] cfRules = { rule1 };
  641. CellRangeAddress[] regions = {
  642. new CellRangeAddress(2, 4, 0, 0), // A3:A5
  643. };
  644. sheetCF.addConditionalFormatting(regions, cfRules);
  645. wb.setSheetOrder("other sheet", 0);
  646. // names
  647. assertEquals("'first sheet'!D1", wb.getName("name1").getRefersToFormula());
  648. assertEquals("'other sheet'!C1", wb.getName("name2").getRefersToFormula());
  649. // cells
  650. assertEquals("SUM('other sheet'!C1,'first sheet'!C1)", c2.getCellFormula());
  651. assertEquals("'first sheet'!D3", c3.getCellFormula());
  652. assertEquals("'other sheet'!D3", c4.getCellFormula());
  653. // conditional formatting
  654. HSSFConditionalFormatting cf = sheetCF.getConditionalFormattingAt(0);
  655. assertEquals("'first sheet'!D1", cf.getRule(0).getFormula1());
  656. assertEquals("'other sheet'!D1", cf.getRule(0).getFormula2());
  657. }
  658. private boolean hasEntry(DirectoryNode dirNode, String entryName) {
  659. try {
  660. dirNode.getEntry(entryName);
  661. return true;
  662. } catch (FileNotFoundException e) {
  663. return false;
  664. }
  665. }
  666. @Test
  667. public void clonePictures() throws IOException {
  668. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("SimpleWithImages.xls");
  669. InternalWorkbook iwb = wb.getWorkbook();
  670. iwb.findDrawingGroup();
  671. for(int pictureIndex=1; pictureIndex <= 4; pictureIndex++){
  672. EscherBSERecord bse = iwb.getBSERecord(pictureIndex);
  673. assertEquals(1, bse.getRef());
  674. }
  675. wb.cloneSheet(0);
  676. for(int pictureIndex=1; pictureIndex <= 4; pictureIndex++){
  677. EscherBSERecord bse = iwb.getBSERecord(pictureIndex);
  678. assertEquals(2, bse.getRef());
  679. }
  680. wb.cloneSheet(0);
  681. for(int pictureIndex=1; pictureIndex <= 4; pictureIndex++){
  682. EscherBSERecord bse = iwb.getBSERecord(pictureIndex);
  683. assertEquals(3, bse.getRef());
  684. }
  685. }
  686. @Test
  687. public void changeSheetNameWithSharedFormulas() {
  688. changeSheetNameWithSharedFormulas("shared_formulas.xls");
  689. }
  690. @Test
  691. public void emptyDirectoryNode() throws IOException {
  692. try {
  693. assertNotNull(new HSSFWorkbook(new POIFSFileSystem()));
  694. fail("Should catch exception about invalid POIFSFileSystem");
  695. } catch (IllegalArgumentException e) {
  696. assertTrue(e.getMessage(), e.getMessage().contains("does not contain a BIFF8"));
  697. }
  698. }
  699. @SuppressWarnings("deprecation")
  700. @Test
  701. public void selectedSheetShort() {
  702. HSSFWorkbook wb=new HSSFWorkbook();
  703. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  704. HSSFSheet sheet2 = wb.createSheet("Sheet2");
  705. HSSFSheet sheet3 = wb.createSheet("Sheet3");
  706. HSSFSheet sheet4 = wb.createSheet("Sheet4");
  707. confirmActiveSelected(sheet1, true);
  708. confirmActiveSelected(sheet2, false);
  709. confirmActiveSelected(sheet3, false);
  710. confirmActiveSelected(sheet4, false);
  711. wb.setSelectedTab((short)1);
  712. // see Javadoc, in this case selected means "active"
  713. assertEquals(wb.getActiveSheetIndex(), wb.getSelectedTab());
  714. // Demonstrate bug 44525:
  715. // Well... not quite, since isActive + isSelected were also added in the same bug fix
  716. if (sheet1.isSelected()) {
  717. throw new AssertionFailedError("Identified bug 44523 a");
  718. }
  719. wb.setActiveSheet(1);
  720. if (sheet1.isActive()) {
  721. throw new AssertionFailedError("Identified bug 44523 b");
  722. }
  723. confirmActiveSelected(sheet1, false);
  724. confirmActiveSelected(sheet2, true);
  725. confirmActiveSelected(sheet3, false);
  726. confirmActiveSelected(sheet4, false);
  727. assertEquals(0, wb.getFirstVisibleTab());
  728. wb.setDisplayedTab((short)2);
  729. assertEquals(2, wb.getFirstVisibleTab());
  730. assertEquals(2, wb.getDisplayedTab());
  731. }
  732. @Test
  733. public void addSheetTwice() {
  734. HSSFWorkbook wb=new HSSFWorkbook();
  735. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  736. assertNotNull(sheet1);
  737. try {
  738. wb.createSheet("Sheet1");
  739. fail("Should fail if we add the same sheet twice");
  740. } catch (IllegalArgumentException e) {
  741. assertTrue(e.getMessage(), e.getMessage().contains("already contains a sheet of this name"));
  742. }
  743. }
  744. @Test
  745. public void getSheetIndex() {
  746. HSSFWorkbook wb=new HSSFWorkbook();
  747. HSSFSheet sheet1 = wb.createSheet("Sheet1");
  748. HSSFSheet sheet2 = wb.createSheet("Sheet2");
  749. HSSFSheet sheet3 = wb.createSheet("Sheet3");
  750. HSSFSheet sheet4 = wb.createSheet("Sheet4");
  751. assertEquals(0, wb.getSheetIndex(sheet1));
  752. assertEquals(1, wb.getSheetIndex(sheet2));
  753. assertEquals(2, wb.getSheetIndex(sheet3));
  754. assertEquals(3, wb.getSheetIndex(sheet4));
  755. // remove sheets
  756. wb.removeSheetAt(0);
  757. wb.removeSheetAt(2);
  758. // ensure that sheets are moved up and removed sheets are not found any more
  759. assertEquals(-1, wb.getSheetIndex(sheet1));
  760. assertEquals(0, wb.getSheetIndex(sheet2));
  761. assertEquals(1, wb.getSheetIndex(sheet3));
  762. assertEquals(-1, wb.getSheetIndex(sheet4));
  763. }
  764. @SuppressWarnings("deprecation")
  765. @Test
  766. public void getExternSheetIndex() {
  767. HSSFWorkbook wb=new HSSFWorkbook();
  768. wb.createSheet("Sheet1");
  769. wb.createSheet("Sheet2");
  770. assertEquals(0, wb.getExternalSheetIndex(0));
  771. assertEquals(1, wb.getExternalSheetIndex(1));
  772. assertEquals("Sheet1", wb.findSheetNameFromExternSheet(0));
  773. assertEquals("Sheet2", wb.findSheetNameFromExternSheet(1));
  774. //assertEquals(null, wb.findSheetNameFromExternSheet(2));
  775. assertEquals(0, wb.getSheetIndexFromExternSheetIndex(0));
  776. assertEquals(1, wb.getSheetIndexFromExternSheetIndex(1));
  777. assertEquals(-1, wb.getSheetIndexFromExternSheetIndex(2));
  778. assertEquals(-1, wb.getSheetIndexFromExternSheetIndex(100));
  779. }
  780. @SuppressWarnings("deprecation")
  781. @Test
  782. public void sstString() {
  783. HSSFWorkbook wb=new HSSFWorkbook();
  784. int sst = wb.addSSTString("somestring");
  785. assertEquals("somestring", wb.getSSTString(sst));
  786. //assertNull(wb.getSSTString(sst+1));
  787. }
  788. @Test
  789. public void names() {
  790. HSSFWorkbook wb=new HSSFWorkbook();
  791. try {
  792. wb.getNameAt(0);
  793. fail("Fails without any defined names");
  794. } catch (IllegalStateException e) {
  795. assertTrue(e.getMessage(), e.getMessage().contains("no defined names"));
  796. }
  797. HSSFName name = wb.createName();
  798. assertNotNull(name);
  799. assertNull(wb.getName("somename"));
  800. name.setNameName("myname");
  801. assertNotNull(wb.getName("myname"));
  802. assertEquals(0, wb.getNameIndex(name));
  803. assertEquals(0, wb.getNameIndex("myname"));
  804. try {
  805. wb.getNameAt(5);
  806. fail("Fails without any defined names");
  807. } catch (IllegalArgumentException e) {
  808. assertTrue(e.getMessage(), e.getMessage().contains("outside the allowable range"));
  809. }
  810. try {
  811. wb.getNameAt(-3);
  812. fail("Fails without any defined names");
  813. } catch (IllegalArgumentException e) {
  814. assertTrue(e.getMessage(), e.getMessage().contains("outside the allowable range"));
  815. }
  816. }
  817. @Test
  818. public void testMethods() {
  819. HSSFWorkbook wb=new HSSFWorkbook();
  820. wb.insertChartRecord();
  821. //wb.dumpDrawingGroupRecords(true);
  822. //wb.dumpDrawingGroupRecords(false);
  823. }
  824. @Test
  825. public void writeProtection() {
  826. HSSFWorkbook wb=new HSSFWorkbook();
  827. assertFalse(wb.isWriteProtected());
  828. wb.writeProtectWorkbook("mypassword", "myuser");
  829. assertTrue(wb.isWriteProtected());
  830. wb.unwriteProtectWorkbook();
  831. assertFalse(wb.isWriteProtected());
  832. }
  833. @Test
  834. public void bug50298() throws Exception {
  835. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("50298.xls");
  836. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  837. HSSFSheet sheet = wb.cloneSheet(0);
  838. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received", "Invoice (2)");
  839. wb.setSheetName(wb.getSheetIndex(sheet), "copy");
  840. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received", "copy");
  841. wb.setSheetOrder("copy", 0);
  842. assertSheetOrder(wb, "copy", "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  843. wb.removeSheetAt(0);
  844. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  845. // check that the overall workbook serializes with its correct size
  846. int expected = wb.getWorkbook().getSize();
  847. int written = wb.getWorkbook().serialize(0, new byte[expected*2]);
  848. assertEquals("Did not have the expected size when writing the workbook: written: " + written + ", but expected: " + expected,
  849. expected, written);
  850. HSSFWorkbook read = HSSFTestDataSamples.writeOutAndReadBack(wb);
  851. assertSheetOrder(read, "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  852. }
  853. @Test
  854. public void bug50298a() throws Exception {
  855. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("50298.xls");
  856. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  857. HSSFSheet sheet = wb.cloneSheet(0);
  858. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received", "Invoice (2)");
  859. wb.setSheetName(wb.getSheetIndex(sheet), "copy");
  860. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received", "copy");
  861. wb.setSheetOrder("copy", 0);
  862. assertSheetOrder(wb, "copy", "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  863. wb.removeSheetAt(0);
  864. assertSheetOrder(wb, "Invoice", "Invoice1", "Digest", "Deferred", "Received");
  865. wb.removeSheetAt(1);
  866. assertSheetOrder(wb, "Invoice", "Digest", "Deferred", "Received");
  867. wb.setSheetOrder("Digest", 3);
  868. assertSheetOrder(wb, "Invoice", "Deferred", "Received", "Digest");
  869. // check that the overall workbook serializes with its correct size
  870. int expected = wb.getWorkbook().getSize();
  871. int written = wb.getWorkbook().serialize(0, new byte[expected*2]);
  872. assertEquals("Did not have the expected size when writing the workbook: written: " + written + ", but expected: " + expected,
  873. expected, written);
  874. HSSFWorkbook read = HSSFTestDataSamples.writeOutAndReadBack(wb);
  875. assertSheetOrder(read, "Invoice", "Deferred", "Received", "Digest");
  876. }
  877. @Test
  878. public void bug54500() throws Exception {
  879. String nameName = "AName";
  880. String sheetName = "ASheet";
  881. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("54500.xls");
  882. assertSheetOrder(wb, "Sheet1", "Sheet2", "Sheet3");
  883. wb.createSheet(sheetName);
  884. assertSheetOrder(wb, "Sheet1", "Sheet2", "Sheet3", "ASheet");
  885. Name n = wb.createName();
  886. n.setNameName(nameName);
  887. n.setSheetIndex(3);
  888. n.setRefersToFormula(sheetName + "!A1");
  889. assertSheetOrder(wb, "Sheet1", "Sheet2", "Sheet3", "ASheet");
  890. assertEquals("ASheet!A1", wb.getName(nameName).getRefersToFormula());
  891. ByteArrayOutputStream stream = new ByteArrayOutputStream();
  892. wb.write(stream);
  893. assertSheetOrder(wb, "Sheet1", "Sheet2", "Sheet3", "ASheet");
  894. assertEquals("ASheet!A1", wb.getName(nameName).getRefersToFormula());
  895. wb.removeSheetAt(1);
  896. assertSheetOrder(wb, "Sheet1", "Sheet3", "ASheet");
  897. assertEquals("ASheet!A1", wb.getName(nameName).getRefersToFormula());
  898. ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
  899. wb.write(stream2);
  900. assertSheetOrder(wb, "Sheet1", "Sheet3", "ASheet");
  901. assertEquals("ASheet!A1", wb.getName(nameName).getRefersToFormula());
  902. expectName(
  903. new HSSFWorkbook(new ByteArrayInputStream(stream.toByteArray())),
  904. nameName, "ASheet!A1");
  905. expectName(
  906. new HSSFWorkbook(
  907. new ByteArrayInputStream(stream2.toByteArray())),
  908. nameName, "ASheet!A1");
  909. }
  910. private void expectName(HSSFWorkbook wb, String name, String expect) {
  911. assertEquals(expect, wb.getName(name).getRefersToFormula());
  912. }
  913. @Test
  914. public void test49423() throws Exception
  915. {
  916. HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook("49423.xls");
  917. boolean found = false;
  918. int numSheets = workbook.getNumberOfSheets();
  919. for (int i = 0; i < numSheets; i++) {
  920. HSSFSheet sheet = workbook.getSheetAt(i);
  921. List<HSSFShape> shapes = sheet.getDrawingPatriarch().getChildren();
  922. for(HSSFShape shape : shapes){
  923. HSSFAnchor anchor = shape.getAnchor();
  924. if(anchor instanceof HSSFClientAnchor){
  925. // absolute coordinates
  926. HSSFClientAnchor clientAnchor = (HSSFClientAnchor)anchor;
  927. assertNotNull(clientAnchor);
  928. //System.out.println(clientAnchor.getRow1() + "," + clientAnchor.getRow2());
  929. found = true;
  930. } else if (anchor instanceof HSSFChildAnchor){
  931. // shape is grouped and the anchor is expressed in the coordinate system of the group
  932. HSSFChildAnchor childAnchor = (HSSFChildAnchor)anchor;
  933. assertNotNull(childAnchor);
  934. //System.out.println(childAnchor.getDy1() + "," + childAnchor.getDy2());
  935. found = true;
  936. }
  937. }
  938. }
  939. assertTrue("Should find some images via Client or Child anchors, but did not find any at all", found);
  940. }
  941. }