mirror of https://github.com/apache/poi.git
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
b930bedbc0
commit
ceb9427afb
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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",
|
"/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",
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
Loading…
Reference in New Issue