Fix bug #56800 - Provide a helpful exception, XLSBUnsupportedException, if XSSFWorkbook is passed a .xlsb file

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1615118 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2014-08-01 14:33:17 +00:00
parent 07e7d23b32
commit 0e44d8da73
7 changed files with 126 additions and 12 deletions

View File

@ -20,8 +20,10 @@ package org.apache.poi;
* Base class of all the exceptions that POI throws in the event * Base class of all the exceptions that POI throws in the event
* that it's given a file that's older than currently supported. * that it's given a file that's older than currently supported.
*/ */
public abstract class OldFileFormatException extends IllegalArgumentException { public abstract class OldFileFormatException extends UnsupportedFileFormatException {
public OldFileFormatException(String s) { private static final long serialVersionUID = 7849681804154571175L;
public OldFileFormatException(String s) {
super(s); super(s);
} }
} }

View File

@ -0,0 +1,29 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi;
/**
* Base class of all the exceptions that POI throws in the event
* that it's given a file that isn't supported
*/
public abstract class UnsupportedFileFormatException extends IllegalArgumentException {
private static final long serialVersionUID = -8281969197282030046L;
public UnsupportedFileFormatException(String s) {
super(s);
}
}

View File

@ -0,0 +1,31 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.xssf;
import org.apache.poi.UnsupportedFileFormatException;
/**
* We don't support .xlsb files, sorry
*/
public class XLSBUnsupportedException extends UnsupportedFileFormatException {
private static final long serialVersionUID = 7849681804154571175L;
public static final String MESSAGE = ".XLSB Binary Workbooks are not supported";
public XLSBUnsupportedException() {
super(MESSAGE);
}
}

View File

@ -81,7 +81,6 @@ public final class XSSFRelation extends POIXMLRelation {
"/xl/workbook.xml", "/xl/workbook.xml",
null null
); );
public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation( public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation(
"application/vnd.ms-excel.addin.macroEnabled.main+xml", "application/vnd.ms-excel.addin.macroEnabled.main+xml",
PackageRelationshipTypes.CORE_DOCUMENT, PackageRelationshipTypes.CORE_DOCUMENT,
@ -89,6 +88,13 @@ public final class XSSFRelation extends POIXMLRelation {
null null
); );
public static final XSSFRelation XLSB_BINARY_WORKBOOK = new XSSFRelation(
"application/vnd.ms-excel.sheet.binary.macroEnabled.main",
PackageRelationshipTypes.CORE_DOCUMENT,
"/xl/workbook.bin",
null
);
public static final XSSFRelation WORKSHEET = new XSSFRelation( public static final XSSFRelation WORKSHEET = new XSSFRelation(
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",

View File

@ -63,6 +63,7 @@ import org.apache.poi.util.Internal;
import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import org.apache.poi.util.PackageHelper; import org.apache.poi.util.PackageHelper;
import org.apache.poi.xssf.XLSBUnsupportedException;
import org.apache.poi.xssf.model.CalculationChain; import org.apache.poi.xssf.model.CalculationChain;
import org.apache.poi.xssf.model.ExternalLinksTable; import org.apache.poi.xssf.model.ExternalLinksTable;
import org.apache.poi.xssf.model.MapInfo; import org.apache.poi.xssf.model.MapInfo;
@ -228,8 +229,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
*/ */
public XSSFWorkbook(OPCPackage pkg) throws IOException { public XSSFWorkbook(OPCPackage pkg) throws IOException {
super(pkg); super(pkg);
//build a tree of POIXMLDocumentParts, this workbook being the root beforeDocumentRead();
// Build a tree of POIXMLDocumentParts, this workbook being the root
load(XSSFFactory.getInstance()); load(XSSFFactory.getInstance());
} }
@ -250,7 +253,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
public XSSFWorkbook(InputStream is) throws IOException { public XSSFWorkbook(InputStream is) throws IOException {
super(PackageHelper.open(is)); super(PackageHelper.open(is));
//build a tree of POIXMLDocumentParts, this workbook being the root beforeDocumentRead();
// Build a tree of POIXMLDocumentParts, this workbook being the root
load(XSSFFactory.getInstance()); load(XSSFFactory.getInstance());
} }
@ -286,6 +291,17 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
public XSSFWorkbook(String path) throws IOException { public XSSFWorkbook(String path) throws IOException {
this(openPackage(path)); this(openPackage(path));
} }
protected void beforeDocumentRead() {
// Ensure it isn't a XLSB file, which we don't support
if (getCorePart().getContentType().equals(XSSFRelation.XLSB_BINARY_WORKBOOK.getContentType())) {
throw new XLSBUnsupportedException();
}
// Create arrays for parts attached to the workbook itself
pivotTables = new ArrayList<XSSFPivotTable>();
pivotCaches = new ArrayList<CTPivotCache>();
}
@Override @Override
@SuppressWarnings("deprecation") // getXYZArray() array accessors are deprecated @SuppressWarnings("deprecation") // getXYZArray() array accessors are deprecated
@ -1869,12 +1885,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
@Beta @Beta
public List<XSSFPivotTable> getPivotTables() { public List<XSSFPivotTable> getPivotTables() {
// Lazy create the list. It gets populated with existing ones on sheet setup
if (pivotTables == null) {
pivotTables = new ArrayList<XSSFPivotTable>();
pivotCaches = new ArrayList<CTPivotCache>();
}
return pivotTables; return pivotTables;
} }

View File

@ -74,6 +74,7 @@ import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFile;
import org.apache.poi.xssf.XLSBUnsupportedException;
import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.model.CalculationChain; import org.apache.poi.xssf.model.CalculationChain;
@ -1844,6 +1845,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
cRef = sheet.getRow(4).getCell(1); cRef = sheet.getRow(4).getCell(1);
assertEquals("A4", cRef.getCellFormula()); assertEquals("A4", cRef.getCellFormula());
} }
/**
* .xlsb files are not supported, but we should generate a helpful
* error message if given one
*/
@Test
public void bug56800_xlsb() throws Exception {
// Can be opened at the OPC level
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("Simple.xlsb");
// XSSF Workbook gives helpful error
try {
new XSSFWorkbook(pkg);
fail(".xlsb files not supported");
} catch (XLSBUnsupportedException e) {
// Good, detected and warned
}
// Workbook Factory gives helpful error on package
try {
WorkbookFactory.create(pkg);
fail(".xlsb files not supported");
} catch (XLSBUnsupportedException e) {
// Good, detected and warned
}
// Workbook Factory gives helpful error on file
File xlsbFile = HSSFTestDataSamples.getSampleFile("Simple.xlsb");
try {
WorkbookFactory.create(xlsbFile);
fail(".xlsb files not supported");
} catch (XLSBUnsupportedException e) {
// Good, detected and warned
}
}
private void checkValue(XSSFWorkbook excel, String expect) { private void checkValue(XSSFWorkbook excel, String expect) {
XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel); XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);

Binary file not shown.