Vis*_*ran 1 java excel hibernate spring-mvc apache-poi
我正在尝试使用Apache POI生成Excel文件.我需要生成120k行和7列数据.我可以轻松生成25 000行的excel文件,但问题是我无法生成100k行的excel文件.在运行时,代码执行变慢.
为了生成excel文件,系统必须通过for循环(100k行和9列)迭代900k次.
最初在excel对象中添加24行大约需要1秒钟,然后逐渐降低执行速度.
添加70k行后,需要24..30秒才能添加一行.为什么会这样?
List<String[]> keyList = keyService.findAllKeyByBatchCode(batchCode);
int x = 1;
if(keyList != null && keyList.size() != 0) {
Date activated_Date = null;
for (int i = 0; i<keyList.size(); i++) {
Object[] keyUser = keyList.get(i);
data.put(x, new Object[] {
String.valueOf(x),
keyForDetails.getLicenceType().getName(),
batchCode,
keyForDetails.getKeyType(),
keyUser[0],
"",
DateUtility.convertUtilDatetoString(keyForDetails.getDate()),
String.valueOf(keyForDetails.getPrice()),
keyUser[1]
});
x++;
}
}
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Key sheet");
Set<Integer> keyset = data.keySet();
int rownum = 0;
System.out.println("-------------printin------");
try {
for (Integer key : keyset) {
Row row = sheet.createRow(rownum++);
Object [] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
System.out.println("-------------print cell------");
Cell cell = row.createCell(cellnum++);
if(obj instanceof Date)
cell.setCellValue((Date)obj);
else if(obj instanceof Boolean)
cell.setCellValue((Boolean)obj);
else if(obj instanceof String)
cell.setCellValue((String)obj);
else if(obj instanceof Double)
cell.setCellValue((Double)obj);
}
}
if(rownum != 1) {
System.out.println("-------------file writein------");
FileOutputStream out = new FileOutputStream(new File("C:/Users/Public/Documents/"+batchCode+" page"+n+".xlsx"));
workbook.write(out);
out.close();
System.out.println("Excel written successfully..");
}
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
Apache-poi有一个流式api,可以处理大数据.从apache POI站点的文档中可以看出,从版本3.8.beta3开始,有一个名为SXSSF的新api.它占地面积小得多,应该用于生成非常大的excel文件.
你可以查看这个链接
您还可以参考以下基本代码:
public class ReadWriteExcelFile {
public static void main(String[] args) throws IOException {
String excelFileName = "C:\\temp\\Test.xlsx";//name of excel file
String sheetName = "Sheet1";//name of sheet
SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sheet = wb.createSheet(sheetName);
//iterating r number of rows
for (int r = 0; r < 55555; r++) {
Row row = sheet.createRow(r);
//iterating c number of columns
for (int c = 0; c < 5; c++) {
Cell cell = row.createCell(c);
cell.setCellValue("Cell " + r + " " + c);
}
if ( r % 1000 == 0) {
System.out.println(r);
}
}
FileOutputStream out = new FileOutputStream(excelFileName);
wb.write(out);
out.close();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |