java中的Excel生成问题

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)

Abh*_*eet 7

Apache-poi有一个流式api,可以处理大数据.从apache POI站点的文档中可以看出,从版本3.8.beta3开始,有一个名为SXSSF的新api.它占地面积小得多,应该用于生成非常大的ex​​cel文件.

你可以查看这个链接

您还可以参考以下基本代码:

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)