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

调用方式:

    @Overridepublic 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;
}

调用方式:

    @Overridepublic 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;}//导出excelpublic 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.hqwc.cn/news/276589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列三、DDL

一、DDL 1.1、概述 DDL是英文单词Data Definition Language的缩写&#xff0c;中文意思为数据定义语言&#xff0c;是用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段)的。 1.2、数据库操作 1.2.1、查询所有数据库 show databases; 1.2.2、创建数据库 # 语法 cre…

Vue学习计划-Vue2--VueCLi(五)全局事件总线、消息订阅与发布(pubsub)

抛出问题:我们多级组件&#xff0c;或者任意不想关的子组件如何传递数据呢&#xff1f; 1. 全局事件总线&#xff08;$bus&#xff09; 一种组件间通信的方式&#xff0c;适用于任意组件间通信 全局事件总线示意图&#xff1a; 安装全局事件总线&#xff1a; new Vue({..…

FM30H12G N通道沟槽电源MOS管 封装形式PDFN5*6

FM30H12G 是一款 N通道沟槽电源的场效应管&#xff08;MOS管&#xff09;&#xff0c;封装形式&#xff1a;PDFN5*6。 来百度APP畅享高清图片 FM30H12G应用&#xff1a; 1、液晶电视 2、笔记本 3、电梯 4、感应加热 5、电动工具

CMD命令行如何快速定位到指定路径

我们在工作过程中&#xff0c;经常需要在控制台输入一些命令行&#xff0c;有些情况下需要在指定的路径下执行某些命令行&#xff0c;这就需要在cmd中定位到指定路径&#xff0c;下面介绍 CMD快速定位到当前路径的两种方法。 1.手动定位法 首先&#xff0c;我们要定位到D:\Work…

商业印刷市场分析:预计2029年将达到53004亿元

商业印刷技术显示了强大的生命力。电子商务的扩张性发展&#xff0c;传统的商务印刷行业也在逐渐的转型。中国印刷业已深度融入全球印刷加工产业链&#xff0c;为国际社会超过50个国家提供印刷包装服务。数据显示&#xff0c;中国印刷业对外加工贸易额已达842亿元。 商业印刷是…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时&#xff0c;选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储&#xff0c;而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中&#xff0c;我们将探讨在 Redis 和传统关系型数据库之间…

圈子社交文化系统,了解生活,更了解你!APP小程序H5三端源码交付,支持二开!

在这个快节奏的时代&#xff0c;圈子社交系统成为了我生活中不可或缺的一部分。通过这个系统&#xff0c;我不仅可以结识到志同道合的朋友&#xff0c;还可以参与各种有趣的活动和发布自己的心情和见解。在这个圈子里&#xff0c;我感受到了无限的可能性和温暖的人性。 首先&am…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

【docker 】Dockerfile指令学习

学习文档地址 上篇文章&#xff1a;【docker 】基于Dockerfile创建镜像 Dockerfile指令文档地址 .dockerignore 文件 Dockerfile指令 常见的指令 Dockerfile 指令说明FROM指定基础镜像&#xff0c;用于后续的指令构建。MAINTAINER指定Dockerfile的作者/维护者。&#xff…

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…

c# 字段和属性(get、set、init)

目录 基本概念&#xff1a; 个人理解&#xff1a; 访问器的默认写法&#xff1a; set与init无法共存&#xff1a; init&#xff1a; 必须在类的实例化时给字段赋值的情况(require属性): 基本概念&#xff1a; “字段”就是类内成员变量&#xff0c;一般为了隐藏数据&…

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况&#xff1f;无论是为了适应不同的播放平台&#xff0c;还是为了满足客户的特定需求&#xff0c;批量调整视频尺寸都是一项繁琐而耗时的工作。但是&#xff0c;现在有一种方法可以让你轻松完成这项任务&#xff0c;那就是使用我们的…