0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

EasyExcel碰到问题记录

京东云 来源:京东工业 孙磊 作者:京东工业 孙磊 2025-01-13 13:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东工业 孙磊

1、富文本中文字设置不同颜色和字体不生效

                String stringCellValue = cell.getStringCellValue();
                if (StringUtils.isNotBlank(stringCellValue) && stringCellValue.contains(startIndex) && stringCellValue.contains(endIndex)) {
                    RichTextString richStringCellValue = cell.getRichStringCellValue();
                    Font redFont = workbook.createFont();
                    redFont.setColor(IndexedColors.RED.getIndex());

                    if (richStringCellValue instanceof XSSFRichTextString) {
                        XSSFRichTextString xssfRichTextString = new XSSFRichTextString(cell.getStringCellValue());
                        xssfRichTextString.applyFont(stringCellValue.indexOf(startIndex),stringCellValue.indexOf(endIndex) +endIndex.length() ,redFont);
                        cell.setCellValue(xssfRichTextString);
                    } else if (richStringCellValue instanceof HSSFRichTextString) {
                        HSSFRichTextString hssfRichTextString = new HSSFRichTextString(cell.getStringCellValue());
                        hssfRichTextString.applyFont(stringCellValue.indexOf(startIndex),stringCellValue.indexOf(endIndex) +endIndex.length() ,redFont);
                        cell.setCellValue(hssfRichTextString);
                    }
                    cellStyle.setFont(redFont);
                } else {
                    // 清空样式
                    cell.setCellStyle(cellStyle);
                }

上面代码设置了富文本指定范围的文字设置新的字体,但是生成的文件还是不生效。

EasyExcelFactory.write(new File(pathName)).head(titleList())
        .inMemory(Boolean.TRUE)  // 指定这个属性为true,才支持富文本和注释
        .registerWriteHandler(new HeadRowWriteHandler()).sheet(0).doWrite(Lists.newArrayList());

原因:

在 EasyExcel 中,inMemory 方法用于设置是否在内存中生成 Excel 文件。默认情况下,EasyExcel 会在磁盘上创建一个缓存文件,然后将数据写入这个缓存文件,最后再将缓存文件写入到 Excel 文件中。

如果你调用 inMemory(true),EasyExcel 将会在内存中生成 Excel 文件,而不是使用缓存文件。这意味着:

1.更快的写入速度:因为不需要频繁地读写磁盘,内存模式下的写入速度通常会更快。

2.支持 Comment 和 RichTextString:如果你需要在单元格中添加注释或使用富文本字符串,这些功能只能在内存模式下使用。

3.限制大文件写入:内存模式下,所有的数据都会被加载到内存中,这可能会导致内存溢出问题,特别是当你处理大型数据集时。

使用内存模式的主要优点是它可以支持更复杂的单元格操作,如添加注释或使用富文本字符串。然而,如果你的数据量很大,可能需要避免使用内存模式以防止内存问题。



2、冻结单元格

可以通过sheet.createFreezePane(column,row);方法指定冻结的列和行索引

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Sheet;

import java.util.Objects;

/**
 * 冻结单元格
 **/
public class FreezePaneWriteHandler implements SheetWriteHandler {

    private int column;

    private int row;

    public FreezePaneWriteHandler(Integer column, Integer row) {
        this.column = column;
        this.row = row;
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        if (Objects.nonNull(sheet)) {
            sheet.createFreezePane(column,row);
        }
    }
}

3、不合并单元格

Easyexcel使用中,生成多行表头模版时,同一行如果多个列内容一样,会被自动合并单元格,要避免这个问题,需要通过特殊处理。

import com.alibaba.excel.constant.OrderConstant;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.Set;

/**
 * 表头不合并策略
 * @author sunlei61
 * @date 2024/8/17
 **/
public class HeadNoMergeWriteHandler implements RowWriteHandler {
    /**
     * 指定哪些行需要合并单元格
     */
    private Set< Integer > rowNum;
    /**
     * 排除哪些不合并单元格的行
     */
    private Set< Integer > excludeRowNum;

    @Override
    public int order() {
        return OrderConstant.FILL_STYLE + 3;
    }

    public HeadNoMergeWriteHandler(){}

    public HeadNoMergeWriteHandler(Set< Integer > rowNum){
        this.rowNum = rowNum;
    }

    public HeadNoMergeWriteHandler(Set< Integer > rowNum, Set< Integer > excludeRowNum){
        this.rowNum = rowNum;
        this.excludeRowNum = excludeRowNum;
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
       if (!isHead){
           return;
       }

        if (CollectionUtils.isEmpty(rowNum) || rowNum.contains(row.getRowNum())) {
            // 如果是表头,取消合并
            Sheet sheet = writeSheetHolder.getSheet();
            int totalMergedRegions = sheet.getNumMergedRegions();
            for (int i = totalMergedRegions - 1; i >= 0; i--) {
                CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
                if (CollectionUtils.isEmpty(excludeRowNum) || !excludeRowNum.contains(mergedRegion.getFirstRow())) {
                    sheet.removeMergedRegion(i);
                }
            }
        }
    }
}

4、列宽自适应宽度

生成表格列比较多,制定特定的宽度会让表格很长,即使单元格内容一个字,也会很宽,不是很友好,可以通过设置sheet的自适应宽度来设置。

import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import java.util.Set;

/**
 * 列宽度自动适应
 * @author sunlei61
 * @date 2024/9/26
 **/
public class AutoSizeColumnWriterHandler implements RowWriteHandler {
    /**不需要自动适用宽度的列集合*/
    private Set< Integer > excludeColumns;

    public AutoSizeColumnWriterHandler(){
    }

    public AutoSizeColumnWriterHandler(Set< Integer > excludeColumns) {
       this.excludeColumns = excludeColumns;
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
        Integer sheetNo = writeSheetHolder.getSheetNo();
        if (sheetNo == 0 ) {
            Sheet sheet = writeSheetHolder.getSheet();
            int columns = row.getPhysicalNumberOfCells();
            for (int i = 0; i < columns; i++) {
                if (CollectionUtils.isNotEmpty(excludeColumns) && excludeColumns.contains(i)) {
                    continue;
                }
                sheet.autoSizeColumn(i);
            }
        }
    }
}

审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Excel
    +关注

    关注

    4

    文章

    230

    浏览量

    57558
  • 富文本
    +关注

    关注

    0

    文章

    2

    浏览量

    1579
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为进行检测温度的记录,可使用串口数据记录模块来实现

    为进行检测温度的记录,可使用串口数据记录模块来实现。 该数据记录模块是一种串口设备,在使用时其工作的波特率为9600bps,在接收到开发板所发送的数据时,就将数据完整地记录到TF卡的文
    发表于 12-01 08:18

    MCU单片机串口数据记录仪方案

    在工业控制、环境监测、物流追踪等众多领域,如何可靠、便捷地记录设备串口数据成为不少工程师关注的焦点。基于MCU单片机的串口数据记录仪方案,正以其高效集成、灵活存储和简便操作的特点,成为数据采集与记录场景中的理想选择。
    的头像 发表于 11-27 15:02 111次阅读

    电能质量在线监测装置的报警记录可以导出吗?

    电能质量在线监测装置的报警记录支持多种方式导出,具体操作取决于设备类型、存储配置及管理需求。以下是结合硬件特性、行业标准及实际案例的详细指南: 一、本地导出:直接通过设备或外接存储 1. 设备面板
    的头像 发表于 11-05 13:46 149次阅读

    行车记录仪UKCA认证申请

    行车记录仪(Car DVR / Dash Cam)出口英国时,需要符合英国的 UKCA(UK Conformity Assessed)认证 要求。UKCA 是英国脱欧后取代 CE 的合格标志,证明产品符合英国相关法规和技术标准。以下是行车记录仪办理 UKCA 认证的详细介
    的头像 发表于 10-23 14:26 227次阅读
    行车<b class='flag-5'>记录</b>仪UKCA认证申请

    车载CAN-Bus数据记录仪配置讲解视频#三格电子

    记录
    三格电子科技
    发布于 :2025年08月08日 10:25:14

    车载CAN-Bus数据记录仪#三格电子

    记录
    三格电子科技
    发布于 :2025年08月07日 11:37:01

    浅谈射频同轴连接器的失效原因

    同轴产品在使用中总会碰到问题,可能涉及到连接器也可能涉及到安装的电缆,本期将围绕总结3个大点8种同轴连接的失效原因,并对不同问题分别进行解析。
    的头像 发表于 06-04 10:00 1518次阅读

    从人工记录到智能巡检:云翎智能单北斗记录仪如何重塑电力巡检

    从人工记录到智能巡检,云翎智能单北斗记录仪以其高精度定位、实时数据传输与智能管理能力,彻底重塑了电力设施的检查流程。通过北斗卫星导航系统的核心技术优势,云翎智能单北斗记录仪实现了对电力巡检人员的精准
    的头像 发表于 04-03 14:58 615次阅读
    从人工<b class='flag-5'>记录</b>到智能巡检:云翎智能单北斗<b class='flag-5'>记录</b>仪如何重塑电力巡检

    如何操作电子温湿度记录

    电子温湿度记录仪是一种常用的记录仪产品类型,选用进口传感器、进口高能锂电池供电,采用低功耗技术设计,可以外接电源供电,体积小巧,整机功耗小,精度高。被广泛用于工业、环保、卫生防疫、仓储运输、博物馆等
    的头像 发表于 03-25 10:39 1155次阅读
    如何操作电子温湿度<b class='flag-5'>记录</b>仪

    DS1678实时事件记录器技术手册

    DS1678为实时时钟(RTC)事件记录仪,用来记录每次触发/INT引脚的非周期、异步事件的时间和日期。该器件记录第一次事件发生时的秒、分、时、星期、日期、月、年及世纪信息,并开启16位历时
    的头像 发表于 02-27 15:27 765次阅读
    DS1678实时事件<b class='flag-5'>记录</b>器技术手册

    银河电气VFE2000设备长时记录仪都有哪些作用?# #电工 #电路知识

    记录
    jf_76563207
    发布于 :2025年02月27日 08:43:17

    数据记录仪的计数原理和应用场景

    数据记录仪是一种用于测量、记录和分析各种数据的设备,其计数原理和应用场景可以归纳如下: 一、计数原理数据记录仪的计数原理主要基于传感器技术、信号处理技术以及数据存储技术。具体来说: 传感器采集
    发表于 02-24 14:28

    湖南银河电气VFE2000设备长时运行状态记录

    记录
    jf_97110154
    发布于 :2025年02月18日 16:04:19

    工业自动化采用DeepSeek协助调试PLC通讯

    项目采用IGT-DSER网关实现不用品牌的PLC之间通讯,碰到问题后,丢给DeepSeek用户手册后让它分析: 按照以上操作后一次性解决问题! 相关资料案例:*附件:PLC之间通讯.zip
    发表于 02-10 11:38