web-dev-qa-db-ja.com

Java POI提供されたデータはOffice 2007+ XMLにあるように見える

このエラーが発生しています:

org.Apache.poi.poifs.filesystem.OfficeXmlFileException:提供されたデータはOffice 2007+ XMLにあるようです。 OLE2 Officeドキュメントを扱うPOIの一部を呼び出しています。このデータを処理するには、POIの別の部分を呼び出す必要があります(HSSFではなくXSSFなど)

私はスローグーグルを読んで、ExcelファイルはxlsxであるためHSSFの代わりにXSSFを使用する必要があることがわかりましたが、私のMavenで見るように、私はすでにxlsxを使用しています。私はどこを間違えましたか?

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

例外を作成するコードは次のとおりです。

POIFSFileSystem fs;

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

私の新しいコード

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

new oPCPackage.openにコンパイルエラーがあります。

OPCPackage.openを型に解決できません

14
Marco Dinatsoli

Apache POI Quick Guide によると、POIFSFileSystem(または同様に、NPOIFSFileSystem)は.xls(2003年までのExcelバージョン)ドキュメントでのみ使用されます。

.xlsxドキュメント(Excel 2007+)に相当するのはOPCPackageです。

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

XSSFWorkbookからOPCPackageを作成できます。

XSSFWorkbook wb = new XSSFWorkbook(pkg);

または、直接作成することもできます。

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

一般に、メモリを節約するために、Fileの代わりにInputStreamを使用してワークブックを作成することをお勧めします。

また、.x​​lsか.xlsxかを気にしないコードが必要な場合:

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

XSSFをxlsxファイルで使用していましたが、パスワードで暗号化/保護されたファイルを処理しようとするとこのエラーが発生しました。

パスワードを削除すると、すべてが期待どおりに機能しました。

0
cs_pupil