A partial fix for bug #30978, but something still remains, which seems to be related to changing the ptg

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@669140 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2008-06-18 11:35:04 +00:00
parent 5fecdc61aa
commit 8a92f65d09
3 changed files with 84 additions and 2 deletions

View File

@ -604,8 +604,28 @@ public class Workbook implements Model
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
));
}
}
}
/**

Binary file not shown.

View File

@ -28,7 +28,10 @@ import junit.framework.AssertionFailedError;
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;
@ -989,4 +992,63 @@ public final class TestBugs extends TestCase {
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);
}
}
}