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.

TestXSSFSheet.java 78KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.xssf.usermodel;
  16. import static org.apache.poi.xssf.XSSFTestDataSamples.openSampleWorkbook;
  17. import static org.apache.poi.xssf.XSSFTestDataSamples.writeOutAndReadBack;
  18. import static org.junit.Assert.assertEquals;
  19. import static org.junit.Assert.assertFalse;
  20. import static org.junit.Assert.assertNotNull;
  21. import static org.junit.Assert.assertNotSame;
  22. import static org.junit.Assert.assertNull;
  23. import static org.junit.Assert.assertSame;
  24. import static org.junit.Assert.assertTrue;
  25. import java.io.IOException;
  26. import java.util.Arrays;
  27. import java.util.Calendar;
  28. import java.util.Date;
  29. import java.util.GregorianCalendar;
  30. import java.util.HashSet;
  31. import java.util.List;
  32. import java.util.Set;
  33. import org.apache.poi.POIXMLException;
  34. import org.apache.poi.hssf.HSSFTestDataSamples;
  35. import org.apache.poi.poifs.crypt.CryptoFunctions;
  36. import org.apache.poi.poifs.crypt.HashAlgorithm;
  37. import org.apache.poi.ss.SpreadsheetVersion;
  38. import org.apache.poi.ss.usermodel.AutoFilter;
  39. import org.apache.poi.ss.usermodel.BaseTestSheet;
  40. import org.apache.poi.ss.usermodel.Cell;
  41. import org.apache.poi.ss.usermodel.CellCopyPolicy;
  42. import org.apache.poi.ss.usermodel.FormulaError;
  43. import org.apache.poi.ss.usermodel.Row;
  44. import org.apache.poi.ss.usermodel.Sheet;
  45. import org.apache.poi.ss.usermodel.Workbook;
  46. import org.apache.poi.ss.util.AreaReference;
  47. import org.apache.poi.ss.util.CellRangeAddress;
  48. import org.apache.poi.ss.util.CellReference;
  49. import org.apache.poi.ss.util.CellUtil;
  50. import org.apache.poi.xssf.XSSFITestDataProvider;
  51. import org.apache.poi.xssf.XSSFTestDataSamples;
  52. import org.apache.poi.xssf.model.CalculationChain;
  53. import org.apache.poi.xssf.model.CommentsTable;
  54. import org.apache.poi.xssf.model.StylesTable;
  55. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  56. import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
  57. import org.junit.Test;
  58. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcPr;
  59. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
  60. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
  61. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
  62. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments;
  63. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
  64. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
  65. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
  66. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
  67. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
  68. import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode;
  69. import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane;
  70. @SuppressWarnings("resource")
  71. public final class TestXSSFSheet extends BaseTestSheet {
  72. public TestXSSFSheet() {
  73. super(XSSFITestDataProvider.instance);
  74. }
  75. //TODO column styles are not yet supported by XSSF
  76. @Override
  77. @Test
  78. public void defaultColumnStyle() {
  79. //super.defaultColumnStyle();
  80. }
  81. @Test
  82. public void getSetMargin() throws IOException {
  83. baseTestGetSetMargin(new double[]{0.7, 0.7, 0.75, 0.75, 0.3, 0.3});
  84. }
  85. @Test
  86. public void existingHeaderFooter() throws IOException {
  87. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("45540_classic_Header.xlsx");
  88. XSSFOddHeader hdr;
  89. XSSFOddFooter ftr;
  90. // Sheet 1 has a header with center and right text
  91. XSSFSheet s1 = wb1.getSheetAt(0);
  92. assertNotNull(s1.getHeader());
  93. assertNotNull(s1.getFooter());
  94. hdr = (XSSFOddHeader) s1.getHeader();
  95. ftr = (XSSFOddFooter) s1.getFooter();
  96. assertEquals("&Ctestdoc&Rtest phrase", hdr.getText());
  97. assertEquals(null, ftr.getText());
  98. assertEquals("", hdr.getLeft());
  99. assertEquals("testdoc", hdr.getCenter());
  100. assertEquals("test phrase", hdr.getRight());
  101. assertEquals("", ftr.getLeft());
  102. assertEquals("", ftr.getCenter());
  103. assertEquals("", ftr.getRight());
  104. // Sheet 2 has a footer, but it's empty
  105. XSSFSheet s2 = wb1.getSheetAt(1);
  106. assertNotNull(s2.getHeader());
  107. assertNotNull(s2.getFooter());
  108. hdr = (XSSFOddHeader) s2.getHeader();
  109. ftr = (XSSFOddFooter) s2.getFooter();
  110. assertEquals(null, hdr.getText());
  111. assertEquals("&L&F", ftr.getText());
  112. assertEquals("", hdr.getLeft());
  113. assertEquals("", hdr.getCenter());
  114. assertEquals("", hdr.getRight());
  115. assertEquals("&F", ftr.getLeft());
  116. assertEquals("", ftr.getCenter());
  117. assertEquals("", ftr.getRight());
  118. // Save and reload
  119. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  120. wb1.close();
  121. hdr = (XSSFOddHeader) wb2.getSheetAt(0).getHeader();
  122. ftr = (XSSFOddFooter) wb2.getSheetAt(0).getFooter();
  123. assertEquals("", hdr.getLeft());
  124. assertEquals("testdoc", hdr.getCenter());
  125. assertEquals("test phrase", hdr.getRight());
  126. assertEquals("", ftr.getLeft());
  127. assertEquals("", ftr.getCenter());
  128. assertEquals("", ftr.getRight());
  129. wb2.close();
  130. }
  131. @Test
  132. public void getAllHeadersFooters() throws IOException {
  133. XSSFWorkbook workbook = new XSSFWorkbook();
  134. XSSFSheet sheet = workbook.createSheet("Sheet 1");
  135. assertNotNull(sheet.getOddFooter());
  136. assertNotNull(sheet.getEvenFooter());
  137. assertNotNull(sheet.getFirstFooter());
  138. assertNotNull(sheet.getOddHeader());
  139. assertNotNull(sheet.getEvenHeader());
  140. assertNotNull(sheet.getFirstHeader());
  141. assertEquals("", sheet.getOddFooter().getLeft());
  142. sheet.getOddFooter().setLeft("odd footer left");
  143. assertEquals("odd footer left", sheet.getOddFooter().getLeft());
  144. assertEquals("", sheet.getEvenFooter().getLeft());
  145. sheet.getEvenFooter().setLeft("even footer left");
  146. assertEquals("even footer left", sheet.getEvenFooter().getLeft());
  147. assertEquals("", sheet.getFirstFooter().getLeft());
  148. sheet.getFirstFooter().setLeft("first footer left");
  149. assertEquals("first footer left", sheet.getFirstFooter().getLeft());
  150. assertEquals("", sheet.getOddHeader().getLeft());
  151. sheet.getOddHeader().setLeft("odd header left");
  152. assertEquals("odd header left", sheet.getOddHeader().getLeft());
  153. assertEquals("", sheet.getOddHeader().getRight());
  154. sheet.getOddHeader().setRight("odd header right");
  155. assertEquals("odd header right", sheet.getOddHeader().getRight());
  156. assertEquals("", sheet.getOddHeader().getCenter());
  157. sheet.getOddHeader().setCenter("odd header center");
  158. assertEquals("odd header center", sheet.getOddHeader().getCenter());
  159. // Defaults are odd
  160. assertEquals("odd footer left", sheet.getFooter().getLeft());
  161. assertEquals("odd header center", sheet.getHeader().getCenter());
  162. workbook.close();
  163. }
  164. @Test
  165. public void autoSizeColumn() throws IOException {
  166. XSSFWorkbook workbook = new XSSFWorkbook();
  167. XSSFSheet sheet = workbook.createSheet("Sheet 1");
  168. sheet.createRow(0).createCell(13).setCellValue("test");
  169. sheet.autoSizeColumn(13);
  170. ColumnHelper columnHelper = sheet.getColumnHelper();
  171. CTCol col = columnHelper.getColumn(13, false);
  172. assertTrue(col.getBestFit());
  173. workbook.close();
  174. }
  175. @Test
  176. public void setCellComment() throws IOException {
  177. XSSFWorkbook workbook = new XSSFWorkbook();
  178. XSSFSheet sheet = workbook.createSheet();
  179. XSSFDrawing dg = sheet.createDrawingPatriarch();
  180. XSSFComment comment = dg.createCellComment(new XSSFClientAnchor());
  181. Cell cell = sheet.createRow(0).createCell(0);
  182. CommentsTable comments = sheet.getCommentsTable(false);
  183. CTComments ctComments = comments.getCTComments();
  184. cell.setCellComment(comment);
  185. assertEquals("A1", ctComments.getCommentList().getCommentArray(0).getRef());
  186. comment.setAuthor("test A1 author");
  187. assertEquals("test A1 author", comments.getAuthor((int) ctComments.getCommentList().getCommentArray(0).getAuthorId()));
  188. workbook.close();
  189. }
  190. @Test
  191. public void getActiveCell() throws IOException {
  192. XSSFWorkbook workbook = new XSSFWorkbook();
  193. XSSFSheet sheet = workbook.createSheet();
  194. sheet.setActiveCell("R5");
  195. assertEquals("R5", sheet.getActiveCell());
  196. workbook.close();
  197. }
  198. @Test
  199. public void createFreezePane_XSSF() throws IOException {
  200. XSSFWorkbook workbook = new XSSFWorkbook();
  201. XSSFSheet sheet = workbook.createSheet();
  202. CTWorksheet ctWorksheet = sheet.getCTWorksheet();
  203. sheet.createFreezePane(2, 4);
  204. assertEquals(2.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0);
  205. assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane());
  206. sheet.createFreezePane(3, 6, 10, 10);
  207. assertEquals(3.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0);
  208. // assertEquals(10, sheet.getTopRow());
  209. // assertEquals(10, sheet.getLeftCol());
  210. sheet.createSplitPane(4, 8, 12, 12, 1);
  211. assertEquals(8.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getYSplit(), 0.0);
  212. assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane());
  213. workbook.close();
  214. }
  215. @Test
  216. public void removeMergedRegion_lowlevel() throws IOException {
  217. XSSFWorkbook workbook = new XSSFWorkbook();
  218. XSSFSheet sheet = workbook.createSheet();
  219. CTWorksheet ctWorksheet = sheet.getCTWorksheet();
  220. CellRangeAddress region_1 = CellRangeAddress.valueOf("A1:B2");
  221. CellRangeAddress region_2 = CellRangeAddress.valueOf("C3:D4");
  222. CellRangeAddress region_3 = CellRangeAddress.valueOf("E5:F6");
  223. CellRangeAddress region_4 = CellRangeAddress.valueOf("G7:H8");
  224. sheet.addMergedRegion(region_1);
  225. sheet.addMergedRegion(region_2);
  226. sheet.addMergedRegion(region_3);
  227. assertEquals("C3:D4", ctWorksheet.getMergeCells().getMergeCellArray(1).getRef());
  228. assertEquals(3, sheet.getNumMergedRegions());
  229. sheet.removeMergedRegion(1);
  230. assertEquals("E5:F6", ctWorksheet.getMergeCells().getMergeCellArray(1).getRef());
  231. assertEquals(2, sheet.getNumMergedRegions());
  232. sheet.removeMergedRegion(1);
  233. sheet.removeMergedRegion(0);
  234. assertEquals(0, sheet.getNumMergedRegions());
  235. assertNull(" CTMergeCells should be deleted after removing the last merged " +
  236. "region on the sheet.", sheet.getCTWorksheet().getMergeCells());
  237. sheet.addMergedRegion(region_1);
  238. sheet.addMergedRegion(region_2);
  239. sheet.addMergedRegion(region_3);
  240. sheet.addMergedRegion(region_4);
  241. // test invalid indexes OOBE
  242. Set<Integer> rmIdx = new HashSet<Integer>(Arrays.asList(5,6));
  243. sheet.removeMergedRegions(rmIdx);
  244. rmIdx = new HashSet<Integer>(Arrays.asList(1,3));
  245. sheet.removeMergedRegions(rmIdx);
  246. assertEquals("A1:B2", ctWorksheet.getMergeCells().getMergeCellArray(0).getRef());
  247. assertEquals("E5:F6", ctWorksheet.getMergeCells().getMergeCellArray(1).getRef());
  248. workbook.close();
  249. }
  250. @Test
  251. public void setDefaultColumnStyle() throws IOException {
  252. XSSFWorkbook workbook = new XSSFWorkbook();
  253. XSSFSheet sheet = workbook.createSheet();
  254. CTWorksheet ctWorksheet = sheet.getCTWorksheet();
  255. StylesTable stylesTable = workbook.getStylesSource();
  256. XSSFFont font = new XSSFFont();
  257. font.setFontName("Cambria");
  258. stylesTable.putFont(font);
  259. CTXf cellStyleXf = CTXf.Factory.newInstance();
  260. cellStyleXf.setFontId(1);
  261. cellStyleXf.setFillId(0);
  262. cellStyleXf.setBorderId(0);
  263. cellStyleXf.setNumFmtId(0);
  264. stylesTable.putCellStyleXf(cellStyleXf);
  265. CTXf cellXf = CTXf.Factory.newInstance();
  266. cellXf.setXfId(1);
  267. stylesTable.putCellXf(cellXf);
  268. XSSFCellStyle cellStyle = new XSSFCellStyle(1, 1, stylesTable, null);
  269. assertEquals(1, cellStyle.getFontIndex());
  270. sheet.setDefaultColumnStyle(3, cellStyle);
  271. assertEquals(1, ctWorksheet.getColsArray(0).getColArray(0).getStyle());
  272. workbook.close();
  273. }
  274. @Test
  275. @SuppressWarnings("deprecation")
  276. public void groupUngroupColumn() throws IOException {
  277. XSSFWorkbook workbook = new XSSFWorkbook();
  278. XSSFSheet sheet = workbook.createSheet();
  279. //one level
  280. sheet.groupColumn(2, 7);
  281. sheet.groupColumn(10, 11);
  282. CTCols cols = sheet.getCTWorksheet().getColsArray(0);
  283. assertEquals(2, cols.sizeOfColArray());
  284. CTCol[] colArray = cols.getColArray();
  285. assertNotNull(colArray);
  286. assertEquals(2 + 1, colArray[0].getMin()); // 1 based
  287. assertEquals(7 + 1, colArray[0].getMax()); // 1 based
  288. assertEquals(1, colArray[0].getOutlineLevel());
  289. assertEquals(0, sheet.getColumnOutlineLevel(0));
  290. //two level
  291. sheet.groupColumn(1, 2);
  292. cols = sheet.getCTWorksheet().getColsArray(0);
  293. assertEquals(4, cols.sizeOfColArray());
  294. colArray = cols.getColArray();
  295. assertEquals(2, colArray[1].getOutlineLevel());
  296. //three level
  297. sheet.groupColumn(6, 8);
  298. sheet.groupColumn(2, 3);
  299. cols = sheet.getCTWorksheet().getColsArray(0);
  300. assertEquals(7, cols.sizeOfColArray());
  301. colArray = cols.getColArray();
  302. assertEquals(3, colArray[1].getOutlineLevel());
  303. assertEquals(3, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelCol());
  304. sheet.ungroupColumn(8, 10);
  305. colArray = cols.getColArray();
  306. //assertEquals(3, colArray[1].getOutlineLevel());
  307. sheet.ungroupColumn(4, 6);
  308. sheet.ungroupColumn(2, 2);
  309. colArray = cols.getColArray();
  310. assertEquals(4, colArray.length);
  311. assertEquals(2, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelCol());
  312. workbook.close();
  313. }
  314. @Test
  315. public void groupUngroupRow() throws IOException {
  316. XSSFWorkbook workbook = new XSSFWorkbook();
  317. XSSFSheet sheet = workbook.createSheet();
  318. //one level
  319. sheet.groupRow(9, 10);
  320. assertEquals(2, sheet.getPhysicalNumberOfRows());
  321. CTRow ctrow = sheet.getRow(9).getCTRow();
  322. assertNotNull(ctrow);
  323. assertEquals(10, ctrow.getR());
  324. assertEquals(1, ctrow.getOutlineLevel());
  325. assertEquals(1, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
  326. //two level
  327. sheet.groupRow(10, 13);
  328. assertEquals(5, sheet.getPhysicalNumberOfRows());
  329. ctrow = sheet.getRow(10).getCTRow();
  330. assertNotNull(ctrow);
  331. assertEquals(11, ctrow.getR());
  332. assertEquals(2, ctrow.getOutlineLevel());
  333. assertEquals(2, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
  334. sheet.ungroupRow(8, 10);
  335. assertEquals(4, sheet.getPhysicalNumberOfRows());
  336. assertEquals(1, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
  337. sheet.ungroupRow(10, 10);
  338. assertEquals(3, sheet.getPhysicalNumberOfRows());
  339. assertEquals(1, sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
  340. workbook.close();
  341. }
  342. @Test(expected=IllegalArgumentException.class)
  343. public void setZoom() throws IOException {
  344. XSSFWorkbook workBook = new XSSFWorkbook();
  345. XSSFSheet sheet1 = workBook.createSheet("new sheet");
  346. sheet1.setZoom(3, 4); // 75 percent magnification
  347. long zoom = sheet1.getCTWorksheet().getSheetViews().getSheetViewArray(0).getZoomScale();
  348. assertEquals(zoom, 75);
  349. sheet1.setZoom(200);
  350. zoom = sheet1.getCTWorksheet().getSheetViews().getSheetViewArray(0).getZoomScale();
  351. assertEquals(zoom, 200);
  352. // Valid scale values range from 10 to 400
  353. try {
  354. sheet1.setZoom(500);
  355. } finally {
  356. workBook.close();
  357. }
  358. }
  359. /**
  360. * TODO - while this is internally consistent, I'm not
  361. * completely clear in all cases what it's supposed to
  362. * be doing... Someone who understands the goals a little
  363. * better should really review this!
  364. */
  365. @Test
  366. public void setColumnGroupCollapsed() throws IOException {
  367. Workbook wb = new XSSFWorkbook();
  368. XSSFSheet sheet1 =(XSSFSheet) wb.createSheet();
  369. CTCols cols=sheet1.getCTWorksheet().getColsArray(0);
  370. assertEquals(0,cols.sizeOfColArray());
  371. sheet1.groupColumn( (short)4, (short)7 );
  372. sheet1.groupColumn( (short)9, (short)12 );
  373. assertEquals(2,cols.sizeOfColArray());
  374. assertEquals(false,cols.getColArray(0).isSetHidden());
  375. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  376. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  377. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  378. assertEquals(false,cols.getColArray(1).isSetHidden());
  379. assertEquals(true, cols.getColArray(1).isSetCollapsed());
  380. assertEquals(10, cols.getColArray(1).getMin()); // 1 based
  381. assertEquals(13, cols.getColArray(1).getMax()); // 1 based
  382. sheet1.groupColumn( (short)10, (short)11 );
  383. assertEquals(4,cols.sizeOfColArray());
  384. assertEquals(false,cols.getColArray(0).isSetHidden());
  385. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  386. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  387. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  388. assertEquals(false,cols.getColArray(1).isSetHidden());
  389. assertEquals(true, cols.getColArray(1).isSetCollapsed());
  390. assertEquals(10, cols.getColArray(1).getMin()); // 1 based
  391. assertEquals(10, cols.getColArray(1).getMax()); // 1 based
  392. assertEquals(false,cols.getColArray(2).isSetHidden());
  393. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  394. assertEquals(11, cols.getColArray(2).getMin()); // 1 based
  395. assertEquals(12, cols.getColArray(2).getMax()); // 1 based
  396. assertEquals(false,cols.getColArray(3).isSetHidden());
  397. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  398. assertEquals(13, cols.getColArray(3).getMin()); // 1 based
  399. assertEquals(13, cols.getColArray(3).getMax()); // 1 based
  400. // collapse columns - 1
  401. sheet1.setColumnGroupCollapsed( (short)5, true );
  402. assertEquals(5,cols.sizeOfColArray());
  403. assertEquals(true, cols.getColArray(0).isSetHidden());
  404. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  405. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  406. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  407. assertEquals(false,cols.getColArray(1).isSetHidden());
  408. assertEquals(true, cols.getColArray(1).isSetCollapsed());
  409. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  410. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  411. assertEquals(false,cols.getColArray(2).isSetHidden());
  412. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  413. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  414. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  415. assertEquals(false,cols.getColArray(3).isSetHidden());
  416. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  417. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  418. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  419. assertEquals(false,cols.getColArray(4).isSetHidden());
  420. assertEquals(true, cols.getColArray(4).isSetCollapsed());
  421. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  422. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  423. // expand columns - 1
  424. sheet1.setColumnGroupCollapsed( (short)5, false );
  425. assertEquals(false,cols.getColArray(0).isSetHidden());
  426. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  427. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  428. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  429. assertEquals(false,cols.getColArray(1).isSetHidden());
  430. assertEquals(false,cols.getColArray(1).isSetCollapsed());
  431. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  432. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  433. assertEquals(false,cols.getColArray(2).isSetHidden());
  434. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  435. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  436. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  437. assertEquals(false,cols.getColArray(3).isSetHidden());
  438. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  439. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  440. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  441. assertEquals(false,cols.getColArray(4).isSetHidden());
  442. assertEquals(true, cols.getColArray(4).isSetCollapsed());
  443. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  444. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  445. //collapse - 2
  446. sheet1.setColumnGroupCollapsed( (short)9, true );
  447. assertEquals(6,cols.sizeOfColArray());
  448. assertEquals(false,cols.getColArray(0).isSetHidden());
  449. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  450. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  451. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  452. assertEquals(false,cols.getColArray(1).isSetHidden());
  453. assertEquals(false,cols.getColArray(1).isSetCollapsed());
  454. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  455. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  456. assertEquals(true, cols.getColArray(2).isSetHidden());
  457. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  458. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  459. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  460. assertEquals(true, cols.getColArray(3).isSetHidden());
  461. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  462. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  463. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  464. assertEquals(true, cols.getColArray(4).isSetHidden());
  465. assertEquals(true, cols.getColArray(4).isSetCollapsed());
  466. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  467. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  468. assertEquals(false,cols.getColArray(5).isSetHidden());
  469. assertEquals(true, cols.getColArray(5).isSetCollapsed());
  470. assertEquals(14, cols.getColArray(5).getMin()); // 1 based
  471. assertEquals(14, cols.getColArray(5).getMax()); // 1 based
  472. //expand - 2
  473. sheet1.setColumnGroupCollapsed( (short)9, false );
  474. assertEquals(6,cols.sizeOfColArray());
  475. assertEquals(14,cols.getColArray(5).getMin());
  476. //outline level 2: the line under ==> collapsed==True
  477. assertEquals(2,cols.getColArray(3).getOutlineLevel());
  478. assertEquals(true,cols.getColArray(4).isSetCollapsed());
  479. assertEquals(false,cols.getColArray(0).isSetHidden());
  480. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  481. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  482. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  483. assertEquals(false,cols.getColArray(1).isSetHidden());
  484. assertEquals(false,cols.getColArray(1).isSetCollapsed());
  485. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  486. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  487. assertEquals(false,cols.getColArray(2).isSetHidden());
  488. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  489. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  490. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  491. assertEquals(true, cols.getColArray(3).isSetHidden());
  492. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  493. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  494. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  495. assertEquals(false,cols.getColArray(4).isSetHidden());
  496. assertEquals(true, cols.getColArray(4).isSetCollapsed());
  497. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  498. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  499. assertEquals(false,cols.getColArray(5).isSetHidden());
  500. assertEquals(false,cols.getColArray(5).isSetCollapsed());
  501. assertEquals(14, cols.getColArray(5).getMin()); // 1 based
  502. assertEquals(14, cols.getColArray(5).getMax()); // 1 based
  503. //DOCUMENTARE MEGLIO IL DISCORSO DEL LIVELLO
  504. //collapse - 3
  505. sheet1.setColumnGroupCollapsed( (short)10, true );
  506. assertEquals(6,cols.sizeOfColArray());
  507. assertEquals(false,cols.getColArray(0).isSetHidden());
  508. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  509. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  510. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  511. assertEquals(false,cols.getColArray(1).isSetHidden());
  512. assertEquals(false,cols.getColArray(1).isSetCollapsed());
  513. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  514. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  515. assertEquals(false,cols.getColArray(2).isSetHidden());
  516. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  517. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  518. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  519. assertEquals(true, cols.getColArray(3).isSetHidden());
  520. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  521. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  522. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  523. assertEquals(false,cols.getColArray(4).isSetHidden());
  524. assertEquals(true, cols.getColArray(4).isSetCollapsed());
  525. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  526. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  527. assertEquals(false,cols.getColArray(5).isSetHidden());
  528. assertEquals(false,cols.getColArray(5).isSetCollapsed());
  529. assertEquals(14, cols.getColArray(5).getMin()); // 1 based
  530. assertEquals(14, cols.getColArray(5).getMax()); // 1 based
  531. //expand - 3
  532. sheet1.setColumnGroupCollapsed( (short)10, false );
  533. assertEquals(6,cols.sizeOfColArray());
  534. assertEquals(false,cols.getColArray(0).getHidden());
  535. assertEquals(false,cols.getColArray(5).getHidden());
  536. assertEquals(false,cols.getColArray(4).isSetCollapsed());
  537. // write out and give back
  538. // Save and re-load
  539. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  540. sheet1 = (XSSFSheet)wb.getSheetAt(0);
  541. assertEquals(6,cols.sizeOfColArray());
  542. assertEquals(false,cols.getColArray(0).isSetHidden());
  543. assertEquals(true, cols.getColArray(0).isSetCollapsed());
  544. assertEquals(5, cols.getColArray(0).getMin()); // 1 based
  545. assertEquals(8, cols.getColArray(0).getMax()); // 1 based
  546. assertEquals(false,cols.getColArray(1).isSetHidden());
  547. assertEquals(false,cols.getColArray(1).isSetCollapsed());
  548. assertEquals(9, cols.getColArray(1).getMin()); // 1 based
  549. assertEquals(9, cols.getColArray(1).getMax()); // 1 based
  550. assertEquals(false,cols.getColArray(2).isSetHidden());
  551. assertEquals(true, cols.getColArray(2).isSetCollapsed());
  552. assertEquals(10, cols.getColArray(2).getMin()); // 1 based
  553. assertEquals(10, cols.getColArray(2).getMax()); // 1 based
  554. assertEquals(false,cols.getColArray(3).isSetHidden());
  555. assertEquals(true, cols.getColArray(3).isSetCollapsed());
  556. assertEquals(11, cols.getColArray(3).getMin()); // 1 based
  557. assertEquals(12, cols.getColArray(3).getMax()); // 1 based
  558. assertEquals(false,cols.getColArray(4).isSetHidden());
  559. assertEquals(false,cols.getColArray(4).isSetCollapsed());
  560. assertEquals(13, cols.getColArray(4).getMin()); // 1 based
  561. assertEquals(13, cols.getColArray(4).getMax()); // 1 based
  562. assertEquals(false,cols.getColArray(5).isSetHidden());
  563. assertEquals(false,cols.getColArray(5).isSetCollapsed());
  564. assertEquals(14, cols.getColArray(5).getMin()); // 1 based
  565. assertEquals(14, cols.getColArray(5).getMax()); // 1 based
  566. wb.close();
  567. }
  568. /**
  569. * TODO - while this is internally consistent, I'm not
  570. * completely clear in all cases what it's supposed to
  571. * be doing... Someone who understands the goals a little
  572. * better should really review this!
  573. */
  574. @Test
  575. public void setRowGroupCollapsed() throws IOException {
  576. Workbook wb = new XSSFWorkbook();
  577. XSSFSheet sheet1 = (XSSFSheet)wb.createSheet();
  578. sheet1.groupRow( 5, 14 );
  579. sheet1.groupRow( 7, 14 );
  580. sheet1.groupRow( 16, 19 );
  581. assertEquals(14,sheet1.getPhysicalNumberOfRows());
  582. assertFalse(sheet1.getRow(6).getCTRow().isSetCollapsed());
  583. assertFalse(sheet1.getRow(6).getCTRow().isSetHidden());
  584. assertFalse(sheet1.getRow(7).getCTRow().isSetCollapsed());
  585. assertFalse(sheet1.getRow(7).getCTRow().isSetHidden());
  586. assertFalse(sheet1.getRow(9).getCTRow().isSetCollapsed());
  587. assertFalse(sheet1.getRow(9).getCTRow().isSetHidden());
  588. assertFalse(sheet1.getRow(14).getCTRow().isSetCollapsed());
  589. assertFalse(sheet1.getRow(14).getCTRow().isSetHidden());
  590. assertFalse(sheet1.getRow(16).getCTRow().isSetCollapsed());
  591. assertFalse(sheet1.getRow(16).getCTRow().isSetHidden());
  592. assertFalse(sheet1.getRow(18).getCTRow().isSetCollapsed());
  593. assertFalse(sheet1.getRow(18).getCTRow().isSetHidden());
  594. //collapsed
  595. sheet1.setRowGroupCollapsed( 7, true );
  596. assertFalse(sheet1.getRow(6).getCTRow().isSetCollapsed());
  597. assertFalse(sheet1.getRow(6).getCTRow().isSetHidden());
  598. assertFalse(sheet1.getRow(7).getCTRow().isSetCollapsed());
  599. assertTrue (sheet1.getRow(7).getCTRow().isSetHidden());
  600. assertFalse(sheet1.getRow(9).getCTRow().isSetCollapsed());
  601. assertTrue (sheet1.getRow(9).getCTRow().isSetHidden());
  602. assertFalse(sheet1.getRow(14).getCTRow().isSetCollapsed());
  603. assertTrue (sheet1.getRow(14).getCTRow().isSetHidden());
  604. assertFalse(sheet1.getRow(16).getCTRow().isSetCollapsed());
  605. assertFalse(sheet1.getRow(16).getCTRow().isSetHidden());
  606. assertFalse(sheet1.getRow(18).getCTRow().isSetCollapsed());
  607. assertFalse(sheet1.getRow(18).getCTRow().isSetHidden());
  608. //expanded
  609. sheet1.setRowGroupCollapsed( 7, false );
  610. assertFalse(sheet1.getRow(6).getCTRow().isSetCollapsed());
  611. assertFalse(sheet1.getRow(6).getCTRow().isSetHidden());
  612. assertFalse(sheet1.getRow(7).getCTRow().isSetCollapsed());
  613. assertTrue (sheet1.getRow(7).getCTRow().isSetHidden());
  614. assertFalse(sheet1.getRow(9).getCTRow().isSetCollapsed());
  615. assertTrue (sheet1.getRow(9).getCTRow().isSetHidden());
  616. assertFalse(sheet1.getRow(14).getCTRow().isSetCollapsed());
  617. assertTrue (sheet1.getRow(14).getCTRow().isSetHidden());
  618. assertFalse(sheet1.getRow(16).getCTRow().isSetCollapsed());
  619. assertFalse(sheet1.getRow(16).getCTRow().isSetHidden());
  620. assertFalse(sheet1.getRow(18).getCTRow().isSetCollapsed());
  621. assertFalse(sheet1.getRow(18).getCTRow().isSetHidden());
  622. // Save and re-load
  623. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  624. sheet1 = (XSSFSheet)wb.getSheetAt(0);
  625. assertFalse(sheet1.getRow(6).getCTRow().isSetCollapsed());
  626. assertFalse(sheet1.getRow(6).getCTRow().isSetHidden());
  627. assertFalse(sheet1.getRow(7).getCTRow().isSetCollapsed());
  628. assertTrue (sheet1.getRow(7).getCTRow().isSetHidden());
  629. assertFalse(sheet1.getRow(9).getCTRow().isSetCollapsed());
  630. assertTrue (sheet1.getRow(9).getCTRow().isSetHidden());
  631. assertFalse(sheet1.getRow(14).getCTRow().isSetCollapsed());
  632. assertTrue (sheet1.getRow(14).getCTRow().isSetHidden());
  633. assertFalse(sheet1.getRow(16).getCTRow().isSetCollapsed());
  634. assertFalse(sheet1.getRow(16).getCTRow().isSetHidden());
  635. assertFalse(sheet1.getRow(18).getCTRow().isSetCollapsed());
  636. assertFalse(sheet1.getRow(18).getCTRow().isSetHidden());
  637. wb.close();
  638. }
  639. /**
  640. * Get / Set column width and check the actual values of the underlying XML beans
  641. */
  642. @Test
  643. public void columnWidth_lowlevel() throws IOException {
  644. XSSFWorkbook workbook = new XSSFWorkbook();
  645. XSSFSheet sheet = workbook.createSheet("Sheet 1");
  646. sheet.setColumnWidth(1, 22 * 256);
  647. assertEquals(22 * 256, sheet.getColumnWidth(1));
  648. // Now check the low level stuff, and check that's all
  649. // been set correctly
  650. XSSFSheet xs = sheet;
  651. CTWorksheet cts = xs.getCTWorksheet();
  652. assertEquals(1, cts.sizeOfColsArray());
  653. CTCols cols = cts.getColsArray(0);
  654. assertEquals(1, cols.sizeOfColArray());
  655. CTCol col = cols.getColArray(0);
  656. // XML is 1 based, POI is 0 based
  657. assertEquals(2, col.getMin());
  658. assertEquals(2, col.getMax());
  659. assertEquals(22.0, col.getWidth(), 0.0);
  660. assertTrue(col.getCustomWidth());
  661. // Now set another
  662. sheet.setColumnWidth(3, 33 * 256);
  663. assertEquals(1, cts.sizeOfColsArray());
  664. cols = cts.getColsArray(0);
  665. assertEquals(2, cols.sizeOfColArray());
  666. col = cols.getColArray(0);
  667. assertEquals(2, col.getMin()); // POI 1
  668. assertEquals(2, col.getMax());
  669. assertEquals(22.0, col.getWidth(), 0.0);
  670. assertTrue(col.getCustomWidth());
  671. col = cols.getColArray(1);
  672. assertEquals(4, col.getMin()); // POI 3
  673. assertEquals(4, col.getMax());
  674. assertEquals(33.0, col.getWidth(), 0.0);
  675. assertTrue(col.getCustomWidth());
  676. workbook.close();
  677. }
  678. /**
  679. * Setting width of a column included in a column span
  680. */
  681. @Test
  682. public void bug47862() throws IOException {
  683. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47862.xlsx");
  684. XSSFSheet sheet = wb.getSheetAt(0);
  685. CTCols cols = sheet.getCTWorksheet().getColsArray(0);
  686. //<cols>
  687. // <col min="1" max="5" width="15.77734375" customWidth="1"/>
  688. //</cols>
  689. //a span of columns [1,5]
  690. assertEquals(1, cols.sizeOfColArray());
  691. CTCol col = cols.getColArray(0);
  692. assertEquals(1, col.getMin());
  693. assertEquals(5, col.getMax());
  694. double swidth = 15.77734375; //width of columns in the span
  695. assertEquals(swidth, col.getWidth(), 0.0);
  696. for (int i = 0; i < 5; i++) {
  697. assertEquals((int)(swidth*256), sheet.getColumnWidth(i));
  698. }
  699. int[] cw = new int[]{10, 15, 20, 25, 30};
  700. for (int i = 0; i < 5; i++) {
  701. sheet.setColumnWidth(i, cw[i]*256);
  702. }
  703. //the check below failed prior to fix of Bug #47862
  704. ColumnHelper.sortColumns(cols);
  705. //<cols>
  706. // <col min="1" max="1" customWidth="true" width="10.0" />
  707. // <col min="2" max="2" customWidth="true" width="15.0" />
  708. // <col min="3" max="3" customWidth="true" width="20.0" />
  709. // <col min="4" max="4" customWidth="true" width="25.0" />
  710. // <col min="5" max="5" customWidth="true" width="30.0" />
  711. //</cols>
  712. //now the span is splitted into 5 individual columns
  713. assertEquals(5, cols.sizeOfColArray());
  714. for (int i = 0; i < 5; i++) {
  715. assertEquals(cw[i]*256, sheet.getColumnWidth(i));
  716. assertEquals(cw[i], cols.getColArray(i).getWidth(), 0.0);
  717. }
  718. //serialize and check again
  719. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  720. sheet = wb.getSheetAt(0);
  721. cols = sheet.getCTWorksheet().getColsArray(0);
  722. assertEquals(5, cols.sizeOfColArray());
  723. for (int i = 0; i < 5; i++) {
  724. assertEquals(cw[i]*256, sheet.getColumnWidth(i));
  725. assertEquals(cw[i], cols.getColArray(i).getWidth(), 0.0);
  726. }
  727. wb.close();
  728. }
  729. /**
  730. * Hiding a column included in a column span
  731. */
  732. @Test
  733. public void bug47804() throws IOException {
  734. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("47804.xlsx");
  735. XSSFSheet sheet = wb.getSheetAt(0);
  736. CTCols cols = sheet.getCTWorksheet().getColsArray(0);
  737. assertEquals(2, cols.sizeOfColArray());
  738. CTCol col;
  739. //<cols>
  740. // <col min="2" max="4" width="12" customWidth="1"/>
  741. // <col min="7" max="7" width="10.85546875" customWidth="1"/>
  742. //</cols>
  743. //a span of columns [2,4]
  744. col = cols.getColArray(0);
  745. assertEquals(2, col.getMin());
  746. assertEquals(4, col.getMax());
  747. //individual column
  748. col = cols.getColArray(1);
  749. assertEquals(7, col.getMin());
  750. assertEquals(7, col.getMax());
  751. sheet.setColumnHidden(2, true); // Column C
  752. sheet.setColumnHidden(6, true); // Column G
  753. assertTrue(sheet.isColumnHidden(2));
  754. assertTrue(sheet.isColumnHidden(6));
  755. //other columns but C and G are not hidden
  756. assertFalse(sheet.isColumnHidden(1));
  757. assertFalse(sheet.isColumnHidden(3));
  758. assertFalse(sheet.isColumnHidden(4));
  759. assertFalse(sheet.isColumnHidden(5));
  760. //the check below failed prior to fix of Bug #47804
  761. ColumnHelper.sortColumns(cols);
  762. //the span is now splitted into three parts
  763. //<cols>
  764. // <col min="2" max="2" customWidth="true" width="12.0" />
  765. // <col min="3" max="3" customWidth="true" width="12.0" hidden="true"/>
  766. // <col min="4" max="4" customWidth="true" width="12.0"/>
  767. // <col min="7" max="7" customWidth="true" width="10.85546875" hidden="true"/>
  768. //</cols>
  769. assertEquals(4, cols.sizeOfColArray());
  770. col = cols.getColArray(0);
  771. assertEquals(2, col.getMin());
  772. assertEquals(2, col.getMax());
  773. col = cols.getColArray(1);
  774. assertEquals(3, col.getMin());
  775. assertEquals(3, col.getMax());
  776. col = cols.getColArray(2);
  777. assertEquals(4, col.getMin());
  778. assertEquals(4, col.getMax());
  779. col = cols.getColArray(3);
  780. assertEquals(7, col.getMin());
  781. assertEquals(7, col.getMax());
  782. //serialize and check again
  783. wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
  784. sheet = wb.getSheetAt(0);
  785. assertTrue(sheet.isColumnHidden(2));
  786. assertTrue(sheet.isColumnHidden(6));
  787. assertFalse(sheet.isColumnHidden(1));
  788. assertFalse(sheet.isColumnHidden(3));
  789. assertFalse(sheet.isColumnHidden(4));
  790. assertFalse(sheet.isColumnHidden(5));
  791. wb.close();
  792. }
  793. @Test
  794. public void commentsTable() throws IOException {
  795. XSSFWorkbook workbook = new XSSFWorkbook();
  796. XSSFSheet sheet1 = workbook.createSheet();
  797. CommentsTable comment1 = sheet1.getCommentsTable(false);
  798. assertNull(comment1);
  799. comment1 = sheet1.getCommentsTable(true);
  800. assertNotNull(comment1);
  801. assertEquals("/xl/comments1.xml", comment1.getPackageRelationship().getTargetURI().toString());
  802. assertSame(comment1, sheet1.getCommentsTable(true));
  803. //second sheet
  804. XSSFSheet sheet2 = workbook.createSheet();
  805. CommentsTable comment2 = sheet2.getCommentsTable(false);
  806. assertNull(comment2);
  807. comment2 = sheet2.getCommentsTable(true);
  808. assertNotNull(comment2);
  809. assertSame(comment2, sheet2.getCommentsTable(true));
  810. assertEquals("/xl/comments2.xml", comment2.getPackageRelationship().getTargetURI().toString());
  811. //comment1 and comment2 are different objects
  812. assertNotSame(comment1, comment2);
  813. //now test against a workbook containing cell comments
  814. workbook = XSSFTestDataSamples.openSampleWorkbook("WithMoreVariousData.xlsx");
  815. sheet1 = workbook.getSheetAt(0);
  816. comment1 = sheet1.getCommentsTable(true);
  817. assertNotNull(comment1);
  818. assertEquals("/xl/comments1.xml", comment1.getPackageRelationship().getTargetURI().toString());
  819. assertSame(comment1, sheet1.getCommentsTable(true));
  820. workbook.close();
  821. }
  822. /**
  823. * Rows and cells can be created in random order,
  824. * but CTRows are kept in ascending order
  825. */
  826. @Override
  827. @Test
  828. @SuppressWarnings("deprecation")
  829. public void createRow() throws IOException {
  830. XSSFWorkbook workbook = new XSSFWorkbook();
  831. XSSFSheet sheet = workbook.createSheet();
  832. CTWorksheet wsh = sheet.getCTWorksheet();
  833. CTSheetData sheetData = wsh.getSheetData();
  834. assertEquals(0, sheetData.sizeOfRowArray());
  835. XSSFRow row1 = sheet.createRow(2);
  836. row1.createCell(2);
  837. row1.createCell(1);
  838. XSSFRow row2 = sheet.createRow(1);
  839. row2.createCell(2);
  840. row2.createCell(1);
  841. row2.createCell(0);
  842. XSSFRow row3 = sheet.createRow(0);
  843. row3.createCell(3);
  844. row3.createCell(0);
  845. row3.createCell(2);
  846. row3.createCell(5);
  847. CTRow[] xrow = sheetData.getRowArray();
  848. assertEquals(3, xrow.length);
  849. //rows are sorted: {0, 1, 2}
  850. assertEquals(4, xrow[0].sizeOfCArray());
  851. assertEquals(1, xrow[0].getR());
  852. assertTrue(xrow[0].equals(row3.getCTRow()));
  853. assertEquals(3, xrow[1].sizeOfCArray());
  854. assertEquals(2, xrow[1].getR());
  855. assertTrue(xrow[1].equals(row2.getCTRow()));
  856. assertEquals(2, xrow[2].sizeOfCArray());
  857. assertEquals(3, xrow[2].getR());
  858. assertTrue(xrow[2].equals(row1.getCTRow()));
  859. CTCell[] xcell = xrow[0].getCArray();
  860. assertEquals("D1", xcell[0].getR());
  861. assertEquals("A1", xcell[1].getR());
  862. assertEquals("C1", xcell[2].getR());
  863. assertEquals("F1", xcell[3].getR());
  864. //re-creating a row does NOT add extra data to the parent
  865. row2 = sheet.createRow(1);
  866. assertEquals(3, sheetData.sizeOfRowArray());
  867. //existing cells are invalidated
  868. assertEquals(0, sheetData.getRowArray(1).sizeOfCArray());
  869. assertEquals(0, row2.getPhysicalNumberOfCells());
  870. workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook);
  871. sheet = workbook.getSheetAt(0);
  872. wsh = sheet.getCTWorksheet();
  873. xrow = sheetData.getRowArray();
  874. assertEquals(3, xrow.length);
  875. //rows are sorted: {0, 1, 2}
  876. assertEquals(4, xrow[0].sizeOfCArray());
  877. assertEquals(1, xrow[0].getR());
  878. //cells are now sorted
  879. xcell = xrow[0].getCArray();
  880. assertEquals("A1", xcell[0].getR());
  881. assertEquals("C1", xcell[1].getR());
  882. assertEquals("D1", xcell[2].getR());
  883. assertEquals("F1", xcell[3].getR());
  884. assertEquals(0, xrow[1].sizeOfCArray());
  885. assertEquals(2, xrow[1].getR());
  886. assertEquals(2, xrow[2].sizeOfCArray());
  887. assertEquals(3, xrow[2].getR());
  888. workbook.close();
  889. }
  890. @Test(expected=IllegalArgumentException.class)
  891. public void createRowAfterLastRow() throws IOException {
  892. createRowAfterLastRow(SpreadsheetVersion.EXCEL2007);
  893. }
  894. @Test
  895. public void setAutoFilter() throws IOException {
  896. XSSFWorkbook wb = new XSSFWorkbook();
  897. XSSFSheet sheet = wb.createSheet("new sheet");
  898. sheet.setAutoFilter(CellRangeAddress.valueOf("A1:D100"));
  899. assertEquals("A1:D100", sheet.getCTWorksheet().getAutoFilter().getRef());
  900. // auto-filter must be registered in workboook.xml, see Bugzilla 50315
  901. XSSFName nm = wb.getBuiltInName(XSSFName.BUILTIN_FILTER_DB, 0);
  902. assertNotNull(nm);
  903. assertEquals(0, nm.getCTName().getLocalSheetId());
  904. assertEquals(true, nm.getCTName().getHidden());
  905. assertEquals("_xlnm._FilterDatabase", nm.getCTName().getName());
  906. assertEquals("'new sheet'!$A$1:$D$100", nm.getCTName().getStringValue());
  907. wb.close();
  908. }
  909. @Test
  910. public void protectSheet_lowlevel() throws IOException {
  911. XSSFWorkbook wb = new XSSFWorkbook();
  912. XSSFSheet sheet = wb.createSheet();
  913. CTSheetProtection pr = sheet.getCTWorksheet().getSheetProtection();
  914. assertNull("CTSheetProtection should be null by default", pr);
  915. String password = "Test";
  916. sheet.protectSheet(password);
  917. pr = sheet.getCTWorksheet().getSheetProtection();
  918. assertNotNull("CTSheetProtection should be not null", pr);
  919. assertTrue("sheet protection should be on", pr.isSetSheet());
  920. assertTrue("object protection should be on", pr.isSetObjects());
  921. assertTrue("scenario protection should be on", pr.isSetScenarios());
  922. int hashVal = CryptoFunctions.createXorVerifier1(password);
  923. int actualVal = Integer.parseInt(pr.xgetPassword().getStringValue(),16);
  924. assertEquals("well known value for top secret hash should match", hashVal, actualVal);
  925. sheet.protectSheet(null);
  926. assertNull("protectSheet(null) should unset CTSheetProtection", sheet.getCTWorksheet().getSheetProtection());
  927. wb.close();
  928. }
  929. @Test
  930. public void protectSheet_lowlevel_2013() throws IOException {
  931. String password = "test";
  932. XSSFWorkbook wb = new XSSFWorkbook();
  933. XSSFSheet xs = wb.createSheet();
  934. xs.setSheetPassword(password, HashAlgorithm.sha384);
  935. wb = writeOutAndReadBack(wb);
  936. assertTrue(wb.getSheetAt(0).validateSheetPassword(password));
  937. wb = openSampleWorkbook("workbookProtection-sheet_password-2013.xlsx");
  938. assertTrue(wb.getSheetAt(0).validateSheetPassword("pwd"));
  939. wb.close();
  940. }
  941. @Test
  942. public void bug49966() throws IOException {
  943. XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("49966.xlsx");
  944. CalculationChain calcChain = wb1.getCalculationChain();
  945. assertNotNull(wb1.getCalculationChain());
  946. assertEquals(3, calcChain.getCTCalcChain().sizeOfCArray());
  947. XSSFSheet sheet = wb1.getSheetAt(0);
  948. XSSFRow row = sheet.getRow(0);
  949. sheet.removeRow(row);
  950. assertEquals("XSSFSheet#removeRow did not clear calcChain entries",
  951. 0, calcChain.getCTCalcChain().sizeOfCArray());
  952. //calcChain should be gone
  953. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  954. wb1.close();
  955. assertNull(wb2.getCalculationChain());
  956. wb2.close();
  957. }
  958. /**
  959. * See bug #50829
  960. */
  961. @Test
  962. public void tables() throws IOException {
  963. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTable.xlsx");
  964. assertEquals(3, wb.getNumberOfSheets());
  965. // Check the table sheet
  966. XSSFSheet s1 = wb.getSheetAt(0);
  967. assertEquals("a", s1.getRow(0).getCell(0).getRichStringCellValue().toString());
  968. assertEquals(1.0, s1.getRow(1).getCell(0).getNumericCellValue(), 0);
  969. List<XSSFTable> tables = s1.getTables();
  970. assertNotNull(tables);
  971. assertEquals(1, tables.size());
  972. XSSFTable table = tables.get(0);
  973. assertEquals("Tabella1", table.getName());
  974. assertEquals("Tabella1", table.getDisplayName());
  975. // And the others
  976. XSSFSheet s2 = wb.getSheetAt(1);
  977. assertEquals(0, s2.getTables().size());
  978. XSSFSheet s3 = wb.getSheetAt(2);
  979. assertEquals(0, s3.getTables().size());
  980. wb.close();
  981. }
  982. /**
  983. * Test to trigger OOXML-LITE generating to include org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetCalcPr
  984. */
  985. @Test
  986. public void setForceFormulaRecalculation() throws IOException {
  987. XSSFWorkbook wb1 = new XSSFWorkbook();
  988. XSSFSheet sheet = wb1.createSheet("Sheet 1");
  989. assertFalse(sheet.getForceFormulaRecalculation());
  990. // Set
  991. sheet.setForceFormulaRecalculation(true);
  992. assertEquals(true, sheet.getForceFormulaRecalculation());
  993. // calcMode="manual" is unset when forceFormulaRecalculation=true
  994. CTCalcPr calcPr = wb1.getCTWorkbook().addNewCalcPr();
  995. calcPr.setCalcMode(STCalcMode.MANUAL);
  996. sheet.setForceFormulaRecalculation(true);
  997. assertEquals(STCalcMode.AUTO, calcPr.getCalcMode());
  998. // Check
  999. sheet.setForceFormulaRecalculation(false);
  1000. assertEquals(false, sheet.getForceFormulaRecalculation());
  1001. // Save, re-load, and re-check
  1002. XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
  1003. wb1.close();
  1004. sheet = wb2.getSheet("Sheet 1");
  1005. assertEquals(false, sheet.getForceFormulaRecalculation());
  1006. wb2.close();
  1007. }
  1008. @Test
  1009. public void bug54607() throws IOException {
  1010. // run with the file provided in the Bug-Report
  1011. runGetTopRow("54607.xlsx", true, 1, 0, 0);
  1012. runGetLeftCol("54607.xlsx", true, 0, 0, 0);
  1013. // run with some other flie to see
  1014. runGetTopRow("54436.xlsx", true, 0);
  1015. runGetLeftCol("54436.xlsx", true, 0);
  1016. runGetTopRow("TwoSheetsNoneHidden.xlsx", true, 0, 0);
  1017. runGetLeftCol("TwoSheetsNoneHidden.xlsx", true, 0, 0);
  1018. runGetTopRow("TwoSheetsNoneHidden.xls", false, 0, 0);
  1019. runGetLeftCol("TwoSheetsNoneHidden.xls", false, 0, 0);
  1020. }
  1021. private void runGetTopRow(String file, boolean isXSSF, int... topRows) throws IOException {
  1022. final Workbook wb;
  1023. if(isXSSF) {
  1024. wb = XSSFTestDataSamples.openSampleWorkbook(file);
  1025. } else {
  1026. wb = HSSFTestDataSamples.openSampleWorkbook(file);
  1027. }
  1028. for (int si = 0; si < wb.getNumberOfSheets(); si++) {
  1029. Sheet sh = wb.getSheetAt(si);
  1030. assertNotNull(sh.getSheetName());
  1031. assertEquals("Did not match for sheet " + si, topRows[si], sh.getTopRow());
  1032. }
  1033. // for XSSF also test with SXSSF
  1034. if(isXSSF) {
  1035. Workbook swb = new SXSSFWorkbook((XSSFWorkbook) wb);
  1036. try {
  1037. for (int si = 0; si < swb.getNumberOfSheets(); si++) {
  1038. Sheet sh = swb.getSheetAt(si);
  1039. assertNotNull(sh.getSheetName());
  1040. assertEquals("Did not match for sheet " + si, topRows[si], sh.getTopRow());
  1041. }
  1042. } finally {
  1043. swb.close();
  1044. }
  1045. }
  1046. }
  1047. private void runGetLeftCol(String file, boolean isXSSF, int... topRows) throws IOException {
  1048. final Workbook wb;
  1049. if(isXSSF) {
  1050. wb = XSSFTestDataSamples.openSampleWorkbook(file);
  1051. } else {
  1052. wb = HSSFTestDataSamples.openSampleWorkbook(file);
  1053. }
  1054. for (int si = 0; si < wb.getNumberOfSheets(); si++) {
  1055. Sheet sh = wb.getSheetAt(si);
  1056. assertNotNull(sh.getSheetName());
  1057. assertEquals("Did not match for sheet " + si, topRows[si], sh.getLeftCol());
  1058. }
  1059. // for XSSF also test with SXSSF
  1060. if(isXSSF) {
  1061. Workbook swb = new SXSSFWorkbook((XSSFWorkbook) wb);
  1062. for (int si = 0; si < swb.getNumberOfSheets(); si++) {
  1063. Sheet sh = swb.getSheetAt(si);
  1064. assertNotNull(sh.getSheetName());
  1065. assertEquals("Did not match for sheet " + si, topRows[si], sh.getLeftCol());
  1066. }
  1067. swb.close();
  1068. }
  1069. }
  1070. @Test
  1071. public void bug55745() throws Exception {
  1072. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55745.xlsx");
  1073. XSSFSheet sheet = wb.getSheetAt(0);
  1074. List<XSSFTable> tables = sheet.getTables();
  1075. /*System.out.println(tables.size());
  1076. for(XSSFTable table : tables) {
  1077. System.out.println("XPath: " + table.getCommonXpath());
  1078. System.out.println("Name: " + table.getName());
  1079. System.out.println("Mapped Cols: " + table.getNumerOfMappedColumns());
  1080. System.out.println("Rowcount: " + table.getRowCount());
  1081. System.out.println("End Cell: " + table.getEndCellReference());
  1082. System.out.println("Start Cell: " + table.getStartCellReference());
  1083. }*/
  1084. assertEquals("Sheet should contain 8 tables", 8, tables.size());
  1085. assertNotNull("Sheet should contain a comments table", sheet.getCommentsTable(false));
  1086. wb.close();
  1087. }
  1088. @Test
  1089. public void bug55723b() throws IOException {
  1090. XSSFWorkbook wb = new XSSFWorkbook();
  1091. Sheet sheet = wb.createSheet();
  1092. // stored with a special name
  1093. assertNull(wb.getBuiltInName(XSSFName.BUILTIN_FILTER_DB, 0));
  1094. CellRangeAddress range = CellRangeAddress.valueOf("A:B");
  1095. AutoFilter filter = sheet.setAutoFilter(range);
  1096. assertNotNull(filter);
  1097. // stored with a special name
  1098. XSSFName name = wb.getBuiltInName(XSSFName.BUILTIN_FILTER_DB, 0);
  1099. assertNotNull(name);
  1100. assertEquals("Sheet0!$A:$B", name.getRefersToFormula());
  1101. range = CellRangeAddress.valueOf("B:C");
  1102. filter = sheet.setAutoFilter(range);
  1103. assertNotNull(filter);
  1104. // stored with a special name
  1105. name = wb.getBuiltInName(XSSFName.BUILTIN_FILTER_DB, 0);
  1106. assertNotNull(name);
  1107. assertEquals("Sheet0!$B:$C", name.getRefersToFormula());
  1108. wb.close();
  1109. }
  1110. @Test(timeout=180000)
  1111. public void bug51585() throws IOException {
  1112. XSSFTestDataSamples.openSampleWorkbook("51585.xlsx").close();;
  1113. }
  1114. private XSSFWorkbook setupSheet(){
  1115. //set up workbook
  1116. XSSFWorkbook wb = new XSSFWorkbook();
  1117. XSSFSheet sheet = wb.createSheet();
  1118. Row row1 = sheet.createRow((short) 0);
  1119. Cell cell = row1.createCell((short) 0);
  1120. cell.setCellValue("Names");
  1121. Cell cell2 = row1.createCell((short) 1);
  1122. cell2.setCellValue("#");
  1123. Row row2 = sheet.createRow((short) 1);
  1124. Cell cell3 = row2.createCell((short) 0);
  1125. cell3.setCellValue("Jane");
  1126. Cell cell4 = row2.createCell((short) 1);
  1127. cell4.setCellValue(3);
  1128. Row row3 = sheet.createRow((short) 2);
  1129. Cell cell5 = row3.createCell((short) 0);
  1130. cell5.setCellValue("John");
  1131. Cell cell6 = row3.createCell((short) 1);
  1132. cell6.setCellValue(3);
  1133. return wb;
  1134. }
  1135. @Test
  1136. public void testCreateTwoPivotTablesInOneSheet() throws IOException {
  1137. XSSFWorkbook wb = setupSheet();
  1138. XSSFSheet sheet = wb.getSheetAt(0);
  1139. assertNotNull(wb);
  1140. assertNotNull(sheet);
  1141. XSSFPivotTable pivotTable = sheet.createPivotTable(new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("H5"));
  1142. assertNotNull(pivotTable);
  1143. assertTrue(wb.getPivotTables().size() > 0);
  1144. XSSFPivotTable pivotTable2 = sheet.createPivotTable(new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("L5"), sheet);
  1145. assertNotNull(pivotTable2);
  1146. assertTrue(wb.getPivotTables().size() > 1);
  1147. wb.close();
  1148. }
  1149. @Test
  1150. public void testCreateTwoPivotTablesInTwoSheets() throws IOException {
  1151. XSSFWorkbook wb = setupSheet();
  1152. XSSFSheet sheet = wb.getSheetAt(0);
  1153. assertNotNull(wb);
  1154. assertNotNull(sheet);
  1155. XSSFPivotTable pivotTable = sheet.createPivotTable(new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("H5"));
  1156. assertNotNull(pivotTable);
  1157. assertTrue(wb.getPivotTables().size() > 0);
  1158. assertNotNull(wb);
  1159. XSSFSheet sheet2 = wb.createSheet();
  1160. XSSFPivotTable pivotTable2 = sheet2.createPivotTable(new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("H5"), sheet);
  1161. assertNotNull(pivotTable2);
  1162. assertTrue(wb.getPivotTables().size() > 1);
  1163. wb.close();
  1164. }
  1165. @Test
  1166. public void testCreatePivotTable() throws IOException {
  1167. XSSFWorkbook wb = setupSheet();
  1168. XSSFSheet sheet = wb.getSheetAt(0);
  1169. assertNotNull(wb);
  1170. assertNotNull(sheet);
  1171. XSSFPivotTable pivotTable = sheet.createPivotTable(new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("H5"));
  1172. assertNotNull(pivotTable);
  1173. assertTrue(wb.getPivotTables().size() > 0);
  1174. wb.close();
  1175. }
  1176. @Test
  1177. public void testCreatePivotTableInOtherSheetThanDataSheet() throws IOException {
  1178. XSSFWorkbook wb = setupSheet();
  1179. XSSFSheet sheet1 = wb.getSheetAt(0);
  1180. XSSFSheet sheet2 = wb.createSheet();
  1181. XSSFPivotTable pivotTable = sheet2.createPivotTable
  1182. (new AreaReference("A1:B2", SpreadsheetVersion.EXCEL2007), new CellReference("H5"), sheet1);
  1183. assertEquals(0, pivotTable.getRowLabelColumns().size());
  1184. assertEquals(1, wb.getPivotTables().size());
  1185. assertEquals(0, sheet1.getPivotTables().size());
  1186. assertEquals(1, sheet2.getPivotTables().size());
  1187. wb.close();
  1188. }
  1189. @Test
  1190. public void testCreatePivotTableInOtherSheetThanDataSheetUsingAreaReference() throws IOException {
  1191. XSSFWorkbook wb = setupSheet();
  1192. XSSFSheet sheet = wb.getSheetAt(0);
  1193. XSSFSheet sheet2 = wb.createSheet("TEST");
  1194. XSSFPivotTable pivotTable = sheet2.createPivotTable(
  1195. new AreaReference(sheet.getSheetName()+"!A$1:B$2", SpreadsheetVersion.EXCEL2007),
  1196. new CellReference("H5"));
  1197. assertEquals(0, pivotTable.getRowLabelColumns().size());
  1198. wb.close();
  1199. }
  1200. @Test(expected=IllegalArgumentException.class)
  1201. public void testCreatePivotTableWithConflictingDataSheets() throws IOException {
  1202. XSSFWorkbook wb = setupSheet();
  1203. XSSFSheet sheet = wb.getSheetAt(0);
  1204. XSSFSheet sheet2 = wb.createSheet("TEST");
  1205. sheet2.createPivotTable(
  1206. new AreaReference(sheet.getSheetName()+"!A$1:B$2", SpreadsheetVersion.EXCEL2007),
  1207. new CellReference("H5"),
  1208. sheet2);
  1209. }
  1210. @Test(expected=POIXMLException.class)
  1211. public void testReadFails() throws IOException {
  1212. XSSFWorkbook wb = new XSSFWorkbook();
  1213. XSSFSheet sheet = wb.createSheet();
  1214. // Throws exception because we cannot read here
  1215. sheet.onDocumentRead();
  1216. }
  1217. @SuppressWarnings("deprecation")
  1218. @Test
  1219. public void testCreateComment() throws IOException {
  1220. XSSFWorkbook wb = new XSSFWorkbook();
  1221. XSSFSheet sheet = wb.createSheet();
  1222. assertNotNull(sheet.createComment());
  1223. wb.close();
  1224. }
  1225. protected void testCopyOneRow(String copyRowsTestWorkbook) throws IOException {
  1226. final double FLOAT_PRECISION = 1e-9;
  1227. final XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook(copyRowsTestWorkbook);
  1228. final XSSFSheet sheet = workbook.getSheetAt(0);
  1229. final CellCopyPolicy defaultCopyPolicy = new CellCopyPolicy();
  1230. sheet.copyRows(1, 1, 6, defaultCopyPolicy);
  1231. final Row srcRow = sheet.getRow(1);
  1232. final Row destRow = sheet.getRow(6);
  1233. int col = 0;
  1234. Cell cell;
  1235. cell = CellUtil.getCell(destRow, col++);
  1236. assertEquals("Source row ->", cell.getStringCellValue());
  1237. // Style
  1238. cell = CellUtil.getCell(destRow, col++);
  1239. assertEquals("[Style] B7 cell value", "Red", cell.getStringCellValue());
  1240. assertEquals("[Style] B7 cell style", CellUtil.getCell(srcRow, 1).getCellStyle(), cell.getCellStyle());
  1241. // Blank
  1242. cell = CellUtil.getCell(destRow, col++);
  1243. assertEquals("[Blank] C7 cell type", Cell.CELL_TYPE_BLANK, cell.getCellType());
  1244. // Error
  1245. cell = CellUtil.getCell(destRow, col++);
  1246. assertEquals("[Error] D7 cell type", Cell.CELL_TYPE_ERROR, cell.getCellType());
  1247. final FormulaError error = FormulaError.forInt(cell.getErrorCellValue());
  1248. assertEquals("[Error] D7 cell value", FormulaError.NA, error); //FIXME: XSSFCell and HSSFCell expose different interfaces. getErrorCellString would be helpful here
  1249. // Date
  1250. cell = CellUtil.getCell(destRow, col++);
  1251. assertEquals("[Date] E7 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1252. final Date date = new GregorianCalendar(2000, Calendar.JANUARY, 1).getTime();
  1253. assertEquals("[Date] E7 cell value", date, cell.getDateCellValue());
  1254. // Boolean
  1255. cell = CellUtil.getCell(destRow, col++);
  1256. assertEquals("[Boolean] F7 cell type", Cell.CELL_TYPE_BOOLEAN, cell.getCellType());
  1257. assertEquals("[Boolean] F7 cell value", true, cell.getBooleanCellValue());
  1258. // String
  1259. cell = CellUtil.getCell(destRow, col++);
  1260. assertEquals("[String] G7 cell type", Cell.CELL_TYPE_STRING, cell.getCellType());
  1261. assertEquals("[String] G7 cell value", "Hello", cell.getStringCellValue());
  1262. // Int
  1263. cell = CellUtil.getCell(destRow, col++);
  1264. assertEquals("[Int] H7 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1265. assertEquals("[Int] H7 cell value", 15, (int) cell.getNumericCellValue());
  1266. // Float
  1267. cell = CellUtil.getCell(destRow, col++);
  1268. assertEquals("[Float] I7 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1269. assertEquals("[Float] I7 cell value", 12.5, cell.getNumericCellValue(), FLOAT_PRECISION);
  1270. // Cell Formula
  1271. cell = CellUtil.getCell(destRow, col++);
  1272. assertEquals("J7", new CellReference(cell).formatAsString());
  1273. assertEquals("[Cell Formula] J7 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1274. assertEquals("[Cell Formula] J7 cell formula", "5+2", cell.getCellFormula());
  1275. System.out.println("Cell formula evaluation currently unsupported");
  1276. // Cell Formula with Reference
  1277. // Formula row references should be adjusted by destRowNum-srcRowNum
  1278. cell = CellUtil.getCell(destRow, col++);
  1279. assertEquals("K7", new CellReference(cell).formatAsString());
  1280. assertEquals("[Cell Formula with Reference] K7 cell type",
  1281. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1282. assertEquals("[Cell Formula with Reference] K7 cell formula",
  1283. "J7+H$2", cell.getCellFormula());
  1284. // Cell Formula with Reference spanning multiple rows
  1285. cell = CellUtil.getCell(destRow, col++);
  1286. assertEquals("[Cell Formula with Reference spanning multiple rows] L7 cell type",
  1287. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1288. assertEquals("[Cell Formula with Reference spanning multiple rows] L7 cell formula",
  1289. "G7&\" \"&G8", cell.getCellFormula());
  1290. // Cell Formula with Reference spanning multiple rows
  1291. cell = CellUtil.getCell(destRow, col++);
  1292. assertEquals("[Cell Formula with Area Reference] M7 cell type",
  1293. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1294. assertEquals("[Cell Formula with Area Reference] M7 cell formula",
  1295. "SUM(H7:I8)", cell.getCellFormula());
  1296. // Array Formula
  1297. cell = CellUtil.getCell(destRow, col++);
  1298. System.out.println("Array formulas currently unsupported");
  1299. // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
  1300. /*
  1301. assertEquals("[Array Formula] N7 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1302. assertEquals("[Array Formula] N7 cell formula", "{SUM(H7:J7*{1,2,3})}", cell.getCellFormula());
  1303. */
  1304. // Data Format
  1305. cell = CellUtil.getCell(destRow, col++);
  1306. assertEquals("[Data Format] O7 cell type;", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1307. assertEquals("[Data Format] O7 cell value", 100.20, cell.getNumericCellValue(), FLOAT_PRECISION);
  1308. //FIXME: currently fails
  1309. final String moneyFormat = "\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)";
  1310. assertEquals("[Data Format] O7 data format", moneyFormat, cell.getCellStyle().getDataFormatString());
  1311. // Merged
  1312. cell = CellUtil.getCell(destRow, col);
  1313. assertEquals("[Merged] P7:Q7 cell value",
  1314. "Merged cells", cell.getStringCellValue());
  1315. assertTrue("[Merged] P7:Q7 merged region",
  1316. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("P7:Q7")));
  1317. // Merged across multiple rows
  1318. // Microsoft Excel 2013 does not copy a merged region unless all rows of
  1319. // the source merged region are selected
  1320. // POI's behavior should match this behavior
  1321. col += 2;
  1322. cell = CellUtil.getCell(destRow, col);
  1323. // Note: this behavior deviates from Microsoft Excel,
  1324. // which will not overwrite a cell in destination row if merged region extends beyond the copied row.
  1325. // The Excel way would require:
  1326. //assertEquals("[Merged across multiple rows] R7:S8 merged region", "Should NOT be overwritten", cell.getStringCellValue());
  1327. //assertFalse("[Merged across multiple rows] R7:S8 merged region",
  1328. // sheet.getMergedRegions().contains(CellRangeAddress.valueOf("R7:S8")));
  1329. // As currently implemented, cell value is copied but merged region is not copied
  1330. assertEquals("[Merged across multiple rows] R7:S8 cell value",
  1331. "Merged cells across multiple rows", cell.getStringCellValue());
  1332. assertFalse("[Merged across multiple rows] R7:S7 merged region (one row)",
  1333. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("R7:S7"))); //shouldn't do 1-row merge
  1334. assertFalse("[Merged across multiple rows] R7:S8 merged region",
  1335. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("R7:S8"))); //shouldn't do 2-row merge
  1336. // Make sure other rows are blank (off-by-one errors)
  1337. assertNull(sheet.getRow(5));
  1338. assertNull(sheet.getRow(7));
  1339. }
  1340. public void testCopyMultipleRows(String copyRowsTestWorkbook) throws IOException {
  1341. final double FLOAT_PRECISION = 1e-9;
  1342. final XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook(copyRowsTestWorkbook);
  1343. final XSSFSheet sheet = workbook.getSheetAt(0);
  1344. final CellCopyPolicy defaultCopyPolicy = new CellCopyPolicy();
  1345. sheet.copyRows(0, 3, 8, defaultCopyPolicy);
  1346. @SuppressWarnings("unused")
  1347. final Row srcHeaderRow = sheet.getRow(0);
  1348. final Row srcRow1 = sheet.getRow(1);
  1349. final Row srcRow2 = sheet.getRow(2);
  1350. final Row srcRow3 = sheet.getRow(3);
  1351. final Row destHeaderRow = sheet.getRow(8);
  1352. final Row destRow1 = sheet.getRow(9);
  1353. final Row destRow2 = sheet.getRow(10);
  1354. final Row destRow3 = sheet.getRow(11);
  1355. int col = 0;
  1356. Cell cell;
  1357. // Header row should be copied
  1358. assertNotNull(destHeaderRow);
  1359. // Data rows
  1360. cell = CellUtil.getCell(destRow1, col);
  1361. assertEquals("Source row ->", cell.getStringCellValue());
  1362. // Style
  1363. col++;
  1364. cell = CellUtil.getCell(destRow1, col);
  1365. assertEquals("[Style] B10 cell value", "Red", cell.getStringCellValue());
  1366. assertEquals("[Style] B10 cell style", CellUtil.getCell(srcRow1, 1).getCellStyle(), cell.getCellStyle());
  1367. cell = CellUtil.getCell(destRow2, col);
  1368. assertEquals("[Style] B11 cell value", "Blue", cell.getStringCellValue());
  1369. assertEquals("[Style] B11 cell style", CellUtil.getCell(srcRow2, 1).getCellStyle(), cell.getCellStyle());
  1370. // Blank
  1371. col++;
  1372. cell = CellUtil.getCell(destRow1, col);
  1373. assertEquals("[Blank] C10 cell type", Cell.CELL_TYPE_BLANK, cell.getCellType());
  1374. cell = CellUtil.getCell(destRow2, col);
  1375. assertEquals("[Blank] C11 cell type", Cell.CELL_TYPE_BLANK, cell.getCellType());
  1376. // Error
  1377. col++;
  1378. cell = CellUtil.getCell(destRow1, col);
  1379. assertEquals("[Error] D10 cell type", Cell.CELL_TYPE_ERROR, cell.getCellType());
  1380. FormulaError error = FormulaError.forInt(cell.getErrorCellValue());
  1381. assertEquals("[Error] D10 cell value", FormulaError.NA, error); //FIXME: XSSFCell and HSSFCell expose different interfaces. getErrorCellString would be helpful here
  1382. cell = CellUtil.getCell(destRow2, col);
  1383. assertEquals("[Error] D11 cell type", Cell.CELL_TYPE_ERROR, cell.getCellType());
  1384. error = FormulaError.forInt(cell.getErrorCellValue());
  1385. assertEquals("[Error] D11 cell value", FormulaError.NAME, error); //FIXME: XSSFCell and HSSFCell expose different interfaces. getErrorCellString would be helpful here
  1386. // Date
  1387. col++;
  1388. cell = CellUtil.getCell(destRow1, col);
  1389. assertEquals("[Date] E10 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1390. Date date = new GregorianCalendar(2000, Calendar.JANUARY, 1).getTime();
  1391. assertEquals("[Date] E10 cell value", date, cell.getDateCellValue());
  1392. cell = CellUtil.getCell(destRow2, col);
  1393. assertEquals("[Date] E11 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1394. date = new GregorianCalendar(2000, Calendar.JANUARY, 2).getTime();
  1395. assertEquals("[Date] E11 cell value", date, cell.getDateCellValue());
  1396. // Boolean
  1397. col++;
  1398. cell = CellUtil.getCell(destRow1, col);
  1399. assertEquals("[Boolean] F10 cell type", Cell.CELL_TYPE_BOOLEAN, cell.getCellType());
  1400. assertEquals("[Boolean] F10 cell value", true, cell.getBooleanCellValue());
  1401. cell = CellUtil.getCell(destRow2, col);
  1402. assertEquals("[Boolean] F11 cell type", Cell.CELL_TYPE_BOOLEAN, cell.getCellType());
  1403. assertEquals("[Boolean] F11 cell value", false, cell.getBooleanCellValue());
  1404. // String
  1405. col++;
  1406. cell = CellUtil.getCell(destRow1, col);
  1407. assertEquals("[String] G10 cell type", Cell.CELL_TYPE_STRING, cell.getCellType());
  1408. assertEquals("[String] G10 cell value", "Hello", cell.getStringCellValue());
  1409. cell = CellUtil.getCell(destRow2, col);
  1410. assertEquals("[String] G11 cell type", Cell.CELL_TYPE_STRING, cell.getCellType());
  1411. assertEquals("[String] G11 cell value", "World", cell.getStringCellValue());
  1412. // Int
  1413. col++;
  1414. cell = CellUtil.getCell(destRow1, col);
  1415. assertEquals("[Int] H10 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1416. assertEquals("[Int] H10 cell value", 15, (int) cell.getNumericCellValue());
  1417. cell = CellUtil.getCell(destRow2, col);
  1418. assertEquals("[Int] H11 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1419. assertEquals("[Int] H11 cell value", 42, (int) cell.getNumericCellValue());
  1420. // Float
  1421. col++;
  1422. cell = CellUtil.getCell(destRow1, col);
  1423. assertEquals("[Float] I10 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1424. assertEquals("[Float] I10 cell value", 12.5, cell.getNumericCellValue(), FLOAT_PRECISION);
  1425. cell = CellUtil.getCell(destRow2, col);
  1426. assertEquals("[Float] I11 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1427. assertEquals("[Float] I11 cell value", 5.5, cell.getNumericCellValue(), FLOAT_PRECISION);
  1428. // Cell Formula
  1429. col++;
  1430. cell = CellUtil.getCell(destRow1, col);
  1431. assertEquals("[Cell Formula] J10 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1432. assertEquals("[Cell Formula] J10 cell formula", "5+2", cell.getCellFormula());
  1433. cell = CellUtil.getCell(destRow2, col);
  1434. assertEquals("[Cell Formula] J11 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1435. assertEquals("[Cell Formula] J11 cell formula", "6+18", cell.getCellFormula());
  1436. // Cell Formula with Reference
  1437. col++;
  1438. // Formula row references should be adjusted by destRowNum-srcRowNum
  1439. cell = CellUtil.getCell(destRow1, col);
  1440. assertEquals("[Cell Formula with Reference] K10 cell type",
  1441. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1442. assertEquals("[Cell Formula with Reference] K10 cell formula",
  1443. "J10+H$2", cell.getCellFormula());
  1444. cell = CellUtil.getCell(destRow2, col);
  1445. assertEquals("[Cell Formula with Reference] K11 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1446. assertEquals("[Cell Formula with Reference] K11 cell formula", "J11+H$2", cell.getCellFormula());
  1447. // Cell Formula with Reference spanning multiple rows
  1448. col++;
  1449. cell = CellUtil.getCell(destRow1, col);
  1450. assertEquals("[Cell Formula with Reference spanning multiple rows] L10 cell type",
  1451. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1452. assertEquals("[Cell Formula with Reference spanning multiple rows] L10 cell formula",
  1453. "G10&\" \"&G11", cell.getCellFormula());
  1454. cell = CellUtil.getCell(destRow2, col);
  1455. assertEquals("[Cell Formula with Reference spanning multiple rows] L11 cell type",
  1456. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1457. assertEquals("[Cell Formula with Reference spanning multiple rows] L11 cell formula",
  1458. "G11&\" \"&G12", cell.getCellFormula());
  1459. // Cell Formula with Area Reference
  1460. col++;
  1461. cell = CellUtil.getCell(destRow1, col);
  1462. assertEquals("[Cell Formula with Area Reference] M10 cell type",
  1463. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1464. assertEquals("[Cell Formula with Area Reference] M10 cell formula",
  1465. "SUM(H10:I11)", cell.getCellFormula());
  1466. cell = CellUtil.getCell(destRow2, col);
  1467. assertEquals("[Cell Formula with Area Reference] M11 cell type",
  1468. Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1469. assertEquals("[Cell Formula with Area Reference] M11 cell formula",
  1470. "SUM($H$3:I10)", cell.getCellFormula()); //Also acceptable: SUM($H10:I$3), but this AreaReference isn't in ascending order
  1471. // Array Formula
  1472. col++;
  1473. cell = CellUtil.getCell(destRow1, col);
  1474. System.out.println("Array formulas currently unsupported");
  1475. /*
  1476. // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
  1477. assertEquals("[Array Formula] N10 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1478. assertEquals("[Array Formula] N10 cell formula", "{SUM(H10:J10*{1,2,3})}", cell.getCellFormula());
  1479. cell = CellUtil.getCell(destRow2, col);
  1480. // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
  1481. assertEquals("[Array Formula] N11 cell type", Cell.CELL_TYPE_FORMULA, cell.getCellType());
  1482. assertEquals("[Array Formula] N11 cell formula", "{SUM(H11:J11*{1,2,3})}", cell.getCellFormula());
  1483. */
  1484. // Data Format
  1485. col++;
  1486. cell = CellUtil.getCell(destRow2, col);
  1487. assertEquals("[Data Format] O10 cell type", Cell.CELL_TYPE_NUMERIC, cell.getCellType());
  1488. assertEquals("[Data Format] O10 cell value", 100.20, cell.getNumericCellValue(), FLOAT_PRECISION);
  1489. final String moneyFormat = "\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)";
  1490. assertEquals("[Data Format] O10 cell data format", moneyFormat, cell.getCellStyle().getDataFormatString());
  1491. // Merged
  1492. col++;
  1493. cell = CellUtil.getCell(destRow1, col);
  1494. assertEquals("[Merged] P10:Q10 cell value",
  1495. "Merged cells", cell.getStringCellValue());
  1496. assertTrue("[Merged] P10:Q10 merged region",
  1497. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("P10:Q10")));
  1498. cell = CellUtil.getCell(destRow2, col);
  1499. assertEquals("[Merged] P11:Q11 cell value", "Merged cells", cell.getStringCellValue());
  1500. assertTrue("[Merged] P11:Q11 merged region",
  1501. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("P11:Q11")));
  1502. // Should Q10/Q11 be checked?
  1503. // Merged across multiple rows
  1504. // Microsoft Excel 2013 does not copy a merged region unless all rows of
  1505. // the source merged region are selected
  1506. // POI's behavior should match this behavior
  1507. col += 2;
  1508. cell = CellUtil.getCell(destRow1, col);
  1509. assertEquals("[Merged across multiple rows] R10:S11 cell value",
  1510. "Merged cells across multiple rows", cell.getStringCellValue());
  1511. assertTrue("[Merged across multiple rows] R10:S11 merged region",
  1512. sheet.getMergedRegions().contains(CellRangeAddress.valueOf("R10:S11")));
  1513. // Row 3 (zero-based) was empty, so Row 11 (zero-based) should be empty too.
  1514. if (srcRow3 == null) {
  1515. assertNull("Row 3 was empty, so Row 11 should be empty", destRow3);
  1516. }
  1517. // Make sure other rows are blank (off-by-one errors)
  1518. assertNull("Off-by-one lower edge case", sheet.getRow(7)); //one row above destHeaderRow
  1519. assertNull("Off-by-one upper edge case", sheet.getRow(12)); //one row below destRow3
  1520. }
  1521. @Test
  1522. public void testCopyOneRow() throws IOException {
  1523. testCopyOneRow("XSSFSheet.copyRows.xlsx");
  1524. }
  1525. @Test
  1526. public void testCopyMultipleRows() throws IOException {
  1527. testCopyMultipleRows("XSSFSheet.copyRows.xlsx");
  1528. }
  1529. }