当我将大量数据写入具有多个工作表的Excel文件时,我遇到了一个问题。我正在使用apache POI进行excel导出。
File file = new File("../path/file.xls");
FileOutputStream fout = new FileOutputStream(file);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int limit = 100000,offset=0,count=0,sheetIndex=0;
XSSFWorkbook workbook = new XSSFWorkbook();
do{
XSSFSheet sheet = null;
if (file.exists() && sheetIndex > 0) {
try {
workbook = (XSSFWorkbook)WorkbookFactory.create(file);
} catch (InvalidFormatException e) {
e.printStackTrace();
}
sheet = workbook.createSheet("Sheet-"+sheetIndex);
}else{
workbook = new XSSFWorkbook();
sheet = workbook.createSheet("Sheet-"+sheetIndex);
}
Row header = sheet.createRow(0);
//...Header row creation...
List<DataType> result = query(criteria,offset,limit);
offset = offset + limit;
count = results.size();
sheetIndex++;
int rowCount = 1;
for(DataType rowData : results){
Row row = sheet.createRow(rowCount++);
//row creation....
}
try {
workbook.write(outputStream);
outputStream.writeTo(fout);
} finally {
outputStream.flush();
}
}while(count == limit);
workbook.write(outputStream);
outputStream.writeTo(fout);
outputStream.close();
fout.close();
在循环中,我从DB获取100k记录并将其写入excel,每100k我创建一个新的Sheet,直到DB没有更多记录。
此代码有2个问题 1.我在打开文件时遇到问题,excel文件提醒我,当我尝试打开时它有问题,最后当我说好的时候加载数据。
如何解决这些问题?真的被困了!
提前致谢。
答案 0 :(得分:4)
XSSFWorkbook workbook
被多次创建,它会覆盖在前一个循环中创建的那个。工作簿只需创建一次。
我建议将循环条目更改为以下内容:
XSSFWorkbook workbook = new XSSFWorkbook();
do {
XSSFSheet sheet = workbook.createSheet("Sheet-"+sheetIndex);
Row header = sheet.createRow(0);
//...Header row creation...
// remaining code
答案 1 :(得分:0)
我已将WorkBook类型更改为SXSSFWorkbook并将刷新限制设置为100并且它有效。 性能比XSSFWorkbook好5倍。