簡體   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