44929 - Improved error handling in HSSFWorkbook when attempting to read a BIFF5 file
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@653117 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8fb40de628
commit
bbe3ee9b4d
@ -37,6 +37,7 @@
|
||||
|
||||
<!-- Don't forget to update status.xml too! -->
|
||||
<release version="3.1-beta2" date="2008-05-??">
|
||||
<action dev="POI-DEVELOPERS" type="fix">44929 - Improved error handling in HSSFWorkbook when attempting to read a BIFF5 file</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44675 - Parameter operand classes (function metadata) required to encode SUM() etc properly. Added parse validation for number of parameters</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44921 - allow Ptg.writeBytes() to be called on relative ref Ptgs (RefN* and AreaN*)</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44914 - Fix/suppress warning message "WARN. Unread n bytes of record 0xNN"</action>
|
||||
|
@ -34,6 +34,7 @@
|
||||
<!-- Don't forget to update changes.xml too! -->
|
||||
<changes>
|
||||
<release version="3.1-beta2" date="2008-05-??">
|
||||
<action dev="POI-DEVELOPERS" type="fix">44929 - Improved error handling in HSSFWorkbook when attempting to read a BIFF5 file</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44675 - Parameter operand classes (function metadata) required to encode SUM() etc properly. Added parse validation for number of parameters</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44921 - allow Ptg.writeBytes() to be called on relative ref Ptgs (RefN* and AreaN*)</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">44914 - Fix/suppress warning message "WARN. Unread n bytes of record 0xNN"</action>
|
||||
|
@ -168,6 +168,42 @@ public class HSSFWorkbook extends POIDocument
|
||||
this(fs.getRoot(), fs, preserveNodes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Normally, the Workbook will be in a POIFS Stream
|
||||
* called "Workbook". However, some weird XLS generators use "WORKBOOK"
|
||||
*/
|
||||
private static final String[] WORKBOOK_DIR_ENTRY_NAMES = {
|
||||
"Workbook", // as per BIFF8 spec
|
||||
"WORKBOOK",
|
||||
};
|
||||
|
||||
|
||||
private static String getWorkbookDirEntryName(DirectoryNode directory) {
|
||||
|
||||
String[] potentialNames = WORKBOOK_DIR_ENTRY_NAMES;
|
||||
for (int i = 0; i < potentialNames.length; i++) {
|
||||
String wbName = potentialNames[i];
|
||||
try {
|
||||
directory.getEntry(wbName);
|
||||
return wbName;
|
||||
} catch (FileNotFoundException e) {
|
||||
// continue - to try other options
|
||||
}
|
||||
}
|
||||
|
||||
// check for previous version of file format
|
||||
try {
|
||||
directory.getEntry("Book");
|
||||
throw new IllegalArgumentException("The supplied spreadsheet seems to be Excel 5.0/7.0 (BIFF5) format. "
|
||||
+ "POI only supports BIFF8 format (from Excel versions 97/2000/XP/2003)");
|
||||
} catch (FileNotFoundException e) {
|
||||
// fall through
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("The supplied POIFSFileSystem does not contain a BIFF8 'Workbook' entry. "
|
||||
+ "Is it really an excel file?");
|
||||
}
|
||||
|
||||
/**
|
||||
* given a POI POIFSFileSystem object, and a specific directory
|
||||
* within it, read in its Workbook and populate the high and
|
||||
@ -186,6 +222,8 @@ public class HSSFWorkbook extends POIDocument
|
||||
throws IOException
|
||||
{
|
||||
super(directory, fs);
|
||||
String workbookName = getWorkbookDirEntryName(directory);
|
||||
|
||||
this.preserveNodes = preserveNodes;
|
||||
|
||||
// If we're not preserving nodes, don't track the
|
||||
@ -198,27 +236,8 @@ public class HSSFWorkbook extends POIDocument
|
||||
sheets = new ArrayList(INITIAL_CAPACITY);
|
||||
names = new ArrayList(INITIAL_CAPACITY);
|
||||
|
||||
// Normally, the Workbook will be in a POIFS Stream
|
||||
// called "Workbook". However, some wierd XLS generators
|
||||
// put theirs in one called "WORKBOOK"
|
||||
String workbookName = "Workbook";
|
||||
try {
|
||||
directory.getEntry(workbookName);
|
||||
// Is the default name
|
||||
} catch(FileNotFoundException fe) {
|
||||
// Try the upper case form
|
||||
try {
|
||||
workbookName = "WORKBOOK";
|
||||
directory.getEntry(workbookName);
|
||||
} catch(FileNotFoundException wfe) {
|
||||
// Doesn't contain it in either form
|
||||
throw new IllegalArgumentException("The supplied POIFSFileSystem contained neither a 'Workbook' entry, nor a 'WORKBOOK' entry. Is it really an excel file?");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Grab the data from the workbook stream, however
|
||||
// it happens to be spelt.
|
||||
// it happens to be spelled.
|
||||
InputStream stream = directory.createDocumentInputStream(workbookName);
|
||||
|
||||
EventRecordFactory factory = new EventRecordFactory();
|
||||
|
Loading…
Reference in New Issue
Block a user