alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

导出excel中的第二列满足以下条件的设置成超链接,链接也可点击,但就没有显示下弧线和颜色(代码也设置了),然后你点进超链接单元格后点出来就可以正常显示下划线和颜色了 #3924

Closed sghgithua closed 1 month ago

sghgithua commented 1 month ago

import cn.hutool.core.util.StrUtil; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import lombok.extern.slf4j.Slf4j; import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Workbook;

import java.util.List;

@Slf4j public class HyperlinkUtils implements CellWriteHandler {

private static final String LINK = "HYPERLINK";

public HyperlinkUtils() {
}

@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    int curColIndex = cell.getColumnIndex();

    if (curColIndex != 1) {
        return;
    }
    if (!cell.getCellType().equals(CellType.STRING)) {
        return;
    }
    String value = cell.getStringCellValue();
    if (!value.contains(LINK)) {
        return;
    }
    String title = StrUtil.subBetween(value, "\",\"","\")");
    cell.setCellFormula(value);
    cell.setCellValue(title);

    cell.setCellStyle(createHyperlinkStyle(writeSheetHolder.getParentWriteWorkbookHolder().getCachedWorkbook()));
}

private static CellStyle createHyperlinkStyle(Workbook workbook) {
    CellStyle cellStyle = workbook.createCellStyle();
    Font font = workbook.createFont();
    font.setUnderline(Font.U_SINGLE);
    font.setColor(IndexedColors.BLUE.getIndex());

    cellStyle.setFont(font);

    return cellStyle;
}

}