java导出excel通用工具(POI,类注解形式)

        通过给类定义注解(设置名称,设置kv转换值),然后利用设置的名称和传入的数据进行导出。

只需要在项目添加两个工具类就可以实现excel导出功能。

1、单sheet

        步骤:1、根据业务需求定义导出的类,并设置表头名称。
                   2、调用工具类                                     

 定义类:

@Data
public class ScDetailsReviewExcelVo {
    //年份
    @ExcelIO(value = "年份")
    private String examineYear;
    /**考核批次*/
    @ExcelIO(value = "考核批次")
    private String batchName;
    //姓名
    @ExcelIO(value = "姓名")
    private String realname;
    //科室
    @ExcelIO(value = "科室")
    private String departName;
    /**考核总分*/
    @ExcelIO(value = "考核总分")
    private String examineScore;
    /**个人能力得分*/
    @ExcelIO(value = "个人能力得分")
    private String personnelScore;
    /**工作业绩得分*/
    @ExcelIO(value = "工作业绩得分")
    private String postScore;
    /**额外工作得分*/
    @ExcelIO(value = "额外工作得分")
    private String otherScore;
    /**状态*/
    @ExcelIO(value = "状态",kv="0-未提交;1-已完成;2-已退回;3-已归档")
    private Integer userState;
}

调用方式:

    @Override
    public void exprotExcel(HttpServletResponse response, ScDetailsReview scDetailsReview) {
        //获取数据
        List<ScDetailsReviewExcelVo> list=scDetailsReviewMapper.selectForExcel(scDetailsReview);
        //调用工具
        ExcelUtil<ScDetailsReviewExcelVo> excelVoExcelUtil=new ExcelUtil<>(ScDetailsReviewExcelVo.class);
        //导出数据
        excelVoExcelUtil.getExcel(list,response,"打分");
    }

2、多sheet

        步骤:1、定义大类作为参数对象。
                   2、在大类中设置List子类,且各List对应各sheet页数据,设置List泛型中的属性为其注
                        解表头名称(下列例子中只展示了一个大类和其中的一个子类)
                   3、使用工具类进行调用。

        

定义的类:       

@Data
public class ScPerformanceForChildExcelVo {

    //个人能力
    private List<ScPersonalDetailedExcelVo> scPersonalDetailedExcelVoList=new ArrayList<>();
    //工作业绩
    private List<ScPostDetailedExcelVo> scPostDetailedExcelVoList=new ArrayList<>();
    //额外
    private List<ScOtherDetailedExcelVo> scOtherDetailedExcelVoList=new ArrayList<>();

}
@Data
public class ScPersonalDetailedExcelVo {
    /**类别*/
    @ExcelIO(value = "类别")
    private String category;
    /**考评指标*/
    @ExcelIO(value = "考评指标")
    private String assessmentIndex;
    /**考评要点*/
    @ExcelIO(value = "考评要点")
    private String keyPoint;
    /**评分参考细则*/
    @ExcelIO(value = "评分参考细则")
    private String detailedRules;
    /**总分分值*/
    @ExcelIO(value = "总分分值")
    private String ruleScore;
    /**得分*/
    @ExcelIO(value = "得分")
    private String personnelUserScore;
}

调用方式:

    @Override
    public void exprotExcel(HttpServletResponse response, ScDetailsReview scDetailsReview) {
        //个人能力
        List<ScPersonalDetailedExcelVo> personalDetailedExcelVoList= scPersonalDetailedService.selectExcel(scDetailsReview);
        //工作业绩
        List<ScPostDetailedExcelVo> scPostDetailedExcelVoList= scPostDetailedService.selectExcel(scDetailsReview);
        //额外
        List<ScOtherDetailedExcelVo> scOtherDetailedExcelVoList= scOtherDetailedService.selectExcel(scDetailsReview);

        ScPerformanceForChildExcelVo scPerformanceForChildExcelVo=new ScPerformanceForChildExcelVo();
        scPerformanceForChildExcelVo.setScPersonalDetailedExcelVoList(personalDetailedExcelVoList);
        scPerformanceForChildExcelVo.setScPostDetailedExcelVoList(scPostDetailedExcelVoList);
        scPerformanceForChildExcelVo.setScOtherDetailedExcelVoList(scOtherDetailedExcelVoList);

        ExcelUtil<ScPerformanceForChildExcelVo> scPerformanceForChildExcelVoExcelUtil=new ExcelUtil<>(ScPerformanceForChildExcelVo.class);
        scPerformanceForChildExcelVoExcelUtil.getExcels(scPerformanceForChildExcelVo,response);

    }

3、工具类

注解类:

package org.jeecg.utils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelIO {
    /** 字段名称 */
    String value();

    /** 导出映射,格式如:0-未知;1-男;2-女 */
    String kv() default "";
}

ExcelUtil:

package org.jeecg.utils;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelUtil<T> {
    //泛型
    public Class<T> clazz;

    public Workbook workbook;

    //sheet对象
    public Sheet sheet;

    //标题行总列数
    private Integer tableNames;

    //样式集合
    private Map<String,CellStyle> styleMap=new HashMap<>();

    //需要导出字段
    private List<Field> fieldList=new ArrayList<>();

    public ExcelUtil(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    //创建样式
    private void setStyleMap(){
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        Font titleFont = workbook.createFont();
        titleFont.setFontName("宋体");
        titleFont.setFontHeightInPoints((short) 9);
        titleFont.setBold(true);
        style.setFont(titleFont);
        style.setWrapText(true);
        //标题样式
        styleMap.put("title", style);

    }

    //设置单元格宽度
    private void setWidth(Sheet sheet,Integer colNum){
        for (int i = 0; i < colNum; i++) {
            sheet.autoSizeColumn(i);
//            int columnWidth = sheet.getColumnWidth(i);
//            sheet.setColumnWidth(colNum,Math.min(sheet.getColumnWidth(i)+1000,15*256));
        }
    }

    //创建表头
    private void setTableName(Class clazz,Sheet sheet,Integer rowNum){
        //创建标题
        List<String> tiltes=new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //获取字段属性
            ExcelIO annotation = field.getAnnotation(ExcelIO.class);
            if(null!=annotation){
                String value = annotation.value();
                //需要的标题
                tiltes.add(value);
                //需要的字段
                fieldList.add(field);
            }
        }
        //写入标题
        tableNames=tiltes.size();
        Row row = sheet.createRow(rowNum);
        for (int i = 0; i < tableNames; i++) {
            Cell cell = row.createCell(i);
            cell.setCellValue(tiltes.get(i));
            cell.setCellStyle(styleMap.get("title"));
        }
    }

    //创建标题行
    private void setTilte(String tilte){
        //创建标题
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue(tilte);
        cell.setCellStyle(styleMap.get("title"));
        //合并
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,tableNames-1));
    }

    //写入数据
    private void setData(List<T> data,Integer rowNum){
        for (Object datum : data) {
            Row row = sheet.createRow(rowNum);
            rowNum++;
            for (Integer integer = 0; integer < tableNames; integer++) {
                Cell cell = row.createCell(integer);
                Field field = fieldList.get(integer);
                cell.setCellValue(changeValue(field,datum));
            }
        }
    }

    //写入数据
    private void setDataForChildeSheet(List<Object> data,Sheet sheet,Integer rowNum){
        for (Object datum : data) {
            Row row = sheet.createRow(rowNum);
            rowNum++;
            for (Integer integer = 0; integer < tableNames; integer++) {
                Cell cell = row.createCell(integer);
                Field field = fieldList.get(integer);
                cell.setCellValue(changeValue(field,datum));
            }
        }
    }

    //有需要转换的值
    private String changeValue(Field field,Object data){
        try {
            field.setAccessible(true);
            String filed = null==field.get(data)?"":field.get(data).toString();
            if(null==filed){
                return "";
            }

            ExcelIO annotation = field.getAnnotation(ExcelIO.class);
            if(null!=annotation){
                String value = annotation.kv();
                if(null==value || "".equals(value)){
                    return filed;
                }
                String[] split = value.split(";");
                for (String s : split) {
                    String[] split1 = s.split("-");
                    if(split1.length>=2){
                        if(split1[0].equals(filed)){
                            return split1[1];
                        }
                    }
                }
            }
            return "";
        } catch (IllegalAccessException e) {
            return "";
        }
    }

    //多sheet页其中一个
    private void setSheetData(Sheet sheet1, Class<?> genericClass, List<Object> o) {
        //创建标题
        setTableName(genericClass,sheet1,0);
        //写数据
        setDataForChildeSheet(o,sheet1,1);
        //设置宽度
        setWidth(sheet1,tableNames);
        //清除存在的数据
        fieldList.clear();
        tableNames=0;
    }

    //导出excel
    public void getExcel(List<T> data, HttpServletResponse response,String name){
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 创建一个新的工作薄
        workbook = new XSSFWorkbook();
        // 创建一个工作表
        sheet = workbook.createSheet("Sheet1");
        //初始化样式
        setStyleMap();
        //创建表头
        setTableName(clazz,sheet,1);
        //创建标题
        setTilte(name);
        //写入数据
        setData(data,2);
        //设置宽度
        setWidth(sheet,tableNames);

        //返回给前端
        try {
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    //导出多个sheet页,传入的data的内部是多个list,list泛型就是各个sheet的数据,且泛型需要用excle注解进行设置
    public void getExcels(T data, HttpServletResponse response){
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 创建一个新的工作薄
        workbook = new XSSFWorkbook();
        //初始化样式
        setStyleMap();
        //获取子类class对象
        Field[] declaredFields = clazz.getDeclaredFields();
        Integer i=0;
        for (Field declaredField : declaredFields) {
            Type genericType = declaredField.getGenericType();
            if (genericType instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) genericType;
                Type[] typeArguments = parameterizedType.getActualTypeArguments();
                if (typeArguments.length > 0) {
                    //子类class对象
                    Class<?> genericClass = (Class<?>) typeArguments[0];
                    try {
                        declaredField.setAccessible(true);
                        //获取子类数据
                        List<Object> o = (List)declaredField.get(data);
                        if(null!=o && o.size()>0){
                            // 创建子工作表
                            Sheet sheet1 = workbook.createSheet("Sheet"+i);
                            i++;
                            //为子工作表赋值
                            setSheetData(sheet1,genericClass,o);
                        }
                    } catch (IllegalAccessException e) {
                        return;
                    }
                }
            }
        }

        //返回给前端
        try {
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}

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

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

相关文章

gitee创建一个新仓库和提交代码到码云

gitee创建一个新的项目并提交到码云 新建一个仓库 填写创建基本信息 以这个新创建的仓库保存项目所有的代码 在IDEA中克隆这个项目 从版本控制中新建一个git项目 从码云成功克隆项目 创建微服务模块 创建第商品模块 以以上同样的步骤完成下面几个模块的创建 聚合总…

Tita集成无代码API:电商客服与营销系统的升级

API的力量&#xff1a;优化电商与客服系统的无代码集成解决方案 在数字化转型的时代&#xff0c;电商与客服系统的高效运作对于企业的成功至关重要。无代码API平台Tita为此提供了一站式解决方案&#xff0c;使企业在无需深入的代码开发工作的前提下&#xff0c;便能实现各种系…

云原生向量计算引擎 PieCloudVector:为大模型提供独特记忆

拓数派大模型数据计算系统&#xff08;PieDataComputingSystem&#xff0c;缩写&#xff1a;πDataCS&#xff09;在10月24日程序员节「大模型数据计算系统」2023拓数派年度技术论坛正式发布。πDataCS 以云原生技术重构数据存储和计算&#xff0c;「一份存储&#xff0c;多引擎…

基于Modis的遥感数据的地表温度的获取解决方案----以京津唐为例

1.背景与技术路线 地表温度(LST)是区域和全球尺度地表物理过程中的一个关键因子,也是研究地表和大气之间物质交换和能量交换的重要参数。许多应用如干旱、高温、林火、地质、水文、植被监测,全球环流和区域气候模型等都需要获得 LST。本方案以北京为例采用星载传感器的红外通道…

亚马逊鲲鹏系统可快速创建大量的买家账户

在数字时代的浪潮中&#xff0c;人们总是在寻找更便捷、高效的方式来完成各种任务&#xff0c;而亚马逊鲲鹏系统的出现&#xff0c;无疑为那些渴望拥有大批量买家号的人提供了一个全新的可能性。在这个系统中&#xff0c;注册买家号变得轻而易举&#xff0c;只需准备好一些必要…

软件库论坛社区后台系统源码工具箱积分商城会员体系和在线商城于一体

HBuilderX前端软件社区thinkphp后端源码 搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名 电脑需要下载&#xff1a;HBuilderX 下载后 登录账号 没有账号就注册账号 然后上传文件 在选择你上传的文件即可 打包选择 “发行” 可以打包app h5等等 演…

互联网加竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

Android Studio Git Invocation failed Unexpected end of file from server

Invocation failed Unexpected end of file from server 解决办法&#xff0c;勾选以下内容

【构建工具】vite2没捂热,vite5又来了,性能大幅提升!

vite2还没焐热&#xff0c;vite5又来了&#xff01;&#xff01;&#xff01; 就在一周前vite5重磅发布了&#xff01;性能大幅提升! 请看下面&#xff1a;下面是翻译过来的&#xff0c;原文&#xff1a;Vite 5.0 发布&#xff01; |维特 (vitejs.dev) Vite 4 大约在一年前发布…

swagger的ApiModelProperty设置字段的顺序

需求 让前端可以直接通过swagger就能知道各个字段是什么意思 如何配置 比如&#xff0c;我们设置了ApiModelProperty ApiModelProperty("用户主键")private Long userId;在swagger页面能直接看到注释 但是这个顺序是按照字母排序的&#xff0c;明显不符合我们的要…

三层交换,DHCP的详解与VRRP

目录 一、三层交换 1、三层交换机的作用&#xff1a; 2.vlan的虚拟接口vlanif&#xff08;ifinterface接口&#xff09; 3.三层交换机实验 4.拓展实验​编辑 二、DHCP 1.自动获取ip地址&#xff1a; 2.DHCP的好处&#xff1a; 3.分配方式&#xff1a; 4.举例&#xff…

[每周一更]-(第77期):反向代理的优势

反向代理 比如通过香港服务器去代理一些国内访问不到的服务器&#xff0c;APP中有些应用就将请求通过香港服务器转发到目标服务器中。 应该是域名访问&#xff0c;国内服务器需要备案&#xff0c;然后放到香港服务器做个转发代理。 代理服务器&#xff0c;客户机在发送请求时&…

【Android】使用 Glide 给 ImageView 加载图像的简单案例

前言 Android Glide是一个用于在Android应用中加载和显示图片的流行开源库。它提供了简单易用的API&#xff0c;可以帮助开发者高效地加载远程图片、本地图片以及GIF动画&#xff0c;并提供了缓存、内存管理等功能&#xff0c;使得图片加载在移动应用中更加流畅和高效。Glide还…

Axure的使用

1.Axure是什么&#xff1f;&#xff1f;&#xff1f; Axure是一款功能强大的原型设计工具&#xff0c;它可以让用户快速地创建交互式原型&#xff0c;并针对原型进行测试和改进。Axure的主要特点包括可定制的界面元素库、交互动画效果、条件逻辑、团队协作等功能&#xff0c;适…

2023年全国职业院校技能大赛信息安全管理与评估赛项正式赛(模块一)GZ032

全国职业院校技能大赛高等职业教育组 信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥…

Intewell-Hyper I_V2.0.0_release版本正式发布

新型工业操作系统_Intewell-Hyper I_V2.0.0_release版本正式发布 软件发布版本信息 版本号&#xff1a;V2.0.0 版本发布类型&#xff1a;release正式版本 版本特点 1.建立Intewell-Hyper I基线版本 版本或修改说明 基于Intewell-Lin V2.3.0_release版本&#xff1a; 1.Devel…

uniapp 蓝牙小程序-兼容安卓和iOS

withTimeout方法可以在搜寻设备时等待指定的秒数&#xff0c;如果30秒内未搜索到则取消搜索 /*** 超时控制函数* param {Promise} promise 回调函数* param {number} timeout 超时时间, 默认10s*/ export function withTimeout(promise, timeout 10000) {let timeoutEvent …

软实力篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、必知必会的几点二、必须了解的两大法则三、项目经历怎么写前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、必知必…

Docker-consul容器服务自动发现与注册

什么叫微服务或者注册与发现&#xff1f; 是一种分布式管理系统&#xff0c;定位服务的方法。 在传统的架构中&#xff0c;应用程序之间直连到已知的服务。 已知的服务&#xff1a;设备提供的网络、IP地址、基于tcp/ip端口 基于现微服务部署&#xff0c;服务的动态性&#…

webGL开发智慧城市流程

开发智慧城市的WebGL应用程序涉及多个方面&#xff0c;包括城市模型、实时数据集成、用户界面设计等。以下是一个一般性的流程&#xff0c;您可以根据项目的具体需求进行调整&#xff0c;希望对大家有所帮助。 1.需求分析&#xff1a; 确定智慧城市应用程序的具体需求和功能。考…