java - 是否可以使用 usermodel 编写 Excel 文件并使用 apache poi 中的 eventmodel 再次读取同一文件

标签 java apache-poi xls xlsx

我尝试使用以下代码写入新的 Excel 文件(使用 usermodel)

    private static void writeToExecelFileUsingUserModel() throws InvalidFormatException, IOException {
    String[] header = {"","A","B","C", "D","E","F","G","I","J"};
    String[] dataSet = {"1","2","3","4","5","6","7","8","9","10"};
    HSSFWorkbook workbook = new HSSFWorkbook();   
    HSSFSheet sheet = (HSSFSheet) workbook.createSheet("testSheet");
    HSSFRow row = sheet.createRow(0);
    for(int i= 0; i <header.length; i++ ){
        HSSFCell cell = row.createCell(i);
        cell.setCellValue(header[i]);
    }
    HSSFRow row2 = sheet.createRow(1);
    for(int i= 0; i <dataSet.length; i++ ){
        HSSFCell cell = row2.createCell(i);
        cell.setCellValue(dataSet[i]);
    }

    try {
        FileOutputStream fos = new FileOutputStream("C:\\Test.xls");
        workbook.write(fos);
        System.out.println("write complete");
        fos.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

然后,我使用相同的文件并尝试使用下面的代码使用 eventmodel 进行读取。它给出了错误:

Exception in thread "main" org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:199) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:665) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274) at com.benz.test.ReadFromExcel.readUsingEventModel(ReadFromExcel.java:34) at com.benz.test.ReadFromExcel.main(ReadFromExcel.java:24)

//使用 eventmodel 从先前生成的 xls 文件中读取的代码

    private static void readUsingEventModel() throws IOException, OpenXML4JException {

    InputStream excelStream = null;
    OPCPackage pkg = null;
    System.out.println("reading using event model");
    try {
        FileInputStream myxls = new FileInputStream("C:\\Test.xls");
        pkg = OPCPackage.open(myxls);
        XSSFReader xssfReader = new XSSFReader(pkg);
        XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
        String sheetName = iter.getSheetName();
        System.out.println("sheet name is"+sheetName);
    } finally {
        if (excelStream != null) {
            excelStream.close();
        }
        if (pkg != null) {
            pkg.close();
        }
    }

}

同样的场景(即使用用户模型写入并使用事件模型读取)适用于 xlsx 文件,但不适用于 xls 文件。 另外,我无法使用 usermodel 进行读取,因为它会带来性能问题 任何帮助将不胜感激。谢谢

最佳答案

您的第一组代码都是 HSSF,它适用于 .xls 文件:

HSSFWorkbook workbook = new HSSFWorkbook();  

然后,过了一会儿,您突然尝试使用仅适用于 .xlsx 文件的 XSSF 代码:

OPCPackage pkg = null;
XSSFReader xssfReader = new XSSFReader(pkg);

你有两个选择。首先,您可以使用 XSSFWorkbook 等将初始代码更改为 XSSF。如果您使用 XSSF 将 Excel 文件生成为 .xlsx,那么您可以使用 XSSF 代码读取它。或者,如果您确实想使用 HSSF/.xls 进行生成,并且想要使用低内存读取,那么您需要使用 HSSF Event API进行阅读

关于java - 是否可以使用 usermodel 编写 Excel 文件并使用 apache poi 中的 eventmodel 再次读取同一文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30587056/

相关文章:

python - PyQt:导入 .xls 文件并填充 QTableWidget?

c# - 智能 XLS 示例?

java - 如何使用 System.set 在类级别初始化 chrome 驱动程序...?

java.lang.NoSuchMethodError : org. hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;

java - Log4j2 模拟附加程序

java - Apache POI : Get value from textbox

java - 需要帮助在java中使用超链接字段文件来编写excel

Java isNan 是如何工作的?

java - 使用 Apache POI 在 Excel 中的一定数量的单元格后字体消失

java - Apache 兴趣点。计算生成的(通过模板)DOCX文档页面的高度