当前位置: 首页 > 知识库问答 >
问题:

有没有可能在apache poi中使用usermodel编写一个Excel文件,然后使用eventmodel再次读取同一个文件

叶弘深
2023-03-14

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

    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读取。它给出了错误:

线程“main”org.apache.poi.openxml4j.exceptions中出现异常。InvalidFormatException:包应包含位于org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackege.java:199)的内容类型部分[M1.13],位于org.aaphe.poi.poi.openxml4j.popc.OPCPackage.getParts(OPCPackage.java:665),位于org.aphe.poi.openxml4j.opc.opc Package.open(OPCPPackage.java:274),位于com.benz.test.ReadFromExcel.readUsingEventModel(ReadFromExcel.java:34),位于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();
        }
    }

}

同样的场景(即使用usermodel编写和使用event model读取)对于xlsx文件也很好,但对于xls文件不起作用。此外,我不能使用usermodel进行阅读,因为它会带来性能问题。如果有任何帮助,我们将不胜感激。谢谢

共有1个答案

邓禄
2023-03-14

你的第一套代码都是HSSF的,只对< code >有效。xls文件:

HSSFWorkbook workbook = new HSSFWorkbook();  

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

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

你有两个选择。首先,您可以使用XSSFWorkbook和朋友将初始代码更改为XSSF。如果使用XSSF作为<code>生成Excel文件。xlsx</code>,然后您可以使用XSSF代码读取它。或者,如果您确实希望使用HSSF/.xls进行生成,并且希望使用低内存读取,则需要使用HSSF事件API进行读取

 类似资料:
  • 我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。

  • 目前,我有一个源文件,其中包含base64编码的数据(大小约为20MB)。我想从这个文件中读取,解码数据并写入一个。TIF输出文件。然而,我不想一次解码所有20MB的数据。我想从源文件中读取特定数量的字符/字节,解码并写入目标文件。我知道我从源文件读取的数据的大小必须是4的倍数,否则就无法解码?下面是我当前的代码,我一次解码了所有代码 如何从源文件中读取特定数量的字符,然后解码并写入输出文件,这样

  • 问题内容: 我有一个包含不同列数的Excel文件,我想使用Python遍历该文件的某些列(从其标题行值开始),然后将这些列写入(复制)到另一个Excel文件中。 请问有关如何执行此操作的任何示例? 问题答案: 以下是一些可供选择的选项: xlwt(编写xls文件) xlrd(读取xls / xlsx文件) openpyxl(读取/写入xlsx文件) xlsxwriter(写入xlsx文件) 如果只

  • 我正在尝试转换一个大的文本文件(大小为5 gig),但得到了一个从这篇文章中,我设法将文本文件的编码格式转换为可读的格式: 这里的问题是,当我试图转换一个大尺寸(5 GB)的文本文件时。我会得到这个错误 我知道它无法读取这么大的文件。我从几个链接中发现,我可以逐行阅读。 那么,我如何应用于我必须让它逐行读取的代码呢?我对逐行读取的理解是,我需要从中读取一行,并将其添加到中,直到行尾,对吗?

  • 我正在使用vertx websocket。我正在通过它发送一个大文件。使用文件系统的最佳方式是什么?如果多个帧到达同一个文件,异步文件系统可能无法正常工作。有什么建议吗?

  • 假设是Spark中的一个数据文件。将写入单个CSV文件的方法是 任何帮助都很感激。