在Apachi POI Java中将大型数据转换为excel 我正在处理一个大的CSV(200 MB的文本文件),我想转换成Excel表,但是工作簿变得如此耗时,在这个过程中间,java抛出“ GC开销限制超过” 如果我正在生成虚拟引用,我已经检查了代码,但我认为不存在任何引用

在Apachi POI Java中将大型数据转换为excel 我正在处理一个大的CSV(200 MB的文本文件),我想转换成Excel表,但是工作簿变得如此耗时,在这个过程中间,java抛出“ GC开销限制超过” 如果我正在生成虚拟引用,我已经检查了代码,但我认为不存在任何引用,java,excel,garbage-collection,apache-poi,large-data,Java,Excel,Garbage Collection,Apache Poi,Large Data,在我看来,那些来自Apachi-POI的库调用可能会生成一些使垃圾收集器如此繁忙的引用 我的问题是,我是否可以像文本文件一样将工作簿一块一块地写入一个文件,就像附加到一个文本文件,而不将其放入内存。有什么解决办法吗?或者我遗漏了什么 GC在以下代码中引发异常: private void updateExcelWorkbook(String input, String fileName, Workbook workbook) { try { Sheet sheet

在我看来,那些来自Apachi-POI的库调用可能会生成一些使垃圾收集器如此繁忙的引用

我的问题是,我是否可以像文本文件一样将工作簿一块一块地写入一个文件,就像附加到一个文本文件,而不将其放入内存。有什么解决办法吗?或者我遗漏了什么

GC在以下代码中引发异常:

    private void updateExcelWorkbook(String input, String fileName, Workbook workbook) {
    try {
        Sheet sheet = workbook.createSheet(fileName);

        // Create a new font and alter it.
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setBold(true);


        // Fonts are set into a style so create a new one to use.
        CellStyle style = workbook.createCellStyle();
        style.setFont(font);
        Row row;
        Cell cell;
        String[] columns;
        String[] lines = input.split("\n");
        int colIndex;
        int rowIndex = 1;

        for (String line : lines) {
            row = sheet.createRow(rowIndex++);
            columns = line.split("\t");
            colIndex = 0;

            for (String column: columns) {
                cell = row.createCell(colIndex++);
                if (rowIndex == 1)
                    cell.setCellStyle(style);
                cell.setCellValue(column);
            }
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

看起来您使用的是POI用户模型,它占用了很高的内存,因为它将整个工作表保存在内存中,类似于DOM将整个XML文档保存在内存中的方式

您需要使用流式API。使用POI,您可以使用SXSSF缓冲流式API创建
.xlsx
文件,如下所述:

上面链接的页面有此图像,显示POI的电子表格API功能摘要:


(来源:)

老兄,你救了我的命!它就像一个符咒。结果更快,没有问题,但生成的excel文件比XSSF工作簿创建的文件大一点,我不在乎!)