easyexcel复杂表头导出

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);
    }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[每周一更]-(第34期):Go泛型的理解和使用

泛型的实现方式有很多种&#xff0c;Go 1.18版本引入的泛型实现方式是通过type参数实现的。 在之前的Go版本中&#xff0c;由于语言本身的限制&#xff0c;泛型一直是Go语言的一个痛点和缺陷。程序员通常会使用接口和类型断言来实现泛型&#xff0c;但这种方法有时会导致代码难…

哪些行业装配柔性线路板 (FPC)时用到UV胶水?

柔性线路板&#xff08;FPC&#xff09;因其可弯曲和轻薄的特性&#xff0c;在多种行业和应用中都有广泛的应用。以下是一些常见的行业和场景&#xff0c;它们在装配FPC时可能使用UV胶水&#xff1a; 1.电子产品制造&#xff1a; 移动设备&#xff1a;如智能手机、平板电脑和可…

在线短信变量批量编辑工具

1.打开网站 短信编辑工具 2.点击:下载模板 3.编辑后 导入表格 4.点击合成短信 5.选中后复制 ctrlc 初衷&#xff1a; 短信变量批量编辑工具是一种用于批量编辑短信变量的工具。短信变量指的是短信中的可变部分&#xff0c;比如姓名、日期、金额等内容。 使用这个工具&…

python学习笔记--异常捕获

异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数&#xff0c;出现报错{}".format(err)) except ValueError as err:print(&quo…

基于物联网云平台的大棚温湿度监控系统

我国是农业大国&#xff0c;农业生产的质量对我国具有非常重要的意义&#xff0c;受到数字化技术的重点支持&#xff0c;但仍未完全实现智能化&#xff0c;农业生产效率仍有提升空间。 將物联网云服务应用到农业环境的监控中来&#xff0c;可以更高效地管理环境状况。贝尔智能…

Jmeter压力测试简单教程(包括服务器状态监控)

前段时间公司需要对服务器进行压力测试&#xff0c;包括登录前的页面和登录后的页面&#xff0c;主要目的是测试负载均衡的实现效果。不知道是不是因为Jmeter不如loadRunner火爆还是什么&#xff0c;网上关于Jmeter的资料有很多但是大多千篇一律&#xff0c;要么简单弄个页面测…

数据结构学习 leetcode64最小路径和

动态规划 题目&#xff1a; 建议看这里&#xff0c;有这道题详细的解析。我觉得写的挺好。 这是我在学动态规划的时候&#xff0c;动手做的一道题。 虽然我在学动态规划&#xff0c;但是我之前学了dps&#xff0c;所以我就想先用dps试着做&#xff0c;结果发现不行&#xf…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…

全网最细,Jmeter性能测试-入门级接口压测思路,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、压力测试重点关…

Nodejs 第三十章(防盗链)

防盗链&#xff08;Hotlinking&#xff09;是指在网页或其他网络资源中&#xff0c;通过直接链接到其他网站上的图片、视频或其他媒体文件&#xff0c;从而显示在自己的网页上。这种行为通常会给被链接的网站带来额外的带宽消耗和资源浪费&#xff0c;而且可能侵犯了原始网站的…

整数比较1 C语言xdoj93

描述&#xff1a; 编写程序&#xff0c;对于从键盘输入的2个整数&#xff0c;先输出较大者的个位数字&#xff0c;然后输出较小者的平方值。 输入说明&#xff1a; 输入的两个整数之间以一个空格分隔。 输出说明&#xff1a; 在一行上输出两个整数&#xff0c;整数之间以一个空…

将qt程序注册成服务

将qt程序注册成服务 1、qt服务模块管理下载 qt-solutions 2、QtService项目 2.1、将qtservice拷贝到项目代码路径 2.2、实现服务管理 PS&#xff1a;响应服务的启停 CustomService.h #include <QCoreApplication> #include "qtservice.h"class CustomSer…

上市公司-客户、供应商集中度(2000-2022年)

参考《中国工业经济》中吴安兵&#xff08;2023&#xff09;、《上海财经大学学报》中邱保印&#xff08;2023&#xff09;的做法&#xff0c;以客户集中度和供应商集中度之和衡量企业供应链集中度 其中客户集中度以前五名客户产生的营业收入占比衡量&#xff0c;供应商集中度…

好物设计- 实现区域图片变化自动截图

工具–Py即可 重点怎么获取窗口句柄? 使用 spyxx 可以获得句柄 (相当一个窗口的ID,无论窗口怎么变化ID不变我们都可以找到该窗口的详细信息) 替换句柄就可以,也可以不用句柄之间改截图区域 实战图片 import pygetwindow as gw import pyautogui import time import numpy a…

工业交换机之间Profinet无线以太网通信

在实际应用中&#xff0c;车间里控制柜内会有PLC、伺服电机、变频器等设备同时与触摸屏做数据交互&#xff0c;这些设备一般通过工业交换机进行数据组网。总控室内的PC组态软件往往需要采集到&#xff0c;车间内各部分触摸屏、PLC、变频器等设备信号&#xff0c;此时往往是工业…

当代大学生应该如何学习计算机科学

我相信&#xff0c;看到这个标题并且愿意阅读往下阅读的你&#xff0c;一定是正在学习计算机&#xff0c;而自己感到迷茫&#xff0c;或者你还真在考虑要不要学习计算机科学&#xff0c;再或者你是想学计算机而不知道到底该怎么去学的&#xff0c;好&#xff0c;既然你是榜上有…

ssm基于JAVA的校园综合服务系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

代码随想录第三十六天(一刷C语言)|背包问题理论基础分割等和子集

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、背包问题 题目&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装…

【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 请求上下文是指在 Web 应用程序中处理请求时&#xff0c;包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关…

Android 自动适配屏幕方案—— smallestWidth

smallestWidth限定符适配原理和屏幕分辨率限定符适配一样&#xff0c;都是通过创建多个values文件夹&#xff0c;系统根据限定符去寻找对应的dimens.xml文件&#xff0c;以确定不同设备上的大小展示&#xff0c;smallestWidth 限定符适配是拿 dp 值来等比缩放. 如何使用 一、…