]> source.dussan.org Git - poi.git/commitdiff
Bug #53404 - Fixed compatibility issue with modifying xls files created by POI-3...
authorYegor Kozlov <yegor@apache.org>
Thu, 25 Oct 2012 15:13:53 +0000 (15:13 +0000)
committerYegor Kozlov <yegor@apache.org>
Thu, 25 Oct 2012 15:13:53 +0000 (15:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1402186 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/model/InternalWorkbook.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/53404.xls [new file with mode: 0644]

index 0bfd8534ebace2cf137fad5d75f46e0806b87719..b72f05ebeb8fede5c50b7dac980d89063c467016 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.9-beta1" date="2012-??-??">
+          <action dev="poi-developers" type="add">53404 - Fixed compatibility bug with modifying xls files created by POI-3.6 and earlier</action>
           <action dev="poi-developers" type="add">53979 - Support fetching properties of Numbered Lists from PPT files</action>
           <action dev="poi-developers" type="add">53784 - Partial HSMF support for fixed sized properties</action>
           <action dev="poi-developers" type="add">53943 - added method processSymbol() to allow converting word symbols   </action>
index 88b9d63ef501eead4d0ec2c31c8b713cc5c6771f..a989c32b98d012a3af99aa6ca603c842b13a18be 100644 (file)
@@ -740,15 +740,6 @@ public final class InternalWorkbook {
             boundsheets.add(bsr);
             getOrCreateLinkTable().checkExternSheet(sheetnum);
             fixTabIdRecord();
-        } else {
-           // Ensure we have enough tab IDs
-           // Can be a few short if new sheets were added
-           if(records.getTabpos() > 0) {
-              TabIdRecord tir = ( TabIdRecord ) records.get(records.getTabpos());
-              if(tir._tabids.length < boundsheets.size()) {
-                 fixTabIdRecord();
-              }
-           }
         }
     }
 
@@ -787,15 +778,19 @@ public final class InternalWorkbook {
     /**
      * make the tabid record look like the current situation.
      *
+     * @return number of bytes written in the TabIdRecord
      */
-    private void fixTabIdRecord() {
+    private int fixTabIdRecord() {
         TabIdRecord tir = ( TabIdRecord ) records.get(records.getTabpos());
+        int sz = tir.getRecordSize();
         short[]     tia = new short[ boundsheets.size() ];
 
         for (short k = 0; k < tia.length; k++) {
             tia[ k ] = k;
         }
         tir.setTabIdArray(tia);
+        return tir.getRecordSize() - sz;
+
     }
 
     /**
@@ -1066,6 +1061,22 @@ public final class InternalWorkbook {
         return pos;
     }
 
+    /**
+     * Perform any work necessary before the workbook is about to be serialized.
+     *
+     * Include in it ant code that modifies the workbook record stream and affects its size.
+     */
+    public void preSerialize(){
+        // Ensure we have enough tab IDs
+        // Can be a few short if new sheets were added
+        if(records.getTabpos() > 0) {
+            TabIdRecord tir = ( TabIdRecord ) records.get(records.getTabpos());
+            if(tir._tabids.length < boundsheets.size()) {
+                fixTabIdRecord();
+            }
+        }
+    }
+
     public int getSize()
     {
         int retval = 0;
index add83e7e6897815710925f2f4731b34b6fea5090..c218775886a518461282842ec372eee207b26ec8 100644 (file)
@@ -1241,8 +1241,10 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
         HSSFSheet[] sheets = getSheets();
         int nSheets = sheets.length;
 
+
         // before getting the workbook size we must tell the sheets that
         // serialization is about to occur.
+        workbook.preSerialize();
         for (int i = 0; i < nSheets; i++) {
             sheets[i].getSheet().preSerialize();
             sheets[i].preSerialize();
index 8f4a4ec652dc0f6f4b98df3cf2319a229dcf6162..7dd8591b8488109f3b5d2d4cd0d08db6c90bb18e 100644 (file)
@@ -40,10 +40,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.TempFile;
 
 import java.io.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 /**
  * Testcases for bugs entered in bugzilla
@@ -2297,4 +2294,23 @@ if(1==2) {
 
         wb = writeOutAndReadBack((HSSFWorkbook) wb);
     }
+
+    public void test53404(){
+        Workbook wb = openSample("53404.xls");
+        Sheet sheet = wb.getSheet("test-sheet");
+        int rowCount = sheet.getLastRowNum() + 1;
+        int newRows = 5;
+        for (int r = rowCount; r < rowCount + newRows; r++) {
+            Row row = sheet.createRow((short) r);
+            row.createCell(0).setCellValue(1.03 * (r + 7));
+            row.createCell(1).setCellValue(new Date());
+            row.createCell(2).setCellValue(Calendar.getInstance());
+            row.createCell(3).setCellValue(String.format("row:%d/col:%d", r, 3));
+            row.createCell(4).setCellValue(true);
+            row.createCell(5).setCellType(Cell.CELL_TYPE_ERROR);
+            row.createCell(6).setCellValue("added cells.");
+        }
+
+        wb = writeOutAndReadBack((HSSFWorkbook) wb);
+    }
 }
diff --git a/test-data/spreadsheet/53404.xls b/test-data/spreadsheet/53404.xls
new file mode 100644 (file)
index 0000000..d436e1e
Binary files /dev/null and b/test-data/spreadsheet/53404.xls differ