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:
parent
07e7d23b32
commit
0e44d8da73
@ -20,7 +20,9 @@ package org.apache.poi;
|
||||
* Base class of all the exceptions that POI throws in the event
|
||||
* that it's given a file that's older than currently supported.
|
||||
*/
|
||||
public abstract class OldFileFormatException extends IllegalArgumentException {
|
||||
public abstract class OldFileFormatException extends UnsupportedFileFormatException {
|
||||
private static final long serialVersionUID = 7849681804154571175L;
|
||||
|
||||
public OldFileFormatException(String s) {
|
||||
super(s);
|
||||
}
|
||||
|
29
src/java/org/apache/poi/UnsupportedFileFormatException.java
Normal file
29
src/java/org/apache/poi/UnsupportedFileFormatException.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -81,7 +81,6 @@ public final class XSSFRelation extends POIXMLRelation {
|
||||
"/xl/workbook.xml",
|
||||
null
|
||||
);
|
||||
|
||||
public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation(
|
||||
"application/vnd.ms-excel.addin.macroEnabled.main+xml",
|
||||
PackageRelationshipTypes.CORE_DOCUMENT,
|
||||
@ -89,6 +88,13 @@ public final class XSSFRelation extends POIXMLRelation {
|
||||
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(
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
|
||||
|
@ -63,6 +63,7 @@ import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.POILogFactory;
|
||||
import org.apache.poi.util.POILogger;
|
||||
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.ExternalLinksTable;
|
||||
import org.apache.poi.xssf.model.MapInfo;
|
||||
@ -229,7 +230,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
public XSSFWorkbook(OPCPackage pkg) throws IOException {
|
||||
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());
|
||||
}
|
||||
|
||||
@ -250,7 +253,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
public XSSFWorkbook(InputStream is) throws IOException {
|
||||
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());
|
||||
}
|
||||
|
||||
@ -287,6 +292,17 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
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
|
||||
@SuppressWarnings("deprecation") // getXYZArray() array accessors are deprecated
|
||||
protected void onDocumentRead() throws IOException {
|
||||
@ -1869,12 +1885,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
|
||||
@Beta
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -74,6 +74,7 @@ import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.util.TempFile;
|
||||
import org.apache.poi.xssf.XLSBUnsupportedException;
|
||||
import org.apache.poi.xssf.XSSFITestDataProvider;
|
||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||
import org.apache.poi.xssf.model.CalculationChain;
|
||||
@ -1845,6 +1846,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
||||
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) {
|
||||
XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(excel);
|
||||
evaluator.evaluateAll();
|
||||
|
BIN
test-data/spreadsheet/Simple.xlsb
Normal file
BIN
test-data/spreadsheet/Simple.xlsb
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user