Browse Source

Bug 57456: Fix reading XLS with empty SSTRecord where Excel puts some random number in unique-strings-count-field

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1659650 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_12_BETA1
Dominik Stadler 9 years ago
parent
commit
5b42301a45

+ 7
- 0
src/java/org/apache/poi/hssf/record/SSTRecord.java View File

field_1_num_strings = in.readInt(); field_1_num_strings = in.readInt();
field_2_num_unique_strings = in.readInt(); field_2_num_unique_strings = in.readInt();
field_3_strings = new IntMapper<UnicodeString>(); field_3_strings = new IntMapper<UnicodeString>();
deserializer = new SSTDeserializer(field_3_strings); 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 ); deserializer.manufactureStrings( field_2_num_unique_strings, in );
} }



+ 23
- 16
src/testcases/org/apache/poi/hssf/record/TestSSTRecord.java View File

/** /**
* decodes hexdump files and concatenates the results * decodes hexdump files and concatenates the results
* @param hexDumpFileNames names of sample files in the hssf test data directory * @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; int nFiles = hexDumpFileNames.length;
ByteArrayOutputStream baos = new ByteArrayOutputStream(nFiles * 8228); ByteArrayOutputStream baos = new ByteArrayOutputStream(nFiles * 8228);
for (int i = 0; i < nFiles; i++) { for (int i = 0; i < nFiles; i++) {
String sampleFileName = hexDumpFileNames[i]; String sampleFileName = hexDumpFileNames[i];
InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName); InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is)); 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(); return baos.toByteArray();


/** /**
* SST is often split over several {@link ContinueRecord}s * SST is often split over several {@link ContinueRecord}s
* @throws IOException
*/ */
public void testContinuedRecord() {
public void testContinuedRecord() throws IOException {
byte[] origData; byte[] origData;
SSTRecord record; SSTRecord record;
byte[] ser_output; byte[] ser_output;
assertEquals( 2, record.countStrings() ); assertEquals( 2, record.countStrings() );
assertEquals( 3, record.getNumStrings() ); assertEquals( 3, record.getNumStrings() );
assertEquals( 2, record.getNumUniqueStrings() ); 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 ) ) if ( ucs.equals( s1 ) )
{ {
assertEquals(src, dst); 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());
}
} }

+ 6
- 0
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java View File

s = wb.getSheetAt(0); s = wb.getSheetAt(0);
assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula()); assertEquals(refHttp, s.getRow(0).getCell(0).getCellFormula());
} }

@Test
public void test57456() throws IOException {
Workbook wb = openSample("57456.xls");
wb.close();
}
} }

BIN
test-data/spreadsheet/57456.xls View File


Loading…
Cancel
Save