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.mzph.cn/news/223270.shtml

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

相关文章

【媒体开发】利用FFMPEG进行推拉流

目录 1. 下载并启动媒体服务 2. 使用 FFMPEG 拉流并推送到指定服务地址 3. 客户端拉流 1. 下载并启动媒体服务 MediaMTX&#xff0c;也即之前的rtsp-simple-server&#xff0c;是一个即用型、零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布、读取、代理和记录视频和…

Web安全-SQL注入常用函数(二)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、MySQL数据库构成 初始化安装MySQL数据库后(…

智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.模拟退火算法4.实验参数设定5.算法结果6.…

Android---Kotlin 学习007

集合可以方便你处理一组数据&#xff0c;也可以作为值参传给函数&#xff0c;和我们学过的其它变量类型一样&#xff0c;List、Set 和 Map 类型的变量也分为两类&#xff0c;只读和可变。 List创建与元素获取 通过 listOf() 函数创建一个 List 集合。 val listString : List&…

ShardingSphere数据分片之读写分离

1、概述 读写分离是一种常见的数据库架构&#xff0c;它将数据库分为主从库&#xff0c;一个主库&#xff08;Master&#xff09;用于写数据&#xff0c;多个从库&#xff08;Slave&#xff09;进行轮询读取数据的过程。主从库之间通过某种通讯机制进行数据的同步。 所以&…

React Native android环境搭建,使用夜神模拟器进行开发(适用于0.73+版本)

前言 本文基于&#xff1a;“react-native” : “^0.73.0” 1.安装 Node Node.js&#xff0c;下载时选择 > 18 版本 2.下载并安装 JDK Java SE Development Kit (JDK)&#xff0c;下载时选择 17 版本 安装 验证是否安装成功 打开命令提示符输入 javac -version 回车 3.…

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09;。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中&#xff0c;对于可变和不可变对象的行为差异是一个重要概念&#xff0c;特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先&#xff0c;让我们谈谈可变和不可…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion替换背景

在Stable Diffusion软件中,使用ControlNet+模型实现固定物体批量替换背景 出图的流程。 一、准备好图片 1.你需要准备好一些白底图或者透明底图用于训练模型。 2.你需要准备同样角度的其他背景色底图用于ControlNet勾线 3.注意检查你的图片尺寸,是否为1:1,…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

svn使用步骤

服务器端主要用来创建仓库&#xff0c;然后供客户端去访问与下载。 客户端&#xff1a; 图形化界面的使用&#xff1a;这里使用的是tortoise工具 1.创建一个文件夹作为自己的本地仓库目录 2.鼠标右键文件夹&#xff0c;在菜单中点击SVN checkout 3.找个图 这一步骤相当于git中…

最新版xposed编写教程

环境&#xff1a; andriod studio2023.1.1 jdk17 gradle8.2 流程&#xff1a; 1.新建项目&#xff0c;选empty views activity即可&#xff08;其他也可&#xff09; 2.语言选java&#xff0c;其他路径名称等暗战自己需要随便改&#xff0c;然后点击finish 3.修改AndroidMan…

茶室茶楼计时计费软件,软件中的商品管理计时操作教程

一、前言 茶室在营业的时候&#xff0c;不但需要计时间&#xff0c;同时还需要管理商品入库出库库存等管理。这就需要一款实用的操作简单的管理软件。 下面以 佳易王茶社计时计费软件V18.0为例说明&#xff0c;其他版本可以参考本教程。 软件下载或技术支持可以点击最下方官…

和利时DCS数据采集

在工业自动化领域&#xff0c;和利时DCS&#xff08;分布式控制系统&#xff09;被广泛应用&#xff0c;它对于工厂的生产过程和设备管理起到了重要的作用。然而&#xff0c;对于和利时DCS数据的采集&#xff0c;很多工厂面临着一些难点。本文将介绍和利时DCS的概述&#xff0c…

C语言—每日选择题—Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

智慧港口解决方案:PPT全文69页,附下载

关键词&#xff1a;智慧港口解决方案&#xff0c;数字化港口&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头&#xff0c;智慧港口发展趋势 一、智慧港口建设背景 随着数字经济、智慧交通发展&#xff0c;强调“要大力发展智慧交通和智慧物流”“努力打造世界一流的…

LAMP与LNMP架构

目录 一、概述 二、各组件的主要作用 一. 编译安装Apache httpd服务 二. 编译安装mysqld 服务 三. 编译安装PHP 解析环境 四. 安装论坛 LNMP架构 一、编译安装Nginx 二、编译安装MySQL服务 三、安装配置php文件 四、部署论坛 扩展 fpm参数优化 一、概述 LAMP架构是…

TCP/IP详解——UDP 协议

文章目录 1. UDP1.1 UDP 头部1.2 UDP 校验和1.3 UDP 传输过程1.4 UDP-Lite1.5 最大 UDP 数据报长度1.6 UDP 输入队列 1. UDP UDP&#xff1a;用户数据报协议&#xff08;User Datagram Protocol&#xff09;面向无连接的&#xff0c;也就是无需建立连接&#xff0c;传输不可靠。…

宏景eHR SQL 注入漏洞复现(CVE-2023-6655)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 中发现了一种被分类为关键的漏洞,该漏洞影响了Login Interface组件中/w_selfservice/oauthservlet/%2e../.%2e/genera…

ICV:2023 年上半年全球量子计算的进展

​ 2023年上半年&#xff0c;量子计算&#xff08;QC&#xff09;领域取得了一系列重要进展和突破&#xff0c;显示出量子计算技术的快速发展和商业应用的不断拓展。本报告从制度进步、产业生态、投融资形势、总结与展望四个方面对量子计算领域进行了系统而详细的分析。报告不仅…