alibaba/easyexcel

Hyperlink未释放导致内存溢出?

Open

#3,800 创建于 2024年5月21日

在 GitHub 查看
 (0 评论) (0 反应) (0 负责人)Java (7,599 fork)batch import
help wanted

仓库指标

Star
 (33,728 star)
PR 合并指标
 (30 天内没有已合并 PR)

描述

异常代码

    static class ExcelHyperlinkHandler implements CellWriteHandler {

        private CellStyle rowLinkStyle;

//        private Hyperlink hyperlink;

        @Override
        public void afterCellDispose(CellWriteHandlerContext context) {
            Cell cell = context.getCell();
            // 这里可以对cell进行任何操作
            int rowIndex = cell.getRowIndex();
            int columnIndex = cell.getColumnIndex();
            String stringCellValue = cell.getStringCellValue();
            log.info("第{}行,第{}列写入完成。", rowIndex, columnIndex);
            Map<String, String> workOrderLinkMap = WorkOrderLinkHolder.get();
            // 第一列添加超链接(排除第一行表头)
            Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
            if (columnIndex == 0 && rowIndex != 0) {
                CreationHelper createHelper = context.getWriteSheetHolder().getSheet().getWorkbook().getCreationHelper();
                // 单元格下划线和字体蓝色
                if (rowLinkStyle == null) {
                    rowLinkStyle = workbook.createCellStyle();
                    rowLinkStyle.setWrapText(true);
                    XSSFFont linkFont = (XSSFFont) workbook.createFont();
                    linkFont.setColor((short) 12);
                    linkFont.setUnderline(Font.U_SINGLE);
                    rowLinkStyle.setFont(linkFont);
                }
                // 设置单元格为超链接样式
                Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL);
                String url = workOrderLinkMap.get(stringCellValue);
                hyperlink.setAddress(url);
                cell.setHyperlink(hyperlink);
                cell.setCellStyle(rowLinkStyle);
            }
        }

    }

问题描述

分批导出20万行数据,每页500,Hyperlink对象创建了20万个,不应该每页500条写入完后释放吗?

贡献者指南