diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 6aa916b38..5410a7fab 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50939 - ChartEndObjectRecord is supposed to have 6 bytes at the end, but handle it not HMEF - New component which supports TNEF (Transport Neutral Encoding Format), aka winmail.dat 50313 - support for getting HWPFDocument fields 50912 - fixed setting named styles to HSSFCells diff --git a/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java b/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java index 145244960..3e9a86af2 100644 --- a/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java +++ b/src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java @@ -33,15 +33,23 @@ public final class ChartEndObjectRecord extends StandardRecord { private short rt; private short grbitFrt; private short iObjectKind; - private byte[] unused; + private byte[] reserved; public ChartEndObjectRecord(RecordInputStream in) { rt = in.readShort(); grbitFrt = in.readShort(); iObjectKind = in.readShort(); - unused = new byte[6]; - in.readFully(unused); + // The spec says that there should be 6 bytes at the + // end, which must be there and must be zero + // However, sometimes Excel forgets them... + reserved = new byte[6]; + if(in.available() == 0) { + // They've gone missing... + } else { + // Read the reserved bytes + in.readFully(reserved); + } } @Override @@ -60,7 +68,7 @@ public final class ChartEndObjectRecord extends StandardRecord { out.writeShort(grbitFrt); out.writeShort(iObjectKind); // 6 bytes unused - out.write(unused); + out.write(reserved); } @Override @@ -71,7 +79,7 @@ public final class ChartEndObjectRecord extends StandardRecord { buffer.append(" .rt =").append(HexDump.shortToHex(rt)).append('\n'); buffer.append(" .grbitFrt =").append(HexDump.shortToHex(grbitFrt)).append('\n'); buffer.append(" .iObjectKind=").append(HexDump.shortToHex(iObjectKind)).append('\n'); - buffer.append(" .unused =").append(HexDump.toHex(unused)).append('\n'); + buffer.append(" .reserved =").append(HexDump.toHex(reserved)).append('\n'); buffer.append("[/ENDOBJECT]\n"); return buffer.toString(); } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 08566a2e9..e27ce841a 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -2028,4 +2028,12 @@ if(1==2) { writeOutAndReadBack(wb2); } + /** + * The spec says that ChartEndObjectRecord has 6 reserved + * bytes on the end, but we sometimes find files without... + */ + public void test50939() throws Exception { + HSSFWorkbook wb = openSample("50939.xls"); + assertEquals(2, wb.getNumberOfSheets()); + } } diff --git a/test-data/spreadsheet/50939.xls b/test-data/spreadsheet/50939.xls new file mode 100644 index 000000000..bcc2068bb Binary files /dev/null and b/test-data/spreadsheet/50939.xls differ