Fix bug with record indexes for HSSF Workbooks

We have encountered workbooks that do not have a TabIdRecord (see 55982.xls). However, the WorkbookRecordList#updateRecordPos() method would still increment the position of the TabIdRecord for such workbooks. Changing the default position of the record from 0 to -1 indicates that the record position has now been set.

This bug was discovered while adding support for editing pictures in HSSF documents.

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1886963 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Marius Volkhart 2021-02-27 00:43:56 +00:00
parent 451684aa91
commit 50757bca8e
3 changed files with 29 additions and 2 deletions

View File

@ -776,7 +776,6 @@ public final class InternalWorkbook {
* make the tabid record look like the current situation.
*/
private void fixTabIdRecord() {
Record rec = records.get(records.getTabpos());
// see bug 55982, quite a number of documents do not have a TabIdRecord and
// thus there is no way to do the fixup here,
@ -785,6 +784,8 @@ public final class InternalWorkbook {
return;
}
Record rec = records.get(records.getTabpos());
TabIdRecord tir = ( TabIdRecord ) rec;
short[] tia = new short[ boundsheets.size() ];

View File

@ -30,7 +30,7 @@ public final class WorkbookRecordList {
/** holds the position of the last bound sheet */
private int bspos;
/** holds the position of the tabid record */
private int tabpos;
private int tabpos = -1;
/** hold the position of the last font record */
private int fontpos;
/** hold the position of the last extended font record */

View File

@ -0,0 +1,26 @@
package org.apache.poi.hssf.model;
import org.apache.poi.hssf.record.chart.ChartRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static org.apache.poi.hssf.HSSFTestDataSamples.openSampleWorkbook;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestWorkbookRecordList {
@Test
public void tabposIsOnlyUpdatedIfWorkbookHasTabIdRecord() throws IOException {
try (HSSFWorkbook wb = openSampleWorkbook("55982.xls")) {
WorkbookRecordList records = wb.getInternalWorkbook().getWorkbookRecordList();
assertEquals(-1, records.getTabpos());
// Add an arbitrary record to the front of the list
records.add(0, new ChartRecord());
assertEquals(-1, records.getTabpos());
}
}
}