Java POI the supplied data appears to be in the Office 2007+ XML

99,447

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.

Share:
99,447
Marco Dinatsoli
Author by

Marco Dinatsoli

Updated on August 11, 2020

Comments

  • Marco Dinatsoli
    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