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;允许发布、读取、代理和记录视频和…

设计模式_行为型模式_观察者模式

行为型模式&#xff1a;主要关注的是对象之间的通信 例如&#xff1a;一个对象调用另一个对象的成员 方法 目的&#xff1a; 观察者-监听者模式&#xff08;发布-订阅模式&#xff09;设计模式&#xff1a;主要关注的是对象的一对多的关系&#xff0c;也就是多个对象都依赖一…

hadoop使用内置包进行性能测试TestDFSIO、NNBench、MRBench、SliveTest

hadoop使用内置包进行性能测试 hadoop使用内置包进行性能测试 hadoop使用内置包进行性能测试TestDFSIO read & writeNNBenchMRBenchSliveTest TestDFSIO read & write TestDFSIO 是一个 Hadoop 自带的基准测试工具&#xff0c;用于测试 HDFS 的读写性能。它会模拟大量…

vue3制作类微信的六位的密码输入框

这是一个 Vue 3 组件&#xff0c;用于创建一个自定义的密码输入框。这个输入框由6个小输入框组成&#xff0c;每个小输入框只能输入一个字符。当用户在一个小输入框中输入字符后&#xff0c;焦点会自动跳到下一个输入框&#xff0c;直到所有6个输入框都填满为止。当6个字符都输…

Scrapy的crawlspider爬虫

scrapy的crawlspider爬虫 学习目标&#xff1a; 了解 crawlspider的作用应用 crawlspider爬虫创建的方法应用 crawlspider中rules的使用 1、crawlspider是什么 回顾之前的代码中&#xff0c;我们有很大一部分时间在寻找下一页的url地址或者是内容的url地址上面&#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&…

javaWeb文件上传

1.文件上传的应用场景&#xff1a;提交作业 上传头像 提交简历&#xff08;上传附件&#xff09; 上传商品&#xff0c;图书图片 2.文件上传的前台如何编写以及注意事项&#xff1a; 1.肯定需要用到表单 2.文件上传的那一栏需要提供 input的typefil…

UnicodeUtil.java

计算精度问题带根号√ √ UNICODE字符表 package util;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** radical* 根号√运算问题 Unicode * * author ZengWenFeng* email 117791303qq.com* date 2015.04.07*/ public class UnicodeUtil {/*** 字…

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;让我们谈谈可变和不可…

【INTEL(ALTERA)】 quartus使用Nios® V 处理器系统仿真失败,没有打印输出消息

说明 在 Synopsys* VCS* 和 VCS* MX 仿真器中模拟由以下位置生成的 Nios V 处理器系统时&#xff0c;可能会出现该问题&#xff1a; 英特尔 Quartus Prime Pro Edition 软件版本 23.1 至 23.4&#xff0c;或 英特尔 Quartus Prime Standard Edition 软件版本 23.1std 这是由…

位运算技巧

获取某个10进制数值的二进制最高位 public class Main {public static void main(String[] args) {// 调用 highBit 函数&#xff0c;传入参数 67int result highBit(67);// 输出结果的二进制表示System.out.println(Integer.toBinaryString(result)); // 输出 1000000}/***…

打工人副业变现秘籍,某多/某手变现底层引擎-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…