30

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

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Marco Dinatsoli
  • 10,322
  • 37
  • 139
  • 253

3 Answers3

69

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"));
rgettman
  • 176,041
  • 30
  • 275
  • 357
4

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.

cs_pupil
  • 2,782
  • 27
  • 39
0

well actually there is no OPCPackage, I am using https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/3.5-beta5 so you have to:

import org.apache.poi.openxml4j.opc.Package;
....
Package fs = Package.open(new ByteArrayInputStream(container.getContent()));
            XSSFWorkbook wb = new XSSFWorkbook(fs);
            XSSFSheet sheet = wb.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;