]> source.dussan.org Git - poi.git/commitdiff
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-63924...
authorNick Burch <nick@apache.org>
Mon, 16 Jun 2008 13:46:05 +0000 (13:46 +0000)
committerNick Burch <nick@apache.org>
Mon, 16 Jun 2008 13:46:05 +0000 (13:46 +0000)
https://svn.apache.org:443/repos/asf/poi/trunk

........
  r668153 | nick | 2008-06-16 14:20:42 +0100 (Mon, 16 Jun 2008) | 1 line

  Slight tweak for named ranges pointing at deleted sheets, related to bug #30978
........
  r668155 | nick | 2008-06-16 14:39:44 +0100 (Mon, 16 Jun 2008) | 1 line

  Make the test related to bug #30978, which shows that named ranges pointing to deleted sheets is ok, more complete
........

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@668157 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/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 dab9cf3ceae5731357c9a1c71ac24cdf040aa948..2804e37c3d88fc677ca76105f33aaf12c1def3ca 100644 (file)
@@ -269,7 +269,14 @@ 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);
+                       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( '!' );
                }
                
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..0a2cabe
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls differ
index b9873fa4b634edcc8d328f7753438373ddd17b45..37359231f8ec28958481e6881f48f67593262e59 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,92 @@ 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(3, b.getNumberOfNames());
+       
+       // Sheet 2 is deleted
+       assertEquals("Sheet1", b.getSheetName(0));
+       assertEquals("Sheet3", b.getSheetName(1));
+       
+       Area3DPtg ptg;
+       NameRecord nr;
+       HSSFName n;
+       
+       /* ======= Name pointing to deleted sheet ====== */
+       
+       // First at low level
+       nr = b.getWorkbook().getNameRecord(0);
+       assertEquals("On2", nr.getNameText());
+       assertEquals(0, nr.getIndexToSheet());
+       assertEquals(1, nr.getExternSheetNumber());
+       assertEquals(1, nr.getNameDefinition().size());
+       
+       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
+       n = b.getNameAt(0);
+       assertEquals("On2", n.getNameName());
+       assertEquals("", n.getSheetName());
+       assertEquals("#REF!$A$1:$A$3", n.getReference());
+       
+       
+       /* ======= Name pointing to 1st sheet ====== */
+       
+       // First at low level
+       nr = b.getWorkbook().getNameRecord(1);
+       assertEquals("OnOne", nr.getNameText());
+       assertEquals(0, nr.getIndexToSheet());
+       assertEquals(0, nr.getExternSheetNumber());
+       assertEquals(1, nr.getNameDefinition().size());
+       
+       ptg = (Area3DPtg)nr.getNameDefinition().get(0);
+       assertEquals(0, ptg.getExternSheetIndex());
+       assertEquals(0, ptg.getFirstColumn());
+       assertEquals(2, ptg.getFirstRow());
+       assertEquals(0, ptg.getLastColumn());
+       assertEquals(3, ptg.getLastRow());
+       
+       // Now at high level
+       n = b.getNameAt(1);
+       assertEquals("OnOne", n.getNameName());
+       assertEquals("Sheet1", n.getSheetName());
+       assertEquals("Sheet1!$A$3:$A$4", n.getReference());
+       
+       
+       /* ======= Name pointing to 3rd sheet ====== */
+       
+       // First at low level
+       nr = b.getWorkbook().getNameRecord(2);
+       assertEquals("OnSheet3", nr.getNameText());
+       assertEquals(0, nr.getIndexToSheet());
+       assertEquals(2, nr.getExternSheetNumber());
+       assertEquals(1, nr.getNameDefinition().size());
+       
+       ptg = (Area3DPtg)nr.getNameDefinition().get(0);
+       assertEquals(2, ptg.getExternSheetIndex());
+       assertEquals(0, ptg.getFirstColumn());
+       assertEquals(0, ptg.getFirstRow());
+       assertEquals(0, ptg.getLastColumn());
+       assertEquals(1, ptg.getLastRow());
+       
+       // Now at high level
+       n = b.getNameAt(2);
+       assertEquals("OnSheet3", n.getNameName());
+       assertEquals("Sheet3", n.getSheetName());
+       assertEquals("Sheet3!$A$1:$A$2", n.getReference());
+    }
+    
     /**
      * result returned by getRecordSize() differs from result returned by serialize()
      */