用Java读取XLSX文件

时间:2008-11-05 22:48:02

标签: java excel parsing

我需要在Java应用程序中读取Excel 2007 XLSX文件。有谁知道一个很好的API来完成这个任务?

12 个答案:

答案 0 :(得分:50)

Apache POI 3.5增加了对所有OOXML(docx,xl​​sx等)的支持

请参阅XSSF sub project

答案 1 :(得分:5)

我必须在.NET中执行此操作,但我找不到任何API。我的解决方案是解压缩.xlsx,然后直接进入操作XML。一旦你创建了辅助类等,就没那么糟糕了。

有一些“陷阱”就像节点都必须按照excel期望的方式排序,我在官方文档中找不到。 Excel有自己的日期时间戳,因此您需要制作转换公式。

答案 2 :(得分:5)

AFAIK还没有xlsx库可用。但是有一些旧的xls:

一个库jxls,内部使用已提到的POI

其他2个链接:Handle Excel filesJava libraries to read and write Excel XLS document files

答案 3 :(得分:5)

可能会有点晚,但测试版POI现在支持xlsx。

答案 4 :(得分:3)

这个可能对你有用,它可以读/写Excel 2007 xlsx文件。     SmartXLS

答案 5 :(得分:2)

我对任何选项都不满意,所以我最终以Excel 97格式请求该文件。 POI非常适用于此。谢谢大家的帮助。

答案 6 :(得分:1)

你看过poorly obfuscated API吗?

没关系:

  

HSSF是POI Project的Excel '97(-2007)文件格式的纯Java实现。它不支持新的Excel 2007 .xlsx OOXML文件格式,它不是基于OLE2的。

您可以考虑改为使用JDBC-ODBC bridge

答案 7 :(得分:1)

我不知道它是否是Excel 2007的最新版本,但对于早期版本,我使用JExcelAPI

答案 8 :(得分:1)

docx4j现在也涵盖了xlsx。

“你为什么要用docx4j来做这件事”,我听你问,“而不是POI,它专注于xlsx和二进制xls?”

可能是因为你喜欢JAXB(而不是XML Beans),或者你已经将docx4j用于docx或pptx,并且需要能够用xlsx做一些事情。

另一个可能的原因是,从OpenXML模式生成的jar XML Beans对于您的目的来说太大了。 (为了解决这个问题,POI提供了一个'lite'子集:'big'ooxml-schemas-1.0.jar是14.5 MB!但是如果你需要支持任意电子表格,你可能需要完整的jar)。相比之下,整个docx4j / pptx4j / xlsx4j的重量与POI的精简子集大致相同。

如果您只处理电子表格(即不是docx或pptx),并且您不关心前一段,那么您可能最好使用POI。

答案 9 :(得分:1)

Aspose.Cells for Java支持XLSX格式。您可以在Aspose.Cells for Java Documentation中找到更多详细信息和进一步的帮助。请看看这是否有帮助。

披露:我在Aspose担任开发人员传播者。

答案 10 :(得分:1)

您可以使用Apache Tika

String parse(File xlsxFile) {
    return new Tika().parseToString(xlsxFile);
}

Tika使用Apache POI解析XLSX文件。

以下是Tiki的一些usage examples

或者,如果您想单独处理电子表格的每个单元格,以下是使用POI执行此操作的一种方法:

void parse(File xlsx) {
    try (XSSFWorkbook workbook = new XSSFWorkbook(xlsx)) {
        // Handle each cell in each sheet
        workbook.forEach(sheet -> sheet.forEach(row -> row.forEach(this::handle)));
    }
    catch (InvalidFormatException | IOException e) {
        System.out.println("Can't parse file " + xlsx);
    }
}

void handle(Cell cell) {
    final String cellContent;
    switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            cellContent = cell.getStringCellValue();
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellContent = String.valueOf(cell.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellContent = String.valueOf(cell.getBooleanCellValue());
            break;
        default:
            cellContent = "Don't know how to handle cell " + cell;
    }
    System.out.println(cellContent);
}

答案 11 :(得分:0)

如果要使用xlsx,则必须使用org.apache.poi.ss包。该软件包具有XSSF类,可用于解析xlxs文件。此示例代码可在Excel 2007或更高版本(.xlsx)上使用

OPCPackage pkg = OPCPackage.open(new ByteArrayInputStream(data));
            Workbook wb = new XSSFWorkbook(pkg);
            Sheet sheet = wb.getSheetAt(0);
            Iterator<Row> rows = sheet.rowIterator();

        while (rows.hasNext()) {
            int j = 5;
            Person person= new Person ();
            Row row = rows.next();
            if (row.getRowNum() > 0) {
                person.setPersonId((int)(row.getCell(0).getNumericCellValue()));
                person.setFirstName(row.getCell(1).getStringCellValue());
                person.setLastName(row.getCell(2).getStringCellValue());
                person.setGroupId((int)(row.getCell(3).getNumericCellValue()));
                person.setUserName(row.getCell(4).getStringCellValue());
                person.setCreditId((int)(row.getCell(5).getNumericCellValue()));
            }

        }

Excel 1998-2003 file (.xls) - you may use HSSF library.
  just use :  Workbook wb = new HSSFWorkbook(pkg);