easyexcel复杂表头导出

news2025/7/10 6:26:21

easyexcel复杂表头导出

/**
 * @ClassName ColumnWidthStyleStrategy
 * @Description: excel导出列长度
 **/
public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {

    private static final int MAX_COLUMN_WIDTH = 200;

    private  final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<Integer, Map<Integer, Integer>>(8);

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head,
                                  Integer relativeRowIndex, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (!needSetWidth) {
            return;
        }
        Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
        if (maxColumnWidthMap == null) {
            maxColumnWidthMap = new HashMap<Integer, Integer>(10);
            CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
        }
        Integer columnWidth = dataLength(cellDataList, cell, isHead);
        if (columnWidth < 0) {
            return;
        }
        if (columnWidth > MAX_COLUMN_WIDTH) {
            columnWidth = MAX_COLUMN_WIDTH;
        }
        Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
        if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
            maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
            writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 200);
        }
    }

    private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        }
        CellData cellData = cellDataList.get(0);
        CellDataTypeEnum type = cellData.getType();
        if (type == null) {
            return -1;
        }
        switch (type) {
            case STRING:
                return cellData.getStringValue().getBytes().length;
            case BOOLEAN:
                return cellData.getBooleanValue().toString().getBytes().length;
            case NUMBER:
                return cellData.getNumberValue().toString().getBytes().length;
            default:
                return -1;
        }
    }
}

public static void main(String[] args) {
        //配置字体,表头背景等
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = setConfigure();
        List<List<Object>> lists = new ArrayList<List<Object>>();
        for(int i = 0 ; i<20 ; i++){
            List<Object> list = new ArrayList<>();
            for(int j = 0 ; j<20 ; j++){
                list.add("测试"+i);
            }
            lists.add(list);
        }
        try {
            //设置请求信息(获取HttpServletResponse,可通过HttpServletResponse给导出数据命名)
     /*       response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=sjbkzjap.xlsx");
            ExcelWriter excelWriter = EasyExcelFactory.getWriter(response.getOutputStream());
            */
            String outPath = "c:/demo.xlsx";
            File file = new File(outPath);
            if(file.exists()){
                // 文件存在
                file.delete();
            }
            ExcelWriter excelWriter = EasyExcelFactory.getWriter(new FileOutputStream(outPath));
            WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet")
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .registerWriteHandler(new ExcelWidthStyleStrategy())
                    .build();
            // 创建一个表格
            WriteTable table = new WriteTable();
            // 动态添加 表头 headList --> 所有表头行集合
            //表头数据
            List<List<String>> headList = setHeadList();
            table.setHead(headList);
            excelWriter.write(lists,writeSheet,table);
            excelWriter.finish();
            System.out.println("导出成功!");

        }catch (IOException e){
            e.printStackTrace();
        }
    }
		
	//设置表头数据
    public static List<List<String>>  setHeadList(){
        List<String> headTitle0 = new ArrayList<String>();
        List<String> headTitle1 = new ArrayList<String>();
        List<String> headTitle2 = new ArrayList<String>();
        List<String> headTitle3 = new ArrayList<String>();
        List<String> headTitle4 = new ArrayList<String>();
        List<String> headTitle5 = new ArrayList<String>();
        List<String> headTitle6 = new ArrayList<String>();
        List<String> headTitle7 = new ArrayList<String>();
        List<String> headTitle8 = new ArrayList<String>();
        List<String> headTitle9 = new ArrayList<String>();
        List<String> headTitle14 = new ArrayList<String>();
        List<String> headTitle15 = new ArrayList<String>();
        List<String> headTitle16 = new ArrayList<String>();
        List<String> headTitle17 = new ArrayList<String>();
        List<String> headTitle18 = new ArrayList<String>();
        List<String> headTitle23 = new ArrayList<String>();
        List<String> headTitle24 = new ArrayList<String>();
        List<String> headTitle25 = new ArrayList<String>();

        //设置第一列为项目导出标题
        headTitle0.add("测试导出");
        headTitle1.add("测试导出");
        headTitle2.add("测试导出");
        headTitle3.add("测试导出");
        headTitle4.add("测试导出");
        headTitle5.add("测试导出");
        headTitle6.add("测试导出");
        headTitle7.add("测试导出");
        headTitle8.add("测试导出");
        headTitle9.add("测试导出");
        headTitle14.add("测试导出");
        headTitle15.add("测试导出");
        headTitle16.add("测试导出");
        headTitle17.add("测试导出");
        headTitle18.add("测试导出");
        headTitle23.add("测试导出");
        headTitle24.add("测试导出");
        headTitle25.add("测试导出");

        headTitle0.add("");
        headTitle1.add("");
        headTitle2.add("");
        headTitle3.add("");
        headTitle4.add("");
        headTitle5.add("");
        headTitle6.add("");
        headTitle7.add("");
        headTitle8.add("");
        headTitle9.add("");
        headTitle14.add("");
        headTitle15.add("");
        headTitle16.add("");
        headTitle17.add("");
        headTitle18.add("");
        headTitle23.add("");
        headTitle24.add("");
        headTitle25.add("单位:元");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("转正前");
        headTitle9.add("转正前");
        headTitle14.add("转正前");
        headTitle15.add("转正前");
        headTitle16.add("平均工资");
        headTitle17.add("转正后");
        headTitle18.add("转正后");
        headTitle23.add("转正后");
        headTitle24.add("转正后");
        headTitle25.add("平均工资");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("第一个月");
        headTitle9.add("第一个月");
        headTitle14.add("第二个月");
        headTitle15.add("第二个月");
        headTitle16.add("平均工资");
        headTitle17.add("第一个月");
        headTitle18.add("第一个月");
        headTitle23.add("第三个月");
        headTitle24.add("第三个月");
        headTitle25.add("平均工资");

        headTitle0.add("编号");
        headTitle1.add("姓名");
        headTitle2.add("年龄");
        headTitle3.add("居住地");
        headTitle4.add("父亲");
        headTitle5.add("母亲");
        headTitle6.add("工作单位");
        headTitle7.add("工资");
        headTitle8.add("日期");
        headTitle9.add("金额");
        headTitle14.add("日期");
        headTitle15.add("金额");
        headTitle16.add("平均工资");
        headTitle17.add("日期");
        headTitle18.add("金额");
        headTitle23.add("日期");
        headTitle24.add("金额");
        headTitle25.add("平均工资");

        //列数据保存
        List<List<String>> headList = new ArrayList<List<String>>();
        headList.add(headTitle0);
        headList.add(headTitle1);
        headList.add(headTitle2);
        headList.add(headTitle3);
        headList.add(headTitle4);
        headList.add(headTitle5);
        headList.add(headTitle6);
        headList.add(headTitle7);
        headList.add(headTitle8);
        headList.add(headTitle9);
        headList.add(headTitle14);
        headList.add(headTitle15);
        headList.add(headTitle16);
        headList.add(headTitle17);
        headList.add(headTitle18);

        //临时插入(可动态获取)
        List<String> maxList = new ArrayList<String>();
        List<String> maxList2 = new ArrayList<String>();
        maxList.add("测试导出");
        maxList.add("");
        maxList.add("转正后");
        maxList.add("第二个月");
        maxList.add("日期");
        maxList.add("日期");

        maxList2.add("测试导出");
        maxList2.add("");
        maxList2.add("转正后");
        maxList2.add("第二个月");
        maxList2.add("金额");
        maxList2.add("金额");
        headList.add(maxList);
        headList.add(maxList2);
        headList.add(headTitle23);
        headList.add(headTitle24);
        headList.add(headTitle25);
        return headList;
    }


    //配置字体,表头背景等
    private static HorizontalCellStyleStrategy setConfigure() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 10);
        headWriteCellStyle.setWriteFont(headWriteFont);


        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 字体策略
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 10);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        //边框
        //导出数据垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //导出数据水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        //设置 自动换行
        contentWriteCellStyle.setWrapped(true);
        //设置
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter + firebase 云消息通知教程 (android-安卓、ios-苹果)

如果能看到这篇文章的 一定已经对手机端的 消息推送通知 有了一定了解。 国内安卓厂商这里不提都有自己的FCM 可自行查找。&#xff08;国内因无法科学原因 &#xff0c;不能使用谷歌服务&#xff09;只说海外的。 目前 adnroid 和 ios 推送消息分别叫 FCM 和 APNs。这里通过…

【小白专用】php pdo方式连接sqlserver 设置方法 更新23.12.21

windows系统的拓展相对来说比较好安装&#xff0c;直接下载对应的dll文件&#xff0c;修改php.ini配置文件即可。 添加PHP对SQL SERVER的支持 1.新建PHP 文件&#xff0c;输入内容&#xff1a; <?php echo phpinfo(); ?> 2.运行后&#xff0c;可以查看到如下数据&…

【Xcode】解决Unable to process request - PLA Update available

出现场景 IOS更新app时&#xff0c;使用Xcode上传新版本的包时&#xff0c;提示无法上传。 Unable to process request -PLA update available you currently dont have access to this membership resource. To resolve this issue ,agree to the latest program license a…

ES排错命令

GET _cat/indices?v&healthred GET _cat/indices?v&healthyellow GET _cat/indices?v&healthgreen确定哪些索引有问题&#xff0c;多少索引有问题。_cat API 可以通过返回结果告诉我们这一点 查看有问题的分片以及原因。 这与索引列表有关&#xff0c;但是索引…

Patreon怎么订阅付款?Patreon会员订阅付款保姆级教程,用虚拟VISA卡订阅Patreon作者艺术家

Patreon 是目前世界上最受欢迎的会员平台之一。 内容创作者和艺术家通常很难让粉丝在经济上支持他们。 通过使用像 Patreon 这样的平台&#xff0c;创作者和艺术家可以很容易地从他们的作品中获得报酬。粉丝也能更方便的支持他们&#xff0c;今天就教大家如何订阅Patreon 首先我…

数字门牌管理系统:提升数据质量与服务品质的关键

一、引言 在当今社会&#xff0c;各行各业对数据质量的要求越来越高。为了满足客户需求并遵循国家行业标准&#xff0c;数字门牌管理系统应运而生。该系统以建立项目建设标准规范为核心&#xff0c;旨在提升数据质量与服务品质。 二、建立标准规范&#xff0c;确保数据质量 …

CS32L010 用Keil + Jlink(或其它)烧录已有的hex文件

1. 新建一个Project 打开KEIL&#xff0c;Project-New μVision Project&#xff0c;命名并保存到某个文件夹&#xff0c;比如我命名为burn-wipi 2. 设置Output 打开Options for Target Name of Excutable设置的名称和已有的Hex文件名称相同。 3. 设置Debug选项 设置Debug方…

构建搜索引擎,而非向量数据库(Vector DB) [译]

原文&#xff1a;Build a search engine, not a vector DB 作者&#xff1a; Panda Smith 在过去 12 个月中&#xff0c;我们见证了向量数据库&#xff08;Vector DB&#xff09;创业公司的迅猛增长。我此刻并不打算深入探讨它们各自的设计取舍。相反&#xff0c;我更想探讨和…

OpenCV如何以指定分辨率打开摄像头(C++ / Python代码演示)

问题背景 使用OpenCV打开USB摄像头时经常会遇到一个问题:我的摄像头最高分辨率是1920 * 1080,为什么用OpenCV打开摄像头保存的图片每次都是640 *480?能不能以最高分辨率打开并保存图片呢? 如何解决 首先需要确认自己的摄像头支持的最大分辨率是多少,具体步骤可以参考下…

基于ssm的车辆运输管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本车辆运输管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

若依框架跑起来,Java小白入门(一)

背景 本人Java小白&#xff0c;有一点编程基础&#xff08;c#&#xff09;。企业数字化建设大环境是JAVA&#xff0c;所以需要搞起来&#xff0c;而学习最快的方式就是读代码&#xff0c;学以致用干项目。所以这个系列就是从小白看能否变成小黑。码云上有很多框架&#xff0c;…

自定义Taro上传图片hooks(useUploadImg)

有两个方法需要提前引入 FileUtil(上传文件的方法)、to&#xff08;对请求接口返回做了二次处理&#xff0c;数据和错误提示等&#xff09; //FileUtil export namespace FileUtil {const env {timeout: 10000,uploadImageUrl: "阿里云的地址",};const genPolicy …

搭载紫光展锐芯的移远通信RedCap模组顺利通过中国联通OPENLAB实验室认证

近日&#xff0c;移远通信联合紫光展锐在中国联通5G物联网OPENLAB开放实验室&#xff0c;完成了RedCap模组RG207U-CN端到端测试验收&#xff0c;并获颁认证证书。移远通信RG207U-CN成为业内率先通过联通OPENLAB认证的紫光展锐RedCap芯片平台的模组。 本次测试基于联通OPENLAB实…

网络技术基础与计算思维实验教程_4.1_PSTN和以太网互连实验

实验内容 实验目的 实验原理 关键命令说明 实验步骤 构建以太网 工作区中放置路由器 交换机 PC机 直通线互连PC0和交换机 交换机和路由器 构建PSTN 放置PSTN 放置PC 为路由器安装modem 打开电源 再为终端安装modem 单击路由器选择图形配置 这个IP地址将成为PC0的默认网关地…

跆拳道加盟培训机构管理系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 跆拳道加盟培训机构管理系统源码开发方案旨在为跆拳道培训机构提供一个全面、高效的管理平台&#xff0c;帮助机构实现学员管理、课程安排、财务管理等方面的自动化和信息化。 &#xff08;二&#xff09;项目可行性…

debian10安装配置vim+gtags

sudo apt install global gtags --version gtags //生成gtag gtags-cscope //查看gtags gtags与leaderf配合使用 参考: 【VIM】【LeaderF】【Gtags】打造全定制化的IDE开发环境&#xff01; - 知乎

vue:ref的作用和实例

定义&#xff1a;用来获取元素或子组件注册或者引用信息&#xff0c;父组件通过$ref获取到相应的DOM对象和子组件 1、vue中ref的作用 获取页面的DOM元素获取子组件的对象&#xff08;也是一种通信方式&#xff09; 2、实例 1、获取DOM&#xff0c;首先创建一个父页面index然…

IDEA中Git的常用使用方式

IDEA中Git的常用使用方式 1.初次拉取远程仓库项目代码到本地2.初次提交本地项目代码到远程仓库新分支方式一&#xff1a;提交时把.git目录删除掉&#xff0c;不保留以往修改记录方式二&#xff1a;提交时不删除.git目录&#xff0c;保留以往修改记录 3.日常拉取、提交、推送代码…

虚幻学习笔记20—C++中用户输入控制

一、前言 用户输入主要有鼠标和键盘以及其他的遥感外接设备等&#xff0c;在虚幻中经常会用到这些输入设备的值&#xff0c;比如通过鼠标控制摄像头的方向、键盘控制人物移动等。本文主要讲解简单的输入绑定和虚幻5新增的”增强输入控制“两种方法。 二、实现 2.1、原始的输入…

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …