]> source.dussan.org Git - poi.git/commitdiff
Slight tweak for named ranges pointing at deleted sheets, related to bug #30978
authorNick Burch <nick@apache.org>
Mon, 16 Jun 2008 13:20:42 +0000 (13:20 +0000)
committerNick Burch <nick@apache.org>
Mon, 16 Jun 2008 13:20:42 +0000 (13:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@668153 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/model/Workbook.java
src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
src/java/org/apache/poi/hssf/usermodel/HSSFName.java
src/testcases/org/apache/poi/hssf/data/30978-deleted.xls [new file with mode: 0755]
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

index d87fc2c632dae81716f3008be3370f70a3e50d9f..5b38935f4c593d38cc4858ae4686e4b675212c29 100644 (file)
@@ -603,6 +603,9 @@ public class Workbook implements Model
             boundsheets.remove(sheetnum);
             fixTabIdRecord();
         }
+        
+        // If we decide that we need to fix up
+        //  NameRecords, do it here
     }
 
     /**
index 60911edc7276267e5fe5c9e4bf6f8a20ef65b4c8..e8f72e99377d4a9a053268f149aaa684f7825850 100644 (file)
@@ -269,8 +269,15 @@ public class Area3DPtg extends OperandPtg implements AreaI {
                StringBuffer retval = new StringBuffer();
                String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet);
                if(sheetName != null) {
-                       SheetNameFormatter.appendFormat(retval, sheetName);
-                       retval.append( '!' );
+                       if(sheetName.length() == 0) {
+                               // What excel does if sheet has been deleted
+                               sheetName = "#REF";
+                               retval.append(sheetName);
+                       } else {
+                               // Normal
+                               SheetNameFormatter.appendFormat(retval, sheetName);
+                               retval.append( '!' );
+                       }
                }
                
                // Now the normal area bit
index e24ca23ea85fbc48f45d945a0300db6de803fa22..240be13f5819255d1b7f45d15e5046f92e912194 100644 (file)
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.hssf.model.Workbook;
-import org.apache.poi.hssf.record.BoundSheetRecord;
 import org.apache.poi.hssf.record.NameRecord;
 import org.apache.poi.hssf.util.RangeAddress;
 
diff --git a/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls b/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls
new file mode 100755 (executable)
index 0000000..1daca5b
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls differ
index b9873fa4b634edcc8d328f7753438373ddd17b45..2fca481481db07221ee1356a6f99c2fca2b3d85c 100644 (file)
@@ -30,6 +30,7 @@ import org.apache.poi.hssf.model.Sheet;
 import org.apache.poi.hssf.record.NameRecord;
 import org.apache.poi.hssf.record.Record;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.record.formula.Area3DPtg;
 import org.apache.poi.util.TempFile;
 /**
  *
@@ -402,6 +403,39 @@ public final class TestHSSFWorkbook extends TestCase {
             assertTrue(e.getMessage().startsWith("Actual serialized sheet size"));
         }
     }
+    
+    /**
+     * Checks that us and HSSFName play nicely with named ranges
+     *  that point to deleted sheets
+     */
+    public void testNamesToDeleteSheets() throws Exception {
+       HSSFWorkbook b = openSample("30978-deleted.xls");
+       assertEquals(1, b.getNumberOfNames());
+       
+       // Sheet 2 deleted
+       assertEquals("Sheet1", b.getSheetName(0));
+       assertEquals("Sheet3", b.getSheetName(1));
+       
+       // First at low level
+       NameRecord nr = b.getWorkbook().getNameRecord(0);
+       assertEquals("On2", nr.getNameText());
+       assertEquals(1, nr.getExternSheetNumber());
+       assertEquals(1, nr.getNameDefinition().size());
+       
+       Area3DPtg ptg = (Area3DPtg)nr.getNameDefinition().get(0);
+       assertEquals(1, ptg.getExternSheetIndex());
+       assertEquals(0, ptg.getFirstColumn());
+       assertEquals(0, ptg.getFirstRow());
+       assertEquals(0, ptg.getLastColumn());
+       assertEquals(2, ptg.getLastRow());
+       
+       // Now at high level
+       HSSFName n = b.getNameAt(0);
+       assertEquals("On2", n.getNameName());
+       assertEquals("", n.getSheetName());
+       assertEquals("#REF$A$1:$A$3", n.getReference());
+    }
+    
     /**
      * result returned by getRecordSize() differs from result returned by serialize()
      */