From ca4a7d2f2794e035a441ae3f5797b929218e14e8 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 29 Oct 2016 07:38:46 +0000 Subject: [PATCH] Bug 53611: populate dimension of XSSF Worksheet when writing the document git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1767096 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFSheet.java | 20 +++++++++++ .../poi/xssf/usermodel/TestXSSFBugs.java | 35 +++++++++++++++---- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 03cfad67a..231d64e72 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -3451,8 +3451,28 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { worksheet.getHyperlinks().setHyperlinkArray(ctHls); } + int minCell=Integer.MAX_VALUE, maxCell=Integer.MIN_VALUE; for(XSSFRow row : _rows.values()){ + // first perform the normal write actions for the row row.onDocumentWrite(); + + // then calculate min/max cell-numbers for the worksheet-dimension + if(row.getFirstCellNum() != -1) { + minCell = Math.min(minCell, row.getFirstCellNum()); + } + if(row.getLastCellNum() != -1) { + maxCell = Math.max(maxCell, row.getLastCellNum()); + } + } + + // finally, if we had at least one cell we can populate the optional dimension-field + if(minCell != Integer.MAX_VALUE) { + String ref = new CellRangeAddress(getFirstRowNum(), getLastRowNum(), minCell, maxCell).formatAsString(); + if(worksheet.isSetDimension()) { + worksheet.getDimension().setRef(ref); + } else { + worksheet.addNewDimension().setRef(ref); + } } XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index d6d26943b..26449f011 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -25,13 +25,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; @@ -3169,4 +3163,31 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { sheet = wb.getSheetAt(4); assertNotNull(sheet.getDrawingPatriarch()); } + + @Test + public void test53611() throws IOException { + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("test"); + Row row = sheet.createRow(1); + Cell cell = row.createCell(1); + cell.setCellValue("blabla"); + + row = sheet.createRow(4); + cell = row.createCell(7); + cell.setCellValue("blabla"); + + // we currently only populate the dimension during writing out + // to avoid having to iterate all rows/cells in each add/remove of a row or cell + //OutputStream str = new FileOutputStream("/tmp/53611.xlsx"); + OutputStream str = new ByteArrayOutputStream(); + try { + wb.write(str); + } finally { + str.close(); + } + + assertEquals("B2:I5", ((XSSFSheet)sheet).getCTWorksheet().getDimension().getRef()); + + wb.close(); + } }