]> source.dussan.org Git - poi.git/commitdiff
Bug 53611: populate dimension of XSSF Worksheet when writing the document
authorDominik Stadler <centic@apache.org>
Sat, 29 Oct 2016 07:38:46 +0000 (07:38 +0000)
committerDominik Stadler <centic@apache.org>
Sat, 29 Oct 2016 07:38:46 +0000 (07:38 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1767096 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 03cfad67a39112e55c233c549bce2f06893fefd5..231d64e72af4ba9ff8b63abe1475bb51c6a97d9b 100644 (file)
@@ -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);
index d6d26943b1dcf648786846b00457bd6aed688271..26449f0115944db96e7a39d40b24af3d870929f1 100644 (file)
@@ -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();
+    }
 }