Bug 56325: fix Exception when removing sheets with named ranges in the workbook
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1595048 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9efc349872
commit
8e6c459d83
@ -716,11 +716,15 @@ public final class InternalWorkbook {
|
|||||||
// Bump down by one, so still points
|
// Bump down by one, so still points
|
||||||
// at the same sheet
|
// at the same sheet
|
||||||
nr.setSheetNumber(nr.getSheetNumber()-1);
|
nr.setSheetNumber(nr.getSheetNumber()-1);
|
||||||
|
|
||||||
// also update the link-table as otherwise references might point at invalid sheets
|
|
||||||
linkTable.updateIndexToInternalSheet(i, -1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// also tell the LinkTable about the removed sheet
|
||||||
|
// +1 because we already removed it from the count of sheets!
|
||||||
|
for(int i = sheetIndex+1;i < getNumSheets()+1;i++) {
|
||||||
|
// also update the link-table as otherwise references might point at invalid sheets
|
||||||
|
linkTable.removeSheet(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -415,10 +415,18 @@ final class LinkTable {
|
|||||||
return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
|
return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Was prevously used for removing sheets, which we now do differently
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public void updateIndexToInternalSheet(int extRefIndex, int offset) {
|
public void updateIndexToInternalSheet(int extRefIndex, int offset) {
|
||||||
_externSheetRecord.adjustIndex(extRefIndex, offset);
|
_externSheetRecord.adjustIndex(extRefIndex, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeSheet(int sheetIdx) {
|
||||||
|
_externSheetRecord.removeSheet(sheetIdx);
|
||||||
|
}
|
||||||
|
|
||||||
public int getSheetIndexFromExternSheetIndex(int extRefIndex) {
|
public int getSheetIndexFromExternSheetIndex(int extRefIndex) {
|
||||||
if (extRefIndex >= _externSheetRecord.getNumOfRefs() || extRefIndex < 0) {
|
if (extRefIndex >= _externSheetRecord.getNumOfRefs() || extRefIndex < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -453,8 +461,8 @@ final class LinkTable {
|
|||||||
*/
|
*/
|
||||||
private int findFirstRecordLocBySid(short sid) {
|
private int findFirstRecordLocBySid(short sid) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (Iterator iterator = _workbookRecordList.iterator(); iterator.hasNext(); ) {
|
for (Iterator<Record> iterator = _workbookRecordList.iterator(); iterator.hasNext(); ) {
|
||||||
Record record = ( Record ) iterator.next();
|
Record record = iterator.next();
|
||||||
|
|
||||||
if (record.getSid() == sid) {
|
if (record.getSid() == sid) {
|
||||||
return index;
|
return index;
|
||||||
|
@ -164,10 +164,34 @@ public class ExternSheetRecord extends StandardRecord {
|
|||||||
return _list.get(i);
|
return _list.get(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Was prevously used for removing sheets, which we now do differently
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public void adjustIndex(int extRefIndex, int offset) {
|
public void adjustIndex(int extRefIndex, int offset) {
|
||||||
getRef(extRefIndex).adjustIndex(offset);
|
getRef(extRefIndex).adjustIndex(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeSheet(int sheetIdx) {
|
||||||
|
int nItems = _list.size();
|
||||||
|
int toRemove = -1;
|
||||||
|
for (int i = 0; i < nItems; i++) {
|
||||||
|
RefSubRecord refSubRecord = _list.get(i);
|
||||||
|
if(refSubRecord.getFirstSheetIndex() == sheetIdx &&
|
||||||
|
refSubRecord.getLastSheetIndex() == sheetIdx) {
|
||||||
|
toRemove = i;
|
||||||
|
} else if (refSubRecord.getFirstSheetIndex() > sheetIdx &&
|
||||||
|
refSubRecord.getLastSheetIndex() > sheetIdx) {
|
||||||
|
_list.set(i, new RefSubRecord(refSubRecord.getExtBookIndex(), refSubRecord.getFirstSheetIndex()-1, refSubRecord.getLastSheetIndex()-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally remove entries for sheet indexes that we remove
|
||||||
|
if(toRemove != -1) {
|
||||||
|
_list.remove(toRemove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the non static version of the id for this record.
|
* return the non static version of the id for this record.
|
||||||
*/
|
*/
|
||||||
|
@ -27,9 +27,11 @@ import static org.junit.Assert.fail;
|
|||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
@ -2582,4 +2584,32 @@ public final class TestBugs extends BaseTestBugzillaIssues {
|
|||||||
|
|
||||||
assertEquals(5, cf.getNumConditionalFormattings());
|
assertEquals(5, cf.getNumConditionalFormattings());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void bug56325() throws IOException {
|
||||||
|
HSSFWorkbook wb;
|
||||||
|
|
||||||
|
File file = HSSFTestDataSamples.getSampleFile("56325.xls");
|
||||||
|
InputStream stream = new FileInputStream(file);
|
||||||
|
try {
|
||||||
|
POIFSFileSystem fs = new POIFSFileSystem(stream);
|
||||||
|
wb = new HSSFWorkbook(fs);
|
||||||
|
} finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(3, wb.getNumberOfSheets());
|
||||||
|
wb.removeSheetAt(0);
|
||||||
|
assertEquals(2, wb.getNumberOfSheets());
|
||||||
|
|
||||||
|
wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
|
||||||
|
assertEquals(2, wb.getNumberOfSheets());
|
||||||
|
wb.removeSheetAt(0);
|
||||||
|
assertEquals(1, wb.getNumberOfSheets());
|
||||||
|
wb.removeSheetAt(0);
|
||||||
|
assertEquals(0, wb.getNumberOfSheets());
|
||||||
|
|
||||||
|
wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
|
||||||
|
assertEquals(0, wb.getNumberOfSheets());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
test-data/spreadsheet/56325.xls
Normal file
BIN
test-data/spreadsheet/56325.xls
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user