fixTabIdRecord();
}
- // If we decide that we need to fix up
- // NameRecords, do it here
+ // Within NameRecords, it's ok to have the formula
+ // part point at deleted sheets. It's also ok to
+ // have the ExternSheetNumber point at deleted
+ // sheets.
+ // However, the sheet index must be adjusted, or
+ // excel will break. (Sheet index is either 0 for
+ // global, or 1 based index to sheet)
+ int sheetNum1Based = sheetnum + 1;
+ for(int i=0; i<getNumNames(); i++) {
+ NameRecord nr = getNameRecord(i);
+
+ if(nr.getIndexToSheet() == sheetNum1Based) {
+ // Excel re-writes these to point to no sheet
+ nr.setEqualsToIndexToSheet((short)0);
+ } else if(nr.getIndexToSheet() > sheetNum1Based) {
+ // Bump down by one, so still points
+ // at the same sheet
+ nr.setEqualsToIndexToSheet((short)(
+ nr.getEqualsToIndexToSheet()-1
+ ));
+ }
+ }
}
/**
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
+import org.apache.poi.hssf.record.NameRecord;
+import org.apache.poi.hssf.record.formula.DeletedArea3DPtg;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.util.TempFile;
fail();
} catch(FileNotFoundException e) {}
}
+
+ /**
+ * Test that we can delete sheets without
+ * breaking the build in named ranges
+ * used for printing stuff.
+ * Currently broken, as we change the Ptg
+ */
+ public void BROKENtest30978() throws Exception {
+ HSSFWorkbook wb = openSample("30978-alt.xls");
+ assertEquals(1, wb.getNumberOfNames());
+ assertEquals(3, wb.getNumberOfSheets());
+
+ // Check all names fit within range, and use
+ // DeletedArea3DPtg
+ Workbook w = wb.getWorkbook();
+ for(int i=0; i<w.getNumNames(); i++) {
+ NameRecord r = w.getNameRecord(i);
+ assertTrue(r.getIndexToSheet() <= wb.getNumberOfSheets());
+
+ List nd = r.getNameDefinition();
+ assertEquals(1, nd.size());
+ assertTrue(nd.get(0) instanceof DeletedArea3DPtg);
+ }
+
+
+ // Delete the 2nd sheet
+ wb.removeSheetAt(1);
+
+
+ // Re-check
+ assertEquals(1, wb.getNumberOfNames());
+ assertEquals(2, wb.getNumberOfSheets());
+
+ for(int i=0; i<w.getNumNames(); i++) {
+ NameRecord r = w.getNameRecord(i);
+ assertTrue(r.getIndexToSheet() <= wb.getNumberOfSheets());
+
+ List nd = r.getNameDefinition();
+ assertEquals(1, nd.size());
+ assertTrue(nd.get(0) instanceof DeletedArea3DPtg);
+ }
+
+
+ // Save and re-load
+ wb = writeOutAndReadBack(wb);
+ w = wb.getWorkbook();
+
+ assertEquals(1, wb.getNumberOfNames());
+ assertEquals(2, wb.getNumberOfSheets());
+
+ for(int i=0; i<w.getNumNames(); i++) {
+ NameRecord r = w.getNameRecord(i);
+ assertTrue(r.getIndexToSheet() <= wb.getNumberOfSheets());
+
+ List nd = r.getNameDefinition();
+ assertEquals(1, nd.size());
+ assertTrue(nd.get(0) instanceof DeletedArea3DPtg);
+ }
+ }
}