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.

TestDeferredSXSSFWorkbook.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*
  2. * ====================================================================
  3. * Licensed to the Apache Software Foundation (ASF) under one or more
  4. * contributor license agreements. See the NOTICE file distributed with
  5. * this work for additional information regarding copyright ownership.
  6. * The ASF licenses this file to You under the Apache License, Version 2.0
  7. * (the "License"); you may not use this file except in compliance with
  8. * the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. * ====================================================================
  18. */
  19. package org.apache.poi.xssf.streaming;
  20. import static org.junit.jupiter.api.Assertions.assertEquals;
  21. import static org.junit.jupiter.api.Assertions.assertNotNull;
  22. import static org.junit.jupiter.api.Assertions.assertNull;
  23. import static org.junit.jupiter.api.Assertions.assertSame;
  24. import static org.junit.jupiter.api.Assertions.assertThrows;
  25. import static org.junit.jupiter.api.Assertions.assertTrue;
  26. import java.io.IOException;
  27. import org.apache.poi.ss.tests.usermodel.BaseTestXWorkbook;
  28. import org.apache.poi.ss.usermodel.Cell;
  29. import org.apache.poi.ss.usermodel.Row;
  30. import org.apache.poi.ss.usermodel.Sheet;
  31. import org.apache.poi.ss.util.CellReference;
  32. import org.apache.poi.xssf.DeferredSXSSFITestDataProvider;
  33. import org.apache.poi.xssf.usermodel.XSSFCell;
  34. import org.apache.poi.xssf.usermodel.XSSFRow;
  35. import org.apache.poi.xssf.usermodel.XSSFSheet;
  36. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  37. import org.junit.jupiter.api.AfterEach;
  38. import org.junit.jupiter.api.Disabled;
  39. import org.junit.jupiter.api.Test;
  40. public final class TestDeferredSXSSFWorkbook extends BaseTestXWorkbook {
  41. public TestDeferredSXSSFWorkbook() {
  42. super(DeferredSXSSFITestDataProvider.instance);
  43. }
  44. @AfterEach
  45. public void tearDown() {
  46. ((DeferredSXSSFITestDataProvider) _testDataProvider).cleanup();
  47. }
  48. /**
  49. * cloning of sheets is not supported in SXSSF
  50. */
  51. @Override
  52. @Test
  53. public void cloneSheet() throws IOException {
  54. RuntimeException e = assertThrows(RuntimeException.class, super::cloneSheet);
  55. assertEquals("Not Implemented", e.getMessage());
  56. }
  57. /**
  58. * cloning of sheets is not supported in SXSSF
  59. */
  60. @Override
  61. @Test
  62. public void sheetClone() throws IOException {
  63. RuntimeException e = assertThrows(RuntimeException.class, super::sheetClone);
  64. assertEquals("Not Implemented", e.getMessage());
  65. }
  66. /**
  67. * Skip this test, as SXSSF doesn't update formulas on sheet name changes.
  68. */
  69. @Override
  70. @Disabled("SXSSF doesn't update formulas on sheet name changes, as most cells probably aren't in memory at the time")
  71. @Test
  72. public void setSheetName() {}
  73. @Override
  74. @Disabled("DeferredSXSSF code disposes rows in a way that breaks this test")
  75. @Test
  76. public void parentReferences() {}
  77. @Override
  78. @Disabled("DeferredSXSSF code disposes rows in a way that breaks this test")
  79. @Test
  80. public void unicodeInAll() {}
  81. @Test
  82. public void existingWorkbook() throws IOException {
  83. XSSFWorkbook xssfWb1 = new XSSFWorkbook();
  84. xssfWb1.createSheet("S1");
  85. DeferredSXSSFWorkbook wb1 = new DeferredSXSSFWorkbook(xssfWb1);
  86. XSSFWorkbook xssfWb2 = DeferredSXSSFITestDataProvider.instance.writeOutAndReadBack(wb1);
  87. assertTrue(wb1.dispose());
  88. DeferredSXSSFWorkbook wb2 = new DeferredSXSSFWorkbook(xssfWb2);
  89. assertEquals(1, wb2.getNumberOfSheets());
  90. Sheet sheet = wb2.getStreamingSheetAt(0);
  91. assertNotNull(sheet);
  92. assertEquals("S1", sheet.getSheetName());
  93. assertTrue(wb2.dispose());
  94. xssfWb2.close();
  95. xssfWb1.close();
  96. wb2.close();
  97. wb1.close();
  98. }
  99. @Test
  100. public void addToExistingWorkbook() throws IOException {
  101. XSSFWorkbook xssfWb1 = new XSSFWorkbook();
  102. xssfWb1.createSheet("S1");
  103. Sheet sheet = xssfWb1.createSheet("S2");
  104. Row row = sheet.createRow(1);
  105. Cell cell = row.createCell(1);
  106. cell.setCellValue("value 2_1_1");
  107. DeferredSXSSFWorkbook wb1 = new DeferredSXSSFWorkbook(xssfWb1);
  108. XSSFWorkbook xssfWb2 = DeferredSXSSFITestDataProvider.instance.writeOutAndReadBack(wb1);
  109. assertTrue(wb1.dispose());
  110. xssfWb1.close();
  111. DeferredSXSSFWorkbook wb2 = new DeferredSXSSFWorkbook(xssfWb2);
  112. // Add a row to the existing empty sheet
  113. DeferredSXSSFSheet ssheet1 = wb2.getStreamingSheetAt(0);
  114. ssheet1.setRowGenerator((ssxSheet) -> {
  115. Row row1_1 = ssxSheet.createRow(1);
  116. Cell cell1_1_1 = row1_1.createCell(1);
  117. cell1_1_1.setCellValue("value 1_1_1");
  118. });
  119. // Add a row to the existing non-empty sheet
  120. DeferredSXSSFSheet ssheet2 = wb2.getStreamingSheetAt(1);
  121. ssheet2.setRowGenerator((ssxSheet) -> {
  122. Row row2_2 = ssxSheet.createRow(2);
  123. Cell cell2_2_1 = row2_2.createCell(1);
  124. cell2_2_1.setCellValue("value 2_2_1");
  125. });
  126. // Add a sheet with one row
  127. DeferredSXSSFSheet ssheet3 = wb2.createSheet("S3");
  128. ssheet3.setRowGenerator((ssxSheet) -> {
  129. Row row3_1 = ssxSheet.createRow(1);
  130. Cell cell3_1_1 = row3_1.createCell(1);
  131. cell3_1_1.setCellValue("value 3_1_1");
  132. });
  133. XSSFWorkbook xssfWb3 = DeferredSXSSFITestDataProvider.instance.writeOutAndReadBack(wb2);
  134. wb2.close();
  135. assertEquals(3, xssfWb3.getNumberOfSheets());
  136. // Verify sheet 1
  137. XSSFSheet sheet1 = xssfWb3.getSheetAt(0);
  138. assertEquals("S1", sheet1.getSheetName());
  139. assertEquals(1, sheet1.getPhysicalNumberOfRows());
  140. XSSFRow row1_1 = sheet1.getRow(1);
  141. assertNotNull(row1_1);
  142. XSSFCell cell1_1_1 = row1_1.getCell(1);
  143. assertNotNull(cell1_1_1);
  144. assertEquals("value 1_1_1", cell1_1_1.getStringCellValue());
  145. // Verify sheet 2
  146. XSSFSheet sheet2 = xssfWb3.getSheetAt(1);
  147. assertEquals("S2", sheet2.getSheetName());
  148. assertEquals(2, sheet2.getPhysicalNumberOfRows());
  149. Row row2_1 = sheet2.getRow(1);
  150. assertNotNull(row2_1);
  151. Cell cell2_1_1 = row2_1.getCell(1);
  152. assertNotNull(cell2_1_1);
  153. assertEquals("value 2_1_1", cell2_1_1.getStringCellValue());
  154. XSSFRow row2_2 = sheet2.getRow(2);
  155. assertNotNull(row2_2);
  156. XSSFCell cell2_2_1 = row2_2.getCell(1);
  157. assertNotNull(cell2_2_1);
  158. assertEquals("value 2_2_1", cell2_2_1.getStringCellValue());
  159. // Verify sheet 3
  160. XSSFSheet sheet3 = xssfWb3.getSheetAt(2);
  161. assertEquals("S3", sheet3.getSheetName());
  162. assertEquals(1, sheet3.getPhysicalNumberOfRows());
  163. XSSFRow row3_1 = sheet3.getRow(1);
  164. assertNotNull(row3_1);
  165. XSSFCell cell3_1_1 = row3_1.getCell(1);
  166. assertNotNull(cell3_1_1);
  167. assertEquals("value 3_1_1", cell3_1_1.getStringCellValue());
  168. xssfWb2.close();
  169. xssfWb3.close();
  170. wb1.close();
  171. }
  172. @Test
  173. public void sheetdataWriter() throws IOException {
  174. DeferredSXSSFWorkbook wb = new DeferredSXSSFWorkbook();
  175. SXSSFSheet sh = wb.createSheet();
  176. assertSame(sh.getClass(), DeferredSXSSFSheet.class);
  177. SheetDataWriter wr = sh.getSheetDataWriter();
  178. assertNull(wr);
  179. wb.close();
  180. }
  181. @Test
  182. public void removeSheet() throws IOException {
  183. try (DeferredSXSSFWorkbook wb = new DeferredSXSSFWorkbook()) {
  184. DeferredSXSSFSheet sheet1 = wb.createSheet("sheet1");
  185. sheet1.setRowGenerator((sh) -> {
  186. Row row = sh.createRow(0);
  187. Cell cell = row.createCell(0);
  188. cell.setCellValue("sheet1");
  189. });
  190. DeferredSXSSFSheet sheet2 = wb.createSheet("sheet2");
  191. sheet2.setRowGenerator((sh) -> {
  192. Row row = sh.createRow(0);
  193. Cell cell = row.createCell(0);
  194. cell.setCellValue("sheet2");
  195. });
  196. wb.removeSheetAt(0);
  197. try (XSSFWorkbook wb2 = DeferredSXSSFITestDataProvider.instance.writeOutAndReadBack(wb)) {
  198. assertNull(wb2.getSheet( "sheet1"));
  199. XSSFSheet xssfSheet = wb2.getSheet( "sheet2");
  200. assertNotNull(xssfSheet);
  201. assertEquals("sheet2", xssfSheet.getRow(0).getCell(0).getStringCellValue());
  202. }
  203. }
  204. }
  205. @Test
  206. public void gzipSheetdataWriter() throws IOException {
  207. DeferredSXSSFWorkbook wb = new DeferredSXSSFWorkbook();
  208. final int rowNum = 1000;
  209. final int sheetNum = 5;
  210. populateData(wb, 1000, 5);
  211. XSSFWorkbook xwb = DeferredSXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
  212. for (int i = 0; i < sheetNum; i++) {
  213. Sheet sh = xwb.getSheetAt(i);
  214. assertEquals("sheet" + i, sh.getSheetName());
  215. for (int j = 0; j < rowNum; j++) {
  216. Row row = sh.getRow(j);
  217. assertNotNull(row, "row[" + j + "]");
  218. Cell cell1 = row.getCell(0);
  219. assertEquals(new CellReference(cell1).formatAsString(), cell1.getStringCellValue());
  220. Cell cell2 = row.getCell(1);
  221. assertEquals(i, (int) cell2.getNumericCellValue());
  222. Cell cell3 = row.getCell(2);
  223. assertEquals(j, (int) cell3.getNumericCellValue());
  224. }
  225. }
  226. assertTrue(wb.dispose());
  227. xwb.close();
  228. wb.close();
  229. }
  230. @Test
  231. public void workbookDispose() throws IOException {
  232. DeferredSXSSFWorkbook wb1 = new DeferredSXSSFWorkbook();
  233. // the underlying writer is SheetDataWriter
  234. assertWorkbookDispose(wb1);
  235. wb1.close();
  236. DeferredSXSSFWorkbook wb2 = new DeferredSXSSFWorkbook();
  237. wb2.setCompressTempFiles(true);
  238. // the underlying writer is GZIPSheetDataWriter
  239. assertWorkbookDispose(wb2);
  240. wb2.close();
  241. }
  242. private static void assertWorkbookDispose(DeferredSXSSFWorkbook wb) {
  243. populateData(wb, 1000, 5);
  244. for (Sheet sheet : wb) {
  245. DeferredSXSSFSheet sxSheet = (DeferredSXSSFSheet) sheet;
  246. assertNull(sxSheet.getSheetDataWriter());
  247. }
  248. assertTrue(wb.dispose());
  249. for (Sheet sheet : wb) {
  250. DeferredSXSSFSheet sxSheet = (DeferredSXSSFSheet) sheet;
  251. assertNull(sxSheet.getSheetDataWriter());
  252. }
  253. }
  254. private static void populateData(DeferredSXSSFWorkbook wb, final int rowNum, final int sheetNum) {
  255. for (int i = 0; i < sheetNum; i++) {
  256. DeferredSXSSFSheet sheet = wb.createSheet("sheet" + i);
  257. int index = i;
  258. sheet.setRowGenerator((sh) -> {
  259. for (int j = 0; j < rowNum; j++) {
  260. Row row = sh.createRow(j);
  261. Cell cell1 = row.createCell(0);
  262. cell1.setCellValue(new CellReference(cell1).formatAsString());
  263. Cell cell2 = row.createCell(1);
  264. cell2.setCellValue(index);
  265. Cell cell3 = row.createCell(2);
  266. cell3.setCellValue(j);
  267. }
  268. });
  269. }
  270. }
  271. public void changeSheetNameWithSharedFormulas() {
  272. /* not implemented */
  273. }
  274. }