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();
|
fixTabIdRecord();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we decide that we need to fix up
|
// Within NameRecords, it's ok to have the formula
|
||||||
// NameRecords, do it here
|
// 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 junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
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.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.hssf.util.Region;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
|
|
||||||
@ -989,4 +992,63 @@ public final class TestBugs extends TestCase {
|
|||||||
fail();
|
fail();
|
||||||
} catch(FileNotFoundException e) {}
|
} 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