[英]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.