FileOutputStream(Apachhe POI)花费太长的时间来保存

当我使用Apache poi编辑.xlsx文件时,需要很长时间才能保存。 .xlsx文件包含公式格式化和冻结窗格。 我正在使用下面的代码,

try { FileInputStream file = new FileInputStream(new File(path)); XSSFWorkbook fWorkbook = new XSSFWorkbook(file); XSSFSheet fSheet = fWorkbook.getSheetAt(0); for(int i = 0; i < jTable1.getRowCount(); i++){ if(jTable1.getModel().getValueAt(i, index1).equals("1")){ XSSFCell cell = fSheet.getRow(i+1).getCell(index1); cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(new Double(1)); XSSFCellStyle cs = fWorkbook.createCellStyle(); cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); cell =fSheet.getRow(i+1).getCell(index2); cell.setCellValue(new Date()); cell.setCellStyle(cs); } } file.close(); FileOutputStream fileOutputStream = new FileOutputStream(path); fWorkbook.write(fileOutputStream); fileOutputStream.close(); JOptionPane.showMessageDialog(this, "Data saved successfully."); parent.removeContent(); }catch(Exception e){ e.printStackTrace(); } 

编辑1:

excel文件: http : //ge.tt/5orGWSJ2/v/0?c

从Excel中将数据加载到JTable中:

 try { FileInputStream file1 = new FileInputStream(new File("c:\\sample.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(file1); XSSFSheet sheet = workbook.getSheetAt(0); int rowc=sheet.getLastRowNum()+1; int colc=sheet.getRow(0).getLastCellNum(); Object heading[] = new Object[colc+1]; XSSFRow row1 = sheet.getRow(0); for(int i=0, column =0; i < colc; i++){ if(i == 1){ heading[column++] = ""; } heading[column++] = cellToString(row1.getCell(i)); } Object [][]j=new Object[rowc-1][colc+1]; for (int i = 1; i < rowc; i++) { row1 = sheet.getRow(i); for (int jj = 0, column = 0; jj < colc; jj++) { if(column == 1){ j[i-1][column++] = new Boolean(false); j[i-1][column] = cellToString(row1.getCell(jj)); } else{ j[i-1][column]=cellToString(row1.getCell(jj)); } column++; } } jTable1.setModel(new DefaultTableModel(j, heading){ public Class getColumnClass(int columnIndex) { if(columnIndex == 0){ return java.lang.Integer.class; } else if(columnIndex == 1){ return java.lang.Boolean.class; } else{ return java.lang.Object.class; } } }); jTable1.getColumnModel().getColumn(1).setMaxWidth(60); jTable1.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); jTable1.getTableHeader().setReorderingAllowed(false); } catch (IOException ex) { JOptionPane.showMessageDialog(BarcodePrint.this, ex); } 

编辑列BarcodePrint后将数据写入excel:

 try { FileInputStream file = new FileInputStream(new File("c:\\sample.xlsx")); XSSFWorkbook fWorkbook = new XSSFWorkbook(file); XSSFCellStyle cs = fWorkbook.createCellStyle(); cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); Date currentdate = new Date(); XSSFSheet fsheet = fWorkbook.getSheetAt(0); Double barcodeprintstatus = new Double(1); int newindex = 24; int printdate = 26; int uniqueid = 27; for(int i = 0; i < jTable1.getModel().getRowCount(); i++){ if(jTable1.getModel().getValueAt(i, newindex).equals("1")){ for(int k=1; k < fsheet.getPhysicalNumberOfRows(); k++){ XSSFCell cell = fsheet.getRow(k).getCell(uniqueid-1); String uid = cell.getRawValue(); if(jTable1.getModel().getValueAt(i, uniqueid).toString().equals(uid)){ cell = (fsheet.getRow(i+1)).getCell(newindex-1); cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(barcodeprintstatus); cell = fsheet.getRow(i+1).getCell(printdate-1); cell.setCellValue(currentdate); cell.setCellStyle(cs); } } } } file.close(); FileOutputStream fileOutputStream = new FileOutputStream("c:\\sample.xlsx"); fWorkbook.write(fileOutputStream); // this is taking so much of time. Approximately 1 min. fileOutputStream.close(); }catch(Exception e){ e.printStackTrace(); } 

我无法解决这个问题。 fWorkbook.write(fileOutputStream); 正如我上面提到的那样花费了很多时间。 请帮忙。 有没有其他的方法来保存Excel文件? 或者我可以写一部分数据而不是孔工作簿?

尝试改进代码。

您可以调用fSheet.getRow(i+1)两次。 尝试引入一个variables并重用行而不是获取它。

 cell.setCellValue(new Double(1)); 

在for循环之前创build一个double,并重用它。

 XSSFCellStyle cs = fWorkbook.createCellStyle(); cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); 

移动单元格样式创build并初始化for循环。 在循环之前创build并重用。

 cell.setCellValue(new Date()); 

引入Datevariables并只创build一次Date。 再次在for循环之前。

FileOutputStream周围添加一个BufferedOutputStream