首页 > 其他分享 >EasyExcel 自定义宽高

EasyExcel 自定义宽高

时间:2024-04-15 15:55:56浏览次数:16  
标签:cellData return 自定义 columnWidth EasyExcel 宽高 cell cellDataList import

package com.cloud.module.management.common.handler;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class CustomCellWriteWidthHandle extends AbstractColumnWidthStyleStrategy {

    private final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>());

            Integer columnWidth = null;
            try {
                columnWidth = this.dataLength(cellDataList, cell, isHead);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            // 单元格文本长度大于60换行
            if (columnWidth >= 0) {
                if (columnWidth > 60) {
                    columnWidth = 60;
                }
                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 * 256);
                }
            }
        }
    }
    /**
     * 计算长度
     * @param cellDataList
     * @param cell
     * @param isHead
     * @return
     */
    private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) throws IOException {
        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;
                    // 如果是图片返回图片的宽度,并设置row的高度为图片的高度
                    case EMPTY:
                        if (ObjectUtil.isNotEmpty(cellDataList)  && ObjectUtil.isNotEmpty(cellDataList.get(0))) {
                            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(cellDataList.get(0).getImageDataList().get(0).getImage()));
                            int originalWidth = bufferedImage.getWidth();
                            int originalHeight = bufferedImage.getHeight();

                            // 计算与210的宽度的比例
                            double ratio = (double) 210 / originalWidth;
                            int newWidth = 210; // 设置新宽度为210
                            int newHeight = (int) (originalHeight * ratio);

                            // 将像素转换为磅以设置Excel行高
                            double heightInPoints = newHeight * 0.75;
                            cell.getRow().setHeightInPoints((float) heightInPoints);

                            // 将像素转换为Excel中的宽度单位
                            double charWidth = 7.0; // 默认的Excel字体中标准字符的大致宽度
                            double estimatedChars = newWidth / charWidth;
                            return (int) estimatedChars; // 以Excel单位返回调整后的宽度
                        }
                        return -1;
                    default:
                        return -1;
                }
            }
        }
    }
}

  

       // 导出 Excel 文件
            EasyExcel.write(response.getOutputStream(), this.entityClass)
                    .sheet(dto.getSheetName())
                    .includeColumnFiledNames(dto.getColumnList())
                    .registerWriteHandler(new CustomCellWriteWidthHandle()) /*自适应列宽*/
                    .registerWriteHandler(seedDemandCellWriteHandler)
                    .doWrite(writeList);

 

标签:cellData,return,自定义,columnWidth,EasyExcel,宽高,cell,cellDataList,import
From: https://www.cnblogs.com/deepalley/p/18136124

相关文章

  • layUI Table自定义工具栏和搜索参数
    layUITable自定义工具栏和搜索参数视频讲解地址https://www.bilibili.com/video/BV1P94y197nNHTML代码<divclass="container-fluid"><tableclass="layui-hide"id="test"lay-filter="test"></table></div><s......
  • SSM使用自定义ConditionalOnProperty实现按需加载spring bean
    SSM使用自定义ConditionalOnProperty实现按需加载springbean背景:公司提供的系统框架是SSM架构,SSM架构是没有springboot的ConditionalOnProperty注解的,而我们的系统是在很多区县部署的,每个区县会有一些定制化需求,其中有一个类只在一个区县里用得到,所以打算采用按需加载bean的......
  • el-table-column自定义实现el-tooltip效果
    说明使用el-table-column自定义某列内容为左侧展示商品图片,右侧展示商品标题以及id,商品标题超过两行显示省略号,并且鼠标移入在上方显示完整。界面展示template...<el-table-columnlabel="商品信息"prop="title"min-width="200"><template#default="scope"><div......
  • Feign日志 - 自定义 info级别打印
    背景由于feign,默认只有debug的level,才能打印出日志。不太符合一般项目的loginfolevel的约定。因此决定自定义feign的log打印。目的在infolevel下,可以打印feign日志寻找线索打开openfeign的核心包目录寻找log相关类 feign-1.png通过FeignLoggerfactor......
  • Entity Framework 自定义外键关系
    EntityFramework自定义外键关系在EntityFramework中,你可以通过在模型类中使用属性来定义自定义外键关系。以下是一个简单的例子,展示了如何在两个实体之间创建一对一的关联关系:  publicclassUser{publicintUserId{get;set;}publicstringUsername......
  • Redefine library-自定义函数库
    1.jjVolcano_Redefinelibrary(scRNAtoolVis)#jjVolcano只有9个颜色,Redefine到我的24个颜色,并与我umap中的分群颜色对应jjVolcano_Redefine<-function(diffData=NULL,myMarkers=NULL,order.by=c("avg_log2FC"),log2FC.cutoff=0.......
  • 实现自定义注解校验方法参数(AOP+自定义注解+自定义异常+全局异常捕获)
    一、实现目的在编写接口的时候,通常会先对参数进行一次校验,这样业务逻辑代码就略显冗杂,如果可以把校验参数的代码进行统一管理,在方法或者属性上直接添加注解就可以实现参数的校验,就可以提升代码编写的效率。二、实现原理通过自定义注解,注解在入参VO的属性上,设定需要满足的条件,然......
  • Windows 自定义服务(Windows Service)管理
    Windows自定义服务(WindowsService)管理在Windows系统中,你可以使用sc.exe命令或者PowerShell来创建自定义服务。以下是两种方法:使用sc.exe命令:打开命令提示符(以管理员身份运行)。使用sc.exe命令创建服务,语法如下:sccreate<ServiceName>binPath="<PathtoE......
  • Ant - Form 自定义组件 form.getFiledsValue 如何获取值
    import{FC,useState}from'react';importtype{SelectProps}from'antd';import{Select,Space,Flex,Input,Button}from'antd';/***扩展选择器组件,可以通过键盘enter输入一个Option*/constInputSelect:FC<{defaultOptio......
  • C语言10-指针(多级指针、空指针、野指针),自定义数据类型(枚举enum、结构体struct)
    第12章指针pointer12.6多级指针指向指针的指针称为多级指针eg:int*ptr1=&num; int**ptr2=&ptr1; int***ptr3=&ptr2;12.7空指针应用场景:1.暂时不确定指向的指针,可以在定义的时候先赋值为NULL2.有些指针函数,如果内部出现异常无法成功实现功能,可以返回NUL......