web-dev-qa-db-fra.com

POI Java, les données fournies semblent être dans le XML Office 2007+

Je reçois cette erreur:

org.Apache.poi.poifs.filesystem.OfficeXmlFileException: les données fournies semblent être dans le XML Office 2007+. Vous appelez la partie de POI qui traite des documents Office OLE2. Vous devez appeler une autre partie du POI pour traiter ces données (par exemple, XSSF au lieu de HSSF).

J'ai lu jeter Google et j'ai découvert que je devais utiliser XSSF au lieu de HSSF car mon fichier Excel était au format xlsx, mais comme vous le voyez dans mon manuel, j'utilise déjà xlsx. Où est-ce que je me suis trompé?

<dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.13-beta1</version>
    </dependency> 

Le code qui fait l'exception est:

POIFSFileSystem fs;

            fs = new POIFSFileSystem(new FileInputStream(getFilePath()));

Mon nouveau 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()));
    }
}

J'ai une erreur de compilation dans new oPCPackage.open qui est:

OPCPackage.open ne peut pas être résolu en un type

12
Marco Dinatsoli

Selon le Apache POI Quick Guide , la POIFSFileSystem (ou le même objet, NPOIFSFileSystem) est uniquement utilisée avec les documents .xls (versions Excel à 2003).

L'équivalent pour les documents .xlsx (Excel 2007+) est OPCPackage.

OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));

Vous pouvez créer une XSSFWorkbook à partir de la OPCPackage:

XSSFWorkbook wb = new XSSFWorkbook(pkg);

Ou vous pouvez simplement le créer directement:

XSSFWorkbook wb = new XSSFWorkbook(new File("file.xlsx"));

En règle générale, il est préférable de créer le classeur en utilisant une File au lieu d'une InputStream, afin d'économiser de la mémoire.

En outre, si vous voulez un code qui ne vous intéresse pas, qu'il s'agisse d'un fichier .xls ou .xlsx:

// or "file.xlsx"
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
29
rgettman

J'utilisais XSSF avec un fichier xlsx, mais j'ai eu cette erreur lorsque j'ai essayé de traiter un fichier crypté/protégé avec un mot de passe. 

Une fois que j'ai enlevé le mot de passe, tout a fonctionné comme prévu.

0
cs_pupil