You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2015/02/13 20:14:14 UTC
svn commit: r1659650 - in /poi/trunk:
src/java/org/apache/poi/hssf/record/SSTRecord.java
src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/57456.xls
Author: centic
Date: Fri Feb 13 19:14:14 2015
New Revision: 1659650
URL: http://svn.apache.org/r1659650
Log:
Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number in unique-strings-count-field
Added:
poi/trunk/test-data/spreadsheet/57456.xls
Modified:
poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java
poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/SSTRecord.java Fri Feb 13 19:14:14 2015
@@ -243,7 +243,14 @@ public final class SSTRecord extends Con
field_1_num_strings = in.readInt();
field_2_num_unique_strings = in.readInt();
field_3_strings = new IntMapper<UnicodeString>();
+
deserializer = new SSTDeserializer(field_3_strings);
+ // Bug 57456: some Excel Sheets send 0 as field=1, but have some random number in field_2,
+ // we should not try to read the strings in this case.
+ if(field_1_num_strings == 0) {
+ field_2_num_unique_strings = 0;
+ return;
+ }
deserializer.manufactureStrings( field_2_num_unique_strings, in );
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java Fri Feb 13 19:14:14 2015
@@ -47,26 +47,24 @@ public final class TestSSTRecord extends
/**
* decodes hexdump files and concatenates the results
* @param hexDumpFileNames names of sample files in the hssf test data directory
+ * @throws IOException
*/
- private static byte[] concatHexDumps(String... hexDumpFileNames) {
+ private static byte[] concatHexDumps(String... hexDumpFileNames) throws IOException {
int nFiles = hexDumpFileNames.length;
ByteArrayOutputStream baos = new ByteArrayOutputStream(nFiles * 8228);
for (int i = 0; i < nFiles; i++) {
String sampleFileName = hexDumpFileNames[i];
InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
- try {
- while (true) {
- String line = br.readLine();
- if (line == null) {
- break;
- }
- baos.write(HexRead.readFromString(line));
+
+ while (true) {
+ String line = br.readLine();
+ if (line == null) {
+ break;
}
- is.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ baos.write(HexRead.readFromString(line));
}
+ is.close();
}
return baos.toByteArray();
@@ -86,8 +84,9 @@ public final class TestSSTRecord extends
/**
* SST is often split over several {@link ContinueRecord}s
+ * @throws IOException
*/
- public void testContinuedRecord() {
+ public void testContinuedRecord() throws IOException {
byte[] origData;
SSTRecord record;
byte[] ser_output;
@@ -288,11 +287,10 @@ public final class TestSSTRecord extends
assertEquals( 2, record.countStrings() );
assertEquals( 3, record.getNumStrings() );
assertEquals( 2, record.getNumUniqueStrings() );
- Iterator iter = record.getStrings();
+ Iterator<UnicodeString> iter = record.getStrings();
- while ( iter.hasNext() )
- {
- UnicodeString ucs = (UnicodeString) iter.next();
+ while ( iter.hasNext() ) {
+ UnicodeString ucs = iter.next();
if ( ucs.equals( s1 ) )
{
@@ -1498,4 +1496,13 @@ public final class TestSSTRecord extends
assertEquals(src, dst);
}
+ public void test57456() {
+ byte[] bytes = HexRead.readFromString("FC, 00, 08, 00, 00, 00, 00, 00, E1, 06, 00, 00");
+ RecordInputStream in = TestcaseRecordInputStream.create(bytes);
+ assertEquals(SSTRecord.sid, in.getSid());
+ SSTRecord src = new SSTRecord(in);
+ assertEquals(0, src.getNumStrings());
+ assertEquals(0, src.getNumUniqueStrings());
+
+ }
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=1659650&r1=1659649&r2=1659650&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Fri Feb 13 19:14:14 2015
@@ -2681,4 +2681,10 @@ public final class TestBugs extends Base
s = wb.getSheetAt(0);
assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula());
}
+
+ @Test
+ public void test57456() throws IOException {
+ Workbook wb = openSample("57456.xls");
+ wb.close();
+ }
}
Added: poi/trunk/test-data/spreadsheet/57456.xls
URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/57456.xls?rev=1659650&view=auto
==============================================================================
Binary files poi/trunk/test-data/spreadsheet/57456.xls (added) and poi/trunk/test-data/spreadsheet/57456.xls Fri Feb 13 19:14:14 2015 differ
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org