SpringBoot使用Easypoi导出excel示例

关于easypoi可参考http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

下面是在网上看过的总结比较好的导出操作:

准备工作:在pom.xml中引入相关依赖

<!-- easy-poi -->
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.1.0</version>
</dependency>

下面给出四种导出excel的用法示例:

示例一:直接将List<Map<String, Object>>数据导出为excel示例(无需模板):

<!-- easy-poi -->
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.1.0</version>
</dependency>

示例二:通过注解,直接将Object(集合)数据导出为excel示例(无需模板):

相关的SchoolVO模型为:

import cn.afterturn.easypoi.excel.annotation.Excel;/*** 学校模型*/
public class SchoolVO {/** 学校名称 */@Excel(name = "学校名称", orderNum = "6", width = 20)private String schoolName;/** 学校地址 */@Excel(name = "学校地址", orderNum = "8", width = 20)private String schoolAddress;}

相关的StudentVO模型为:

import cn.afterturn.easypoi.excel.annotation.Excel;
import java.util.Date;/*** Student数据模型**/
public class StudentVO extends SchoolVO {/*** name指定导出excel时生成的列名* orderNum可指定导出的该属性对应的所在列的位置* width设置单元格宽度* type设置导出类型  1是文本, 2是图片, 3是函数,10 数字 默认是文本*/@Excel(name = "学号", orderNum = "1", type = 10, width = 15)private String studentID;@Excel(name = "姓名", orderNum = "2", width = 15)private String name;/*** 当gender为1时,导出的结果为 男, 当gender为0时,导出的结果为 女* mergeVertical设置是否纵向合并列*/@Excel(name = "性别",mergeVertical = true, replace = {"男_1", "女_0"},orderNum = "3", width = 5)private Integer gender;/*** type设置导出类型  1是文本, 2是图片, 3是函数,10 数字 默认是文本*/@Excel(name = "年龄",orderNum = "4", type = 10, width = 5)private int age;/*** 将Data日期导出为yyyy-MM-dd格式* mergeVertical设置是否纵向合并列* mergeRely设置合并列的前提条件,即:只有当索引为2的列(即:"性别"列)已经*          合并了时,那么此时这一列的纵向相同时,才能纵向合并;如果引为2的*          列(即:"性别"列)纵向数据不同,那么就算此列的纵向数据相同,那么*          也不会合并*/@Excel(name = "入校时间",mergeVertical = true, mergeRely = {2}, format = "yyyy-MM-dd", orderNum = "5", width = 20)private Date entranceTime;@Excel(name = "班级",orderNum = "7", width = 15)private String className;/*** 无参构造*/public StudentVO() {}/*** 全参构造*/public StudentVO(String studentID, String name, Integer gender,int age, Date entranceTime, String className) {this.studentID = studentID;this.name = name;this.gender = gender;this.age = age;this.entranceTime = entranceTime;this.className = className;}
}

导出excel的测试方法为:

/*** 对象---直接导出(无需模板)** 注:如果模型 的父类的属性也有@Excel注解,那么导出excel时,会连该模型的父类的属性也一会儿导出**/
@Test
public void directExportExcelByObject() throws IOException {List<StudentVO> list = new ArrayList<>(16);StudentVO student;Random random = new Random();for (int i = 0; i < 10; i++) {student = new StudentVO(i + "","name" + i,random.nextInt(2),random.nextInt(100),new Date(),"className" + i);student.setSchoolName("学校名称" + i);student.setSchoolAddress("学校地址" +i);list.add(student);}ExportParams exportParams = new ExportParams();exportParams.setSheetName("我是sheet名字");// 生成workbook 并导出Workbook workbook = ExcelExportUtil.exportExcel(exportParams, StudentVO.class, list);File savefile = new File("C:/Users/JustryDeng/Desktop/");if (!savefile.exists()) {boolean result = savefile.mkdirs();System.out.println("目录不存在,创建" + result);}FileOutputStream fos = new FileOutputStream("C:/Users/JustryDeng/Desktop/student.xls");workbook.write(fos);fos.close();
}

示例三:使用模板将Map<String, Object>数据导出为excel示例(需要模板

导出excel的测试方法为:

/*** 模板导出---Map组装数据** 注:.xls的模板可以导出.xls文件,也可以导出xlsx的文件;*    同样的, .xlsx的模板可以导出.xls文件,也可以导出xlsx的文件;**/
@Test
public void templateExportExcelByMap() throws IOException {// 加载模板TemplateExportParams params = new TemplateExportParams("templates/templateMap.xls");Map<String, Object> map = new HashMap<>(16);map.put("title", "全亚洲,最帅气人员名单");map.put("date", "2018-12-05");map.put("interviewer", "JustryDeng");List<Map<String, Object>> list = new ArrayList<>(16);Map<String, Object> tempMap;for (int i = 0; i < 5; i++) {tempMap = new HashMap<>();tempMap.put("name", "邓沙利文");tempMap.put("gender", new Random().nextInt(2) == 0 ? "男" : "女");tempMap.put("age", new Random().nextInt(90) + 11);tempMap.put("hobby", "活的,女的!!!");tempMap.put("handsomeValue", "100分(满分100分)");tempMap.put("motto", "只所以只帅到了全亚洲,是因为其他地方审美不同!");list.add(tempMap);}map.put("dataList", list);// 生成workbook 并导出Workbook workbook = ExcelExportUtil.exportExcel(params, map);File savefile = new File("C:/Users/JustryDeng/Desktop/");if (!savefile.exists()) {boolean result = savefile.mkdirs();System.out.println("目录不存在,进行创建,创建" + (result ? "成功!" : "失败!"));}FileOutputStream fos = new FileOutputStream("C:/Users/JustryDeng/Desktop/templateMapResult.xlsx");workbook.write(fos);fos.close();
}

示例四:使用模板将Object数据导出为excel示例(需要模板):

相关模型有HandsomeBoyPOJO:

/*** 具体信息 模型*/
public class HandsomeBoyPOJO {/** 姓名 */private String name;/** 性别 */private String gender;/** 年龄 */private int age;/** 爱好 */private String hobby;/** 帅气值 */private String handsomeValue;/** 座右铭 */private String motto;}

相关模型有ResultPOJO:

/*** 采访结果 模型**/
public class ResultPOJO {/** 标题 */private String title;/** 日期 */private String date;/** 采访人 */private String interviewer;/** 信息集合 */private List<HandsomeBoyPOJO> list;}

导出excel的测试方法为:

/*** 模板导出---对象组装数据** 注:实际上仍然是"模板导出---Map组装数据",不过这里借助了工具类,将对象先转换为了Map<String, Object>** 注:.xls的模板可以导出.xls文件,也可以导出xlsx的文件;*    同样的, .xlsx的模板可以导出.xls文件,也可以导出xlsx的文件;*/
@Test
public void templateExportExcelByObject() throws IOException, IllegalAccessException {// 加载模板TemplateExportParams params = new TemplateExportParams("templates/templateObject.xlsx");// 组装数据ResultPOJO resultPOJO = new ResultPOJO();resultPOJO.setTitle("全亚洲最帅人员名单");resultPOJO.setInterviewer("邓沙利文");resultPOJO.setDate("2018-12-05");List<HandsomeBoyPOJO> list = new ArrayList<>(8);resultPOJO.setList(list);HandsomeBoyPOJO handsomeBoyPOJO;for (int i = 0; i < 5; i++) {handsomeBoyPOJO = new HandsomeBoyPOJO();handsomeBoyPOJO.setAge(20 + i);handsomeBoyPOJO.setGender(i % 2 == 0 ? "女" : "男");handsomeBoyPOJO.setHandsomeValue(95 + i + "(满分100分)");handsomeBoyPOJO.setHobby("女。。。。");handsomeBoyPOJO.setMotto("我是一只小小小小鸟~");handsomeBoyPOJO.setName("JustryDeng");list.add(handsomeBoyPOJO);}// 生成workbook 并导出Workbook workbook = ExcelExportUtil.exportExcel(params, objectToMap(resultPOJO));File savefile = new File("C:/Users/JustryDeng/Desktop/");if (!savefile.exists()) {boolean result = savefile.mkdirs();System.out.println("目录不存在,进行创建,创建" + (result ? "成功!" : "失败!"));}FileOutputStream fos = new FileOutputStream("C:/Users/JustryDeng/Desktop/templateObjectResult.xls");workbook.write(fos);fos.close();
}/*** 对象转换为Map<String, Object>的工具类** @param obj*            要转换的对象*/
private static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {Map<String, Object> map = new HashMap<>(16);Class<?> clazz = obj.getClass();for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);String fieldName = field.getName();/** Returns the value of the field represented by this {@code Field}, on the* specified object. The value is automatically wrapped in an object if it* has a primitive type.* 注:返回对象该该属性的属性值,如果该属性的基本类型,那么自动转换为包装类*/Object value = field.get(obj);map.put(fieldName, value);}return map;
}

运行测试函数,成功导出excel:

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

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

相关文章

facebook对话链接_Facebook已开源其最新的聊天机器人Blender

它是一种更具人性化的聊天机器人&#xff0c;并击败了Google成为世界上最好的聊天机器人> Photo by Alex Haney on Unsplash4月29日&#xff0c;Facebook AI Research(FAIR)宣布已构建并开源了一个新的聊天机器人Blender。最先进的开源聊天机器人Facebook AI拥有开源的Blend…

DOM操作获取标签方法、数据类型

一、操作 html 页面 document.getElementById(box); // 选中一个id为box的标签可以理解为从文档里面 通过一个 id:box 来获取 一个元素 // > document 文档 ⇒ get 得到 ⇒ Element 元素 ⇒ By 通过 ⇒ id:box 二、操作标签内容&#xff1a; innerHTML – 会解析标签 var…

基于easypoi实现自定义模板导出excel

项目中需要做一个统计报表功能&#xff0c;实现各种Excel报表数据导出。要求表头能够动态配置&#xff0c;表数据通过存储过程实现&#xff0c;也要求能够动态配置。 技术选型&#xff1a; 由于之前在项目中使用过easypoi&#xff0c;相对于原生apache poi&#xff0c;能够用很…

vb6 datagrid表格垂直居中_老板不喜欢看你的Excel表格,学完这些美化技巧,早日升职加薪...

Excel报表是工作中经常要制作的&#xff0c;给老板看的表格越是简单明了越好&#xff0c;工作得到认可&#xff0c;给你升职加薪&#xff0c;如果你发给你老板的表格是这样的&#xff1a;对齐方式各种各样&#xff0c;数据看起来也很枯燥&#xff0c;仅需简单4点&#xff0c;轻…

typeof 数据类型转换

typeof 可以转换的数据类型有&#xff1a; number string boolean object undefined function null 原来是给对象占位的&#xff0c;代表空对象。后来JavaScript设计者也没改过来&#xff0c;所以 typeof 一直认为 null 的类型是 object const num null; num // object一、 …

Java接口修饰符详解

接口就是提供一种统一的”协议”&#xff0c;而接口中的属性也属于“协议”中的成员。它们是公共的&#xff0c;静态的&#xff0c;最终的常量。相当于全局常量。抽象类是不“完全”的类&#xff0c;相当于是接口和具体类的一个中间层。即满足接口的抽象&#xff0c;也满足具体…

python深度复制列表_Python-如何深层复制列表?

我对列表副本有一些问题&#xff1a;所以之后我得到了E0来自get_edge&#xff0c;我做的副本E0通过调用E0_copy list(E0)。我猜这里E0_copy是的较深的副本E0&#xff0c;我通过E0_copy了karger(E)。但是在主要功能上。为什么print E0[1:10]for循环之前的结果与for循环之后的结…

数据转换之 Number

看起来不是数组的转换为数字之后就不是数字&#xff08;NaN&#xff09; 只有 才会进行字符串拼接 - * / 都不会 let num Number(123); console.log(typeof(num) : num); // number : 123let demo true; let num Number(demo); console.log(typeof(num) : num); /…

sqlite3修改表内容python_Python sqlite3数据库模块使用攻略

Python作为数据科学主流语言&#xff0c;被广泛用于数据读存、处理、分析、建模&#xff0c;可以说是无所不能。数据一般存放在本地文件或者数据库里&#xff0c;之前介绍过如何使用python读取本地文件&#xff0c;也对# PyMySQL、cx_Oracle等数据库连接库做过简单的使用分享。…

parseInt(string, radix)

一、 变成 整形数字 二、 当字母和数字混杂的时候&#xff0c;从数字位开始看&#xff0c;一直看到非数字位为止&#xff0c;如果这个混杂的字符串不是以数字开头&#xff0c;那么就是 NaN 三、 第二个参数&#xff0c;表示将变量的值以多少进制&#xff08;范围2~32&#xff0…

查看论坛隐藏链接_软连接与硬链接的区别

点击上方蓝色“后端开发杂谈”关注我们, 专注于后端日常开发技术分享硬链接与软连接的联系与区别文件都有文件名和数据, 这在Linux上被分为两部分: 用户数据(user data) 与 元数据(metadata). 用户数据, 即文件数据块( data block), 数据块是记录文件真实内容的地方; 元数据是文…

parseFloat(string)

一、 将字符串转换为浮点数&#xff08;小数&#xff09; 二、 能正常输出小数 三、只看除了一个点以前的非数字位为止 let demo 100.1; let num parseFloat(demo); // 能正常输出小数 console.log(typeof(num) : num); // number : 100.1let demo 100.1.2; let num p…

python的合法语句_Python练习2

问答&#xff1a;1. 写出python中的几种分支结构&#xff0c;并解释其执行过程;(1) if&#xff1a;if 表达式: #条件语句 #输出(2)if...else...if 表达式: #条件语句 #输出else: #其他条件语句 #其他输出(3)if...elif...else...if 表达式: #条件1语…

java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽

为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控&#xff0c;那么如果程序出现异常错误时要如何排查呢&#xff1f;并且系统在运行时做了哪些事情我们又从何得知呢&#xff1f;这个时候日志这个概念就出现了&#xff0c;日志的出现对系统监控和异常分析起着…

python继承问题_Python类的继承问题

Python相比较Java&#xff0c;C之类的高级语言是相对来说比较容易的&#xff0c;但能把Python学的很好的人却不多。虽然Python容易&#xff0c;但python的学习道路并不简单&#xff0c;可借助的资料不多&#xff0c;能把python讲的明白的人更是不多。作为一门高级语言&#xff…

String(min)

不管括号里面是啥&#xff0c;都尝试转换为字符串 let demo 1234.1; let num String(demo); console.log(typeof(num) : num); // string : 1234.1let demo undefined; let num String(demo); console.log(typeof(num) : num); // string : undefinedlet demo nu…

SpringBoot项目中Controller层代码编写规范整理

文章目录Controller层代码规范SpringMVC接口定义要注意以下常见的几种问题1. 返回格式不统一2. 没有考虑失败情况3. 出现和业务无关的输入参数Controller层代码规范 主要的内容是就是接口定义里面的内容&#xff0c;你只要遵循里面的规范&#xff0c;controller就问题不大&…

如何从一张图片里取出其中一部分_如何鉴别坑人的锌合金龙头

01.对大部分人而言&#xff0c;锌合金龙头是一个熟悉又陌生的词儿。当我们提起锌合金龙头时&#xff0c;很多人会一脸茫然的回答&#xff1a;啥&#xff1f;锌合金龙头&#xff1f;没听过&#xff01;不认识&#xff01;但在日常生活中锌合金龙头的出现率可不低&#xff01;不信…

Boolean()

一、 尝试把括号里面值转换为布尔值。 二、 只要是六个表示 false 之外的&#xff08;false / null / undefined / NaN / ""&#xff09;&#xff0c;都是 true let demo undefined; let num Boolean(demo); console.log(typeof(num) : num); // Boolean : f…

SpringBoot框架中各层(DTO、DAO、Service、Controller)理解

粗略理解 View层→Controller层&#xff08;响应用户请求&#xff09;→Service层&#xff08;接口→接口实现类&#xff09;→DAO层&#xff0c;即Mapper层&#xff08;抽象类&#xff1a;xxxMapper.java文件&#xff0c;具体实现在xxxMapper.xml&#xff09;→Model层&#…