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! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1-beta2" date="2008-05-??">
|
<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">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">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>
|
<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! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1-beta2" date="2008-05-??">
|
<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">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">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>
|
<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);
|
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
|
* given a POI POIFSFileSystem object, and a specific directory
|
||||||
* within it, read in its Workbook and populate the high and
|
* within it, read in its Workbook and populate the high and
|
||||||
@ -186,6 +222,8 @@ public class HSSFWorkbook extends POIDocument
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
super(directory, fs);
|
super(directory, fs);
|
||||||
|
String workbookName = getWorkbookDirEntryName(directory);
|
||||||
|
|
||||||
this.preserveNodes = preserveNodes;
|
this.preserveNodes = preserveNodes;
|
||||||
|
|
||||||
// If we're not preserving nodes, don't track the
|
// If we're not preserving nodes, don't track the
|
||||||
@ -198,27 +236,8 @@ public class HSSFWorkbook extends POIDocument
|
|||||||
sheets = new ArrayList(INITIAL_CAPACITY);
|
sheets = new ArrayList(INITIAL_CAPACITY);
|
||||||
names = 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
|
// Grab the data from the workbook stream, however
|
||||||
// it happens to be spelt.
|
// it happens to be spelled.
|
||||||
InputStream stream = directory.createDocumentInputStream(workbookName);
|
InputStream stream = directory.createDocumentInputStream(workbookName);
|
||||||
|
|
||||||
EventRecordFactory factory = new EventRecordFactory();
|
EventRecordFactory factory = new EventRecordFactory();
|
||||||
|
Loading…
Reference in New Issue
Block a user