springboot导出(POI)

POI官方文档

引入依赖

        <!--POI--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency>

定义注解

        我们结合自定义注解,让导出使用起来更方便简洁且更容易扩展。

@ExcelField

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {/*** 字段名*/String name() default "";/*** 字段顺序*/int order() default 1;/*** 单元格宽度*/int width() default 100;/*** 日期格式*/String dateFormat() default "yyyy-MM-dd HH:mm:ss";
}

@ExcelHeader 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelHeader {/*** 文件名称* @return*/String fileName() default "导出文件";/*** sheet页名称* @return*/String sheetName() default "sheet1";/*** 表头是否加粗* @return*/boolean headBold() default false;/*** 表头颜色* @return*/IndexedColors headColor() default IndexedColors.GREEN;
}

编写POI导出工具类

public class ExcelExportUtil {/** @description: 导出 <br>* @create: 2023/9/12 16:28 <br>* @param response* @param data* @param clazz* @return void*/public static<T> void export(HttpServletResponse response, List<T> data, Class<T> clazz){if(ObjectUtils.isEmpty(response) || ObjectUtils.isEmpty(data)){return;}//解析表头ExcelHeader excelHeader = getExcelHeader(clazz);if(ObjectUtils.isEmpty(excelHeader)){return;}//解析字段List<String> keyList = new ArrayList<>();List<ExcelField> excelFieldList = new ArrayList<>();getExcelFields(clazz, keyList, excelFieldList);if(ObjectUtils.isEmpty(keyList)){return;}//创建workbook,SXSSFWorkbook支持大数据量导出Workbook workbook = new SXSSFWorkbook();//创建sheetSheet sheet = workbook.createSheet(excelHeader.sheetName());//创建表头Row row = createHeader(workbook, sheet, excelHeader, excelFieldList);//写入数据setData(data, sheet, keyList, excelFieldList);//输出文件try {String fileName = URLEncoder.encode(excelHeader.fileName(), "UTF-8");response.setContentType("application/octet-stream");response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes("ISO8859-1")));response.setHeader("filename", fileName);workbook.write(response.getOutputStream());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}/** @description: 设置数据 <br>* @create: 2023/9/13 9:33 <br>* @param data* @param sheet* @param keyList* @return void*/private static<T> void setData(List<T> data, Sheet sheet, List<String> keyList, List<ExcelField> excelFieldList){List<Map<String, Object>> dataList = convertDataToJson(data);Map<String, Object> rowData;String dataKey;Object value;ExcelField excelField;for (int i = 0; i < dataList.size(); i++) {Row row = sheet.createRow(i+1);rowData = dataList.get(i);for (int j = 0; j < keyList.size(); j++) {dataKey = keyList.get(j);value = rowData.get(dataKey);if(ObjectUtils.isEmpty(value)){continue;}Cell cell = row.createCell(j);cell.setCellValue(value.toString());}}}/** @description: 创建表头 <br>* @create: 2023/9/12 17:28 <br>* @param workbook* @param sheet* @param excelFieldList* @return org.apache.poi.ss.usermodel.Row*/private static Row createHeader(Workbook workbook, Sheet sheet, ExcelHeader excelHeader,List<ExcelField> excelFieldList){//创建行Row row = sheet.createRow(0);//创建行样式CellStyle cellStyle = workbook.createCellStyle();//单元格颜色cellStyle.setFillForegroundColor(excelHeader.headColor().getIndex());cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//字体Font font =  workbook.createFont();font.setBold(excelHeader.headBold());font.setFontName("宋体");cellStyle.setFont(font);for (int i = 0; i < excelFieldList.size(); i++) {ExcelField excelField = excelFieldList.get(i);Cell cell = row.createCell(i);cell.setCellValue(excelField.name());cell.setCellStyle(cellStyle);sheet.setColumnWidth(i+1, excelField.width() * 10 );}return row;}/** @description: 获取excel头注解信息 <br>* @create: 2023/9/12 10:28 <br>* @param clazz* @return com.springboot.demo.base.annotation.ExcelHeader*/private static<T> ExcelHeader getExcelHeader(Class<T> clazz){ExcelHeader excelHeader = clazz.getAnnotation(ExcelHeader.class);return excelHeader;}/** @description: 获取excel字段注解信息 <br>* @create: 2023/9/12 10:31 <br>* @param clazz* @return java.util.List<com.springboot.demo.base.annotation.ExcelField>*/private static<T> void getExcelFields(Class<T> clazz, List<String> keyList, List<ExcelField> excelFieldList){Field[] fields = clazz.getDeclaredFields();if(ObjectUtils.isEmpty(fields)){return;}Map<String, String> keyMap = new HashMap<>();for(Field field : fields){ExcelField excelField = field.getAnnotation(ExcelField.class);if(ObjectUtils.isNotEmpty(excelField)){keyMap.put(excelField.name(), field.getName());excelFieldList.add(excelField);}}if(ObjectUtils.isNotEmpty(excelFieldList)){excelFieldList = excelFieldList.stream().sorted(Comparator.comparing(ExcelField::order)).collect(Collectors.toList());}for (ExcelField excelField : excelFieldList) {keyList.add(keyMap.get(excelField.name()));}}/** @description: 将数据转未json <br>* @create: 2023/9/13 10:00 <br>* @param data* @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>*/private static<T> List<Map<String, Object>> convertDataToJson(List<T> data){ObjectMapper objectMapper = new ObjectMapper();//日期格式objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));//设置时区objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//序列化-忽略null值的属性objectMapper.setSerializationInclusion(Include.NON_NULL);//序列化-允许序列化空对象objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);List<Map<String, Object>> dataList = objectMapper.convertValue(data, List.class);return dataList;}
}

测试

Test.java
@Data
@ExcelHeader(fileName = "导出文件.xlsx")
public class Test {@ExcelField(name = "字段1", width = 500, order = 1)private String field1 = "撒大声地撒分都是";@ExcelField(name = "字段2", width = 400, order = 2)private Integer field2 = 11;@ExcelField(name = "字段3", width = 300, order = 5)private Double field3;@ExcelField(name = "字段4", width = 700, order = 10)private BigDecimal field4 = new BigDecimal("12312312312.222");@ExcelField(name = "字段5", width = 600, order = 3)private Date field5 = new Date();
}

TestController.java

@Api(tags = "测试")
@RestController
@RequestMapping("/test")
public class TestController {@ApiOperation("test")@PostMapping("/test")public void test(HttpServletResponse response){Test test = new Test();List<Test> list = new ArrayList<>();for (int i = 0; i < 10000; i++) {list.add(test);}ExcelExportUtil.export(response, list, Test.class);}
}

输出结果

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

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

相关文章

Redis——其他数据类型介绍

概要介绍 Redis中有10种不同的数据类型。之前的blog中介绍了Redis中常见的五大数据类型&#xff1a;String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;ZSet。而Redis中还有许多其他的数据类型&#xff0c;一般在特定的场景中使用 Stream 首先介绍一下什么…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

C语言数组和指针笔试题(一)(一定要看)

目录 一维数组例题1例题2例题3例题4例题5例题6例题7例题8例题9例题10例题输出结果 字符数组例题1例题2例题3例题4例题5例题6例题7 一维数组 int a[] {1,2,3,4}; 1:printf("%d\n",sizeof(a)); 2:printf("%d\n",sizeof(a0)); 3:printf("%d\n",si…

继续上一个爬虫,所以说selenium加browsermobproxy

继续&#xff0c;书接上回&#xff0c;这次我通过jsrpc&#xff0c;也学会了不少逆向的知识&#xff0c;感觉对于一般的网站应该都能应付了。当然我说的是简单的网站&#xff0c;遇到那些混淆的&#xff0c;还有那种猿人学里面的题目&#xff0c;还是免谈了。那种需要的水平太高…

Linux(Centos7)中安装Docker和DockerCompose

一、安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支 持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频…

Mysql高级——存储引擎

存储引擎 1). 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的客户端提…

PY32F003F18之RS485通讯

PY32F003F18将USART2连接到RS485芯片&#xff0c;和其它RS485设备实现串口接收后再转发的功能。 一、测试电路 二、测试程序 #include "USART2.h" #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf() #include "…

C++之智能指针shared_ptr死锁问题(二百)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Nacos安装指南以及集群搭建

结合SpringCloud从基础到活用&#xff08;超详细&#xff09;查看 一、Windows安装 开发阶段采用单机安装即可。1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a;GitHub主页&#xff1a;https:…

汇报一下日常健身和锻炼方面的进展

跑步app最终从“咕咚”和“悦跑圈”二选一&#xff0c;锁定到悦跑圈上了。 七月太热&#xff0c;配速下降&#xff0c;但还能玩出花样 八月中旬气温稍降&#xff0c;配速提升&#xff0c;拟合抛物线 截至发博日,实际连续跑步接近600天了 截至发博日&#xff0c;完成2023跑量96…

警惕!1本SCI解除“On Hold”,Chemosphere等11本期刊仍被标记!

期刊动态&#xff1a;警惕期刊“On Hold”状态&#xff01; 2023年8月&#xff0c;小编从科睿唯安官网整理出12本期刊处于“On Hold”状态&#xff01; 参考往期推文&#xff1a; 警惕&#xff01;10本“On Hold”期刊已被踢&#xff0c;仍有12本期刊被标记&#xff01; 期…

Xcelium(xrun)的基础使用

Xcelium的基础使用 https://www.cnblogs.com/Alfred-HOO/articles/17416139.html 一&#xff0c;基础问答 1&#xff0c;Xcelium的由来&#xff1f; Xcelium&#xff08;xrun&#xff09;是cadence最新的仿真工具&#xff0c;Incisive(irun)的升级版本。 2&#xff0c;如何用x…

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

一位参加2023 Google开发者大会 菜鸟的自卑

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

【Blender】Blender入门学习

目录 0 参考视频教程0.1 Blender理论知识0.2 Blender上手实践0.3 FBX模型导入Unity 1 Blender的窗口介绍1.1 主界面1.2 模型编辑窗口 2 Blender的基本操作2.1 3D视图的平移2.2 3D视图的旋转2.3 3D视图的缩放2.4 修改快捷键2.5 使物体围绕选择的物体旋转2.6 四视图的查看2.7 局部…

接口测试(详细总结)

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发知识后&#xff0c;发现接口测试其实都…

Unity中程序集dll

一&#xff1a;前言 一个程序集由一个或多个文件组成&#xff0c;通常为扩展名.exe和.dll的文件称为程序集&#xff0c;.exe是静态的程序集&#xff0c;可以在.net下直接运行加载&#xff0c;因为exe中有一个main函数(入口函数&#xff09;&#xff0c;.dll是动态链接库&#…

机器学习:基于梯度下降算法的逻辑回归实现和原理解析

这里写目录标题 什么是逻辑回归&#xff1f;Sigmoid函数逻辑回归损失函数梯度下降 逻辑回归定义逻辑函数线性组合模型训练决策边界 了解逻辑回归&#xff1a;从原理到实现什么是逻辑回归&#xff1f;逻辑回归的原理逻辑回归的实现逻辑回归的应用代码示例算法可视化 当涉及到二元…

模板学堂|数据可视化仪表板大屏设计流程梳理

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https&#xff1a;//dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&a…

Keil MDK-ARM 软件的部分常用快捷键如下

F7&#xff1a;编译。F8: 下载。F9&#xff1a;添加/取消断点。Ctrl F5&#xff1a;调试。Tab&#xff1a;将选中的内容整体右移。Shift Tab&#xff1a;将选中的内容整体左移。Home&#xff1a;将光标移至行首。End&#xff1a;将光标移至行末。Ctrl >&#xff1a;光标…