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:
parent
5fecdc61aa
commit
8a92f65d09
@ -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
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
BIN
src/testcases/org/apache/poi/hssf/data/30978-alt.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/30978-alt.xls
Normal file
Binary file not shown.
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user