文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

EasyExcel自适应列宽、行高、自动换行

2023-09-18 13:53

关注

一、自定义模版

二、工具类

import com.alibaba.excel.enums.CellDataTypeEnum;import com.alibaba.excel.metadata.CellData;import com.alibaba.excel.metadata.Head;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;import com.alibaba.nacos.common.utils.CollectionUtils;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellType;import org.apache.poi.ss.usermodel.Sheet;import java.util.HashMap;import java.util.List;import java.util.Map;public class CustomCellWeightWeightConfig extends AbstractColumnWidthStyleStrategy {    private Map> CACHE = new HashMap<>();    @Override    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);        if (needSetWidth) {            Map maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());            if (maxColumnWidthMap == null) {                maxColumnWidthMap = new HashMap<>();                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);            }            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);            if (columnWidth >= 0) {                if (columnWidth > 254) {                    columnWidth = 254;                }                Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {                    maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);                    Sheet sheet = writeSheetHolder.getSheet();                    sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 200);                }                //设置单元格类型                cell.setCellType(CellType.STRING);                // 数据总长度                int length = cell.getStringCellValue().length();                // 换行数                int rows = cell.getStringCellValue().split("\n").length;                // 默认一行高为20                cell.getRow().setHeightInPoints(rows * 20);            }        }    }        private Integer dataLength(List cellDataList, Cell cell, Boolean isHead) {        if (isHead) {            return cell.getStringCellValue().getBytes().length;        } else {            CellData cellData = cellDataList.get(0);            CellDataTypeEnum type = cellData.getType();            if (type == null) {                return -1;            } else {                switch (type) {                    case STRING:                        // 换行符(数据需要提前解析好)                        int index = cellData.getStringValue().indexOf("\n");                        return index != -1 ?    cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;                    case BOOLEAN:                        return cellData.getBooleanValue().toString().getBytes().length;                    case NUMBER:                        return cellData.getNumberValue().toString().getBytes().length;                    default:                        return -1;                }            }        }    }}

 三、测试示例 

import com.alibaba.excel.EasyExcel;import com.alibaba.excel.ExcelWriter;import com.alibaba.excel.write.metadata.WriteSheet;import com.alibaba.excel.write.metadata.fill.FillWrapper;import com.alibaba.excel.write.metadata.style.WriteCellStyle;import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;import lombok.Data;import org.apache.poi.ss.usermodel.HorizontalAlignment;import org.apache.poi.ss.usermodel.VerticalAlignment;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class ExcelUtil {    public static void main(String[] args) {        // 模板文件路径        String tempFilePath = "/Users/sunny/templates/exportExcelTemplate.xlsx";        // 导出目标文件        String excelFileName = "/Users/sunny/templates/测试导出Excel.xlsx";        // 根据模板文件生成目标文件        ExcelWriter excelWriter = EasyExcel                .write(excelFileName)                .withTemplate(tempFilePath)                // 自定义列宽、行高                .registerWriteHandler(new CustomCellWeightWeightConfig())                .build();        // 内容样式        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();        // 水平居中        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);        // 垂直居中        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);        // 设置自动换行,前提内容中需要加「\n」才有效        contentWriteCellStyle.setWrapped(true);        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现        HorizontalCellStyleStrategy horizontalCellStyleStrategy =                new HorizontalCellStyleStrategy(null, contentWriteCellStyle);        WriteSheet writeSheet = EasyExcel                .writerSheet().head(UserTest.class)                .registerWriteHandler(horizontalCellStyleStrategy)                .build();        // 测试数据        List list = new ArrayList<>();        for (int i = 0; i < 10; i++) {            UserTest userTest = new UserTest();            userTest.setName("测试测试测试测试测试测试测试测试\n测试测试测试测试测试测试测试测试" + i);            userTest.setAge(25 + i);            userTest.setAddress("北京北京北京北京北京北京北京北京\n北京北京北京北京北京北京北京北京北京" + i);            list.add(userTest);        }        // 第一种        Map> map = new HashMap<>();        map.put("data", list);        map.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), writeSheet));        // 第二种//        excelWriter.fill(new FillWrapper("data", list), writeSheet);        excelWriter.finish();    }}@Dataclass UserTest {    private String name;    private Integer age;    private String address;}

四、导出结果

参考 https://blog.csdn.net/liuao107329/article/details/126306205

来源地址:https://blog.csdn.net/weixin_42151235/article/details/128333199

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯