使用 apache poi 在 excel 文件中的块中插入来自数组列表的数据



我有以下格式的数据数组列表:

ArrayList> listResultData.现在集合包含大约 11k+ 行要插入到 excel 中。 当我在 excel 中插入这 11490 行时,插入记录需要 6 小时,这意味着它的性能问题非常糟糕。无论如何,是否可以一次在 excel 中以块的形式插入 1000 行的数据(这意味着 sql 中应该有类似 executeBatch(( 的东西用于插入记录(。一行还包含 4-5 列。

以下是我一直在使用的代码:

public boolean setArrayListData(String sheetName, ArrayList<ArrayList<String>> listResultData) {
try {
fis = new FileInputStream(path);
workbook = new XSSFWorkbook(fis);
int index = workbook.getSheetIndex(sheetName);
if (index == -1)
return false;
sheet = workbook.getSheetAt(index);
int colNum = 0;
int rowNum = this.getRowCount(sheetName);
rowNum++;
for (ArrayList<String> al : listResultData) {   
for (String s : al) {
sheet.autoSizeColumn(colNum);
row = sheet.getRow(rowNum - 1);
if (row == null)
row = sheet.createRow(rowNum - 1);
cell = row.getCell(colNum);
if (cell == null)
cell = row.createCell(colNum);
// cell style
// CellStyle cs = workbook.createCellStyle();
// cs.setWrapText(true);
// cell.setCellStyle(cs);
cell.setCellValue(s);
//System.out.print("Cell Value :: "+s);
colNum++;
}
rowNum++;
colNum = 0;
//System.out.println("");
}
fileOut = new FileOutputStream(path);
workbook.write(fileOut);
fileOut.close();
workbook.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

请建议 !!

您可能想尝试 XSSF 的流式扩展 SXSSF 而不是 XSSF。与 xssf 相反,您可以访问文档中的所有行,这可能会导致性能或堆空间问题 sxssf 允许您定义滑动窗口并限制对该窗口中行的访问。您可以使用new SXSSFWorkbook(int windowSize)在工作簿的构造时指定窗口大小。然后创建行并且行数超过指定的窗口大小时,具有最低索引的行将被刷新,并且不再在内存中。

在SXSSF(Streaming Usermodel API(上查找更多信息

例:

// keep 100 rows in memory, exceeding rows will be flushed to disk
SXSSFWorkbook wb = new SXSSFWorkbook(100); 
Sheet sh = wb.createSheet();
for(int rownum = 0; rownum < 1000; rownum++){
//When the row count reaches 101, the row with rownum=0 is flushed to disk and removed from memory, 
//when rownum reaches 102 then the row with rownum=1 is flushed, etc. 
Row row = sh.createRow(rownum);
for(int cellnum = 0; cellnum < 10; cellnum++){
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
}
}

最新更新