繁体   English   中英

是否可以使用usermodel编写Excel文件并使用Apache POI中的eventmodel再次读取同一文件

[英]Is it possible to write an Excel file using usermodel and read the same file again using eventmodel in apache poi

我尝试使用以下代码写入新的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进行读取。 它给出了错误:

线程“主”中的异常org.apache.poi.openxml4j.exceptions.InvalidFormatException:包应在org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:199处包含内容类型部分[M1.13] )在org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274)在org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274)在org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:665)位于com.benz.test.ReadFromExcel.main(ReadFromExcel.java:24)的ReadFromExcel.readUsingEventModel(ReadFromExcel.java:34)

//使用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进行写入和使用事件模型进行读取)对于xlsx文件也可以,但不适用于xls文件。 我也不能使用usermodel进行读取,因为它会导致性能问题。任何帮助将不胜感激。

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

HSSFWorkbook workbook = new HSSFWorkbook();  

然后,稍后,您突然尝试使用适用于.xlsx文件的XSSF代码:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM