Java POI the supplied data appears to be in the Office 2007+ XML
Solution 1
According to the Apache POI Quick Guide, the POIFSFileSystem
(or similarly, NPOIFSFileSystem
) is only used with .xls (Excel versions through 2003) documents.
The equivalent for .xlsx documents (Excel 2007+) is OPCPackage
.
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
You can create an XSSFWorkbook
from the OPCPackage
:
XSSFWorkbook wb = new XSSFWorkbook(pkg);
Or you can just create it directly:
XSSFWorkbook wb = new XSSFWorkbook(new File("file.xlsx"));
Generally it's better to create the workbook using a File
instead of an InputStream
, to save memory.
Also, if you want code that doesn't care whether it's an .xls or an .xlsx:
// or "file.xlsx"
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
Solution 2
I was using XSSF with a xlsx file, but got this error when I tried to process a file that was encrypted/protected with a password.
Once I removed the password, everything worked as expected.
Marco Dinatsoli
Updated on August 11, 2020Comments
-
Marco Dinatsoli almost 4 years
I am getting this error:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (e.g. XSSF instead of HSSF)
I read throw Google and I found out that I need to use XSSF instead of HSSF because my Excel file is xlsx, but as you see in my maven, I am already using xlsx. Where have I gone wrong please?
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.13-beta1</version> </dependency>
The code the makes the exception is:
POIFSFileSystem fs; fs = new POIFSFileSystem(new FileInputStream(getFilePath()));
My new code
public void getBColum() { try { OPCPackage fs; fs = new OPCPackage.open(new File(getFilePath())); XSSFWorkbook wb = new XSSFWorkbook(fs); XSSFSheet sheet = wb.getSheet("Master column name - Used Car"); XSSFRow row; CellReference cr = new CellReference("A1"); row = sheet.getRow(cr.getCol()); System.out.println(row.getCell(3)); } catch (FileNotFoundException e) { if (logger.isDebugEnabled()) { logger.debug("How can this error be possible? we should have already thrown an exception in the construction"); } } catch (IOException e) { logger.error(String.format("Exception in reading the file: %s", e.getMessage())); } }
I have a compile error in
new oPCPackage.open
which is:OPCPackage.open cannot be resolved to a type