From 4bcde19ada1f8b8442b23e80be73d2b46128846d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 25 Nov 2009 12:11:04 +0000 Subject: [PATCH] Fix bug #48180 - short chart records skipping some unused fields git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@884065 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/hssf/record/chart/CatLabRecord.java | 16 +++++++++++----- .../hssf/record/chart/ChartEndBlockRecord.java | 11 ++++++++--- .../org/apache/poi/hssf/usermodel/TestBugs.java | 13 +++++++++++++ test-data/spreadsheet/48180.xls | Bin 0 -> 20992 bytes 5 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 test-data/spreadsheet/48180.xls diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 10e006b4e..5369cda04 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 48180 - be more forgiving of short chart records, which skip some unused fields 48274 - fix erronious wrapping of byte colours in HSSFPalette.findSimilarColor 48269 - fix fetching of error codes from XSSF formula cells 48229 - fixed javadoc for HSSFSheet.setColumnWidth and XSSFSheet setColumnWidth diff --git a/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java b/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java index 84eb4b063..058f13cd6 100644 --- a/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java +++ b/src/java/org/apache/poi/hssf/record/chart/CatLabRecord.java @@ -35,7 +35,7 @@ public final class CatLabRecord extends StandardRecord { private short wOffset; private short at; private short grbit; - private short unused; + private Short unused; public CatLabRecord(RecordInputStream in) { rt = in.readShort(); @@ -43,12 +43,18 @@ public final class CatLabRecord extends StandardRecord { wOffset = in.readShort(); at = in.readShort(); grbit = in.readShort(); - unused = in.readShort(); + + // Often, but not always has an unused short at the end + if(in.available() == 0) { + unused = null; + } else { + unused = in.readShort(); + } } @Override protected int getDataSize() { - return 2 + 2 + 2 + 2 + 2 + 2; + return 2 + 2 + 2 + 2 + 2 + (unused==null? 0:2); } @Override @@ -58,13 +64,13 @@ public final class CatLabRecord extends StandardRecord { @Override public void serialize(LittleEndianOutput out) { - out.writeShort(rt); out.writeShort(grbitFrt); out.writeShort(wOffset); out.writeShort(at); out.writeShort(grbit); - out.writeShort(unused); + if(unused != null) + out.writeShort(unused); } @Override diff --git a/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java b/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java index f69a020c7..ac823b2b1 100644 --- a/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java +++ b/src/java/org/apache/poi/hssf/record/chart/ChartEndBlockRecord.java @@ -40,13 +40,18 @@ public final class ChartEndBlockRecord extends StandardRecord { grbitFrt = in.readShort(); iObjectKind = in.readShort(); - unused = new byte[6]; - in.readFully(unused); + // Often, but not always has 6 unused bytes at the end + if(in.available() == 0) { + unused = new byte[0]; + } else { + unused = new byte[6]; + in.readFully(unused); + } } @Override protected int getDataSize() { - return 2 + 2 + 2 + 6; + return 2 + 2 + 2 + unused.length; } @Override diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index e55dd2d05..5e15be840 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -1509,4 +1509,17 @@ public final class TestBugs extends BaseTestBugzillaIssues { assertEquals(32766, cell2.getStringCellValue().length()); } + /** + * Short records on certain sheets with charts in them + */ + public void test48180() { + HSSFWorkbook wb = openSample("48180.xls"); + + HSSFSheet s = wb.getSheetAt(0); + HSSFCell cell1 = s.getRow(0).getCell(0); + assertEquals("test ", cell1.getStringCellValue().toString()); + + HSSFCell cell2 = s.getRow(0).getCell(1); + assertEquals(1.0, cell2.getNumericCellValue()); + } } diff --git a/test-data/spreadsheet/48180.xls b/test-data/spreadsheet/48180.xls new file mode 100644 index 0000000000000000000000000000000000000000..be72749be3ca3a6c9bb18f877b7f16a1cabafe23 GIT binary patch literal 20992 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