// Bump down by one, so still points
// at the same sheet
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);
+ }
}
/**
public int getIndexToInternalSheet(int extRefIndex) {
return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
}
-
- public void updateIndexToInternalSheet(int extRefIndex, int offset) {
- _externSheetRecord.adjustIndex(extRefIndex, offset);
+
+ /**
+ * @deprecated Was prevously used for removing sheets, which we now do differently
+ */
+ @Deprecated
+ public void updateIndexToInternalSheet(int extRefIndex, int offset) {
+ _externSheetRecord.adjustIndex(extRefIndex, offset);
+ }
+
+ public void removeSheet(int sheetIdx) {
+ _externSheetRecord.removeSheet(sheetIdx);
}
public int getSheetIndexFromExternSheetIndex(int extRefIndex) {
*/
private int findFirstRecordLocBySid(short sid) {
int index = 0;
- for (Iterator iterator = _workbookRecordList.iterator(); iterator.hasNext(); ) {
- Record record = ( Record ) iterator.next();
+ for (Iterator<Record> iterator = _workbookRecordList.iterator(); iterator.hasNext(); ) {
+ Record record = iterator.next();
if (record.getSid() == sid) {
return index;
return _list.get(i);
}
- public void adjustIndex(int extRefIndex, int offset) {
- getRef(extRefIndex).adjustIndex(offset);
+ /**
+ * @deprecated Was prevously used for removing sheets, which we now do differently
+ */
+ @Deprecated
+ public void adjustIndex(int extRefIndex, int 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);
+ }
}
/**
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
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());
+ }
}