【springboot+easypoi】一行代码搞定excel导入导出

原文:https://www.jianshu.com/p/5d67fb720ece

 

 

  • 开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子【easypoi】,下面介绍下“轮子”的使用。

pom引入

  • 不再需要其他jar
       <dependency><groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.0.3</version> </dependency> 

编写实体类

  • 此处注意必须要有空构造函数,否则会报错“对象创建错误”
  • 关于注解@Excel,其他还有@ExcelCollection,@ExcelEntity ,@ExcelIgnore,@ExcelTarget等,此处我们用不到,可以去官方查看更多
属性类型类型说明
nameStringnull列名
needMergebooleanfasle纵向合并单元格
orderNumString"0"列的排序,支持name_id
replaceString[]{}值得替换 导出是{a_id,b_id} 导入反过来
savePathString"upload"导入文件保存路径
typeint1导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
widthdouble10列宽
heightdouble10列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意
isStatisticsbooleanfasle自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点
isHyperlinkbooleanfalse超链接,如果是需要实现接口返回对象
isImportFieldbooleantrue校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormatString""导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormatString""导入的时间格式,以这个是否为空来判断是否需要格式化日期
formatString""时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormatString"yyyyMMddHHmmss"导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormatString""数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageTypeint1导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffixString""文字后缀,如% 90 变成90%
isWrapbooleantrue是否换行 即支持\n
mergeRelyint[]{}合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了
mergeVerticalbooleanfasle纵向合并内容相同的单元格
import cn.afterturn.easypoi.excel.annotation.Excel;import java.util.Date;public class Person { @Excel(name = "姓名", orderNum = "0") private String name; @Excel(name = "性别", replace = {"男_1", "女_2"}, orderNum = "1") private String sex; @Excel(name = "生日", exportFormat = "yyyy-MM-dd", orderNum = "2") private Date birthday; public Person(String name, String sex, Date birthday) { this.name = name; this.sex = sex; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } } 

导入导出公用方法

public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){ ExportParams exportParams = new ExportParams(title, sheetName); exportParams.setCreateHeadRows(isCreateHeader); defaultExport(list, pojoClass, fileName, response, exportParams); } public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){ defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName)); } public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){ defaultExport(list, fileName, response); } private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) { Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list); if (workbook != null); downLoadExcel(fileName, response, workbook); } private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); } catch (IOException e) { throw new NormalException(e.getMessage()); } } private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) { Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); if (workbook != null); downLoadExcel(fileName, response, workbook); } public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){ if (StringUtils.isBlank(filePath)){ return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); List<T> list = null; try { list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); }catch (NoSuchElementException e){ throw new NormalException("模板不能为空"); } catch (Exception e) { e.printStackTrace(); throw new NormalException(e.getMessage()); } return list; } public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){ if (file == null){ return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); List<T> list = null; try { list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params); }catch (NoSuchElementException e){ throw new NormalException("excel文件不能为空"); } catch (Exception e) { throw new NormalException(e.getMessage()); } return list; } 

对的,没看错,这就可以导出导入了,看起来代码挺多,其实是提供了多个导入导出方法而已

测试

  @RequestMapping("export")public void export(HttpServletResponse response){ //模拟从数据库获取需要导出的数据 List<Person> personList = new ArrayList<>(); Person person1 = new Person("路飞","1",new Date()); Person person2 = new Person("娜美","2", DateUtils.addDate(new Date(),3)); Person person3 = new Person("索隆","1", DateUtils.addDate(new Date(),10)); Person person4 = new Person("小狸猫","1", DateUtils.addDate(new Date(),-10)); personList.add(person1); personList.add(person2); personList.add(person3); personList.add(person4); //导出操作 FileUtil.exportExcel(personList,"花名册","草帽一伙",Person.class,"海贼王.xls",response); } @RequestMapping("importExcel") public void importExcel(){ String filePath = "F:\\海贼王.xls"; //解析excel, List<Person> personList = FileUtil.importExcel(filePath,1,1,Person.class); //也可以使用MultipartFile,使用 FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)导入 System.out.println("导入数据一共【"+personList.size()+"】行"); //TODO 保存数据库 } 

导出结果

导出结果

测试导入

导出结果再添加一行,执行,输出导入数据行数




作者:小尘哥
链接:https://www.jianshu.com/p/5d67fb720ece
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

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

相关文章

用java编写一个计算器_用java程序编写一个计算器

展开全部给你一个参考&#xff0c;希望不62616964757a686964616fe58685e5aeb931333330343261要被百度吞了当晚餐import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.text.DecimalFor…

TypeScript基础入门 - 接口 - 可索引的类型

转载地址 TypeScript基础入门 - 接口 - 可索引的类型 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.11 为了保证后面的学习演示需要安装下ts-node&#xff0c;这样后面的每个操作都能直接运行看到输出的结果。 npm install -D ts-node 后面自己在练…

jquery中的ajax方法(备忘)

参考&#xff1a;https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax_ajax.asp 1.url: 要求为String类型的参数&#xff0c;&#xff08;默认为当前页地址&#xff09;发送请求的地址。 2.type: 要求为String类型的参数&…

java高级类_Java高级类特性(一)

权限类内同包不同包子类不同包非子类private√default√√protected√√√public√√√√四、super关键字的使用package com.test.java;/** super可以用来修饰属性、方法、构造器* 1)当子类与父类中有同名的属性时&#xff0c;可以通过"super.属性"显式的调用父类中声…

Android.对话框(AlertDialog/Toast/Snackbar)

1、资料&#xff1a; 1.1、Android提醒微技巧&#xff0c;你真的了解Dialog、Toast和Snackbar吗&#xff1f; - CSDN博客.html&#xff08;https://blog.csdn.net/guolin_blog/article/details/51336415&#xff09; 1.2、Android界面设计之对话框——定制Toast、AlertDialog -…

第4次作业

转载于:https://www.cnblogs.com/wzh2920330283/p/11027254.html

基于Docker搭建Percona XtraDB Cluster数据库集群

本文实验的环境参数 阿里云ECS Centos7.5Docker version 18.06.0-cepercona/percona-xtradb-cluster:5.7Percona XtraDB Cluster的镜像下载地址&#xff1a;https://hub.docker.com/r/percona/percona-xtradb-cluster/ 怎么使用Docke和下载镜像&#xff0c;请查看Docker的官方文…

java publickey_数字证书中读取PublicKey

1. 读取https签发证书中的key1) 在下面的代码中,是实现读取证书字符串来读取key的,CERTIFICATE 就是一个证书的字符串, 而方法cf.generateCertificate() 接受的是一个InputStream 流,当然这个地方也可以读取一个文件 new FileInputSream("file path")即可!public Str…

UIViewController 小结

1 生命周期 init方法中view仍然是nil&#xff0c;此时&#xff0c;如果写了self.view&#xff0c;直接调用loadView。看名字也知道&#xff0c;loadView在viewDidLoad之前。initWithNibName:bundle:&#xff0c;designated初始化方法2 代码组织 init&#xff0c;只有需要传一些…

多核学习方法介绍

通过上篇文章的学习&#xff0c;我们知道&#xff0c;相比于单个核函数&#xff0c;多核模型可以具有更高的灵活性。经过多个核函数映射后的高维空间是由多个特征空间组合而成的组合空间&#xff0c;而显然组合空间可以组合各个子空间不同的特征映射能力&#xff0c;能够将异构…

java注解类型_Java注解类型

本篇文章帮大家学习java注解类型&#xff0c;包含了Java注解类型使用方法、操作技巧、实例演示和注意事项&#xff0c;有一定的学习价值&#xff0c;大家可以用来参考。标记注解类型标记注解类型是没有元素的注解类型&#xff0c;甚至没有默认值。标记注解由注解处理工具使用。…

linux go环境安装和基本项目结构

最近项目中要用到Go语言&#xff0c;所以简单总结一下安装和配置&#xff0c;Go这个语言本身就限定了很多规范&#xff0c;比如项目设置&#xff0c;编程风格等&#xff0c;开发中就不需要再因为各种规范问题纠结了&#xff0c;直接用官方规定的能避免很多坑&#xff0c;下面直…

运输层

运输层-TCP 简介 通俗点来说&#xff0c;运输层是连接底层和用户层的&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于通信部分的最高层&#xff0c;同时也是用户功能的最低层。 运输层重要功能是复用和分用。复用&#xff1a;发送方不同应用进程可以使用同一…

对AI"出错"零容忍?美国加强AI推理解释能力研究

随着硅谷私企引领人工智能&#xff08;AI&#xff09;爆发式发展&#xff0c;美国国防部曾发布报告称&#xff0c;将“立即采取行动”加速AI和自动化技术研发。据《麻省理工技术评论》杂志网站近日报道&#xff0c;美国国防高级研究计划局&#xff08;DARPA&#xff09;已经着手…

java调用指定浏览器_Java调用浏览器打开网页完整实例

本文实例讲述了java调用浏览器打开网页的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;package com.yifang.demo;import java.io.file;public class openpagedemo {public static void main(string[] args) {try {//string url "http://www.baidu.com"…

[HDU517] 小奇的集合

题目链接 显然有贪心每次选择最大的两个数来做。 于是暴力地把最大的两个数调整到非负&#xff08;暴力次数不超过1e5&#xff09;&#xff0c;接下来使用矩阵乘法即可。 \[ \begin{pmatrix} B\\S\\T \end{pmatrix} \begin{pmatrix} 1&1&0\\ 1&0&0\\ 1&1&…

phpStudy

很多朋友在学习php的过程中会看到phpstudy这个东西&#xff0c;那么phpstudy是做什么的呢&#xff1f;有什么用&#xff1f;接下来的这篇文章将个大家来详细的介绍一下phpstudy的内容。 首先在百度百科上对于phpstudy的定义是一个PHP调试环境的程序集成包。 该程序包集成最新的…

杀入共享汽车市场的PonyCar,是下一个牺牲者还是引领者?

曾几何时&#xff0c;汽车是财富、地位的象征&#xff0c;拥有一辆汽车就感觉自己处处高别人一等。但如今&#xff0c;汽车已然成为一件随处可见的商品&#xff0c;甚至已经到车来车往、熙熙攘攘的地步。根据中商产业研究院发布的《2018-2023年中国汽车行业市场前景及投资机会研…

python图片内容长度识别_Python实现识别图片内容的方法分析

本文实例讲述了Python实现识别图片内容的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;python识别图片内容。这里我的环境为windows64位&#xff0c;python2.7.14需要用到PIL模块和tesseract模块。首先需要安装pip包管理&#xff0c;安装方法可参考附录windows下…

AJAX工具

代码如下 var AppAjax {baseUrl:AppConfig.apiUrl//【POST请求】,post:function(pUrl,pData,pSuccessFun){pUrl AppAjax.baseUrl pUrl;$.ajax({headers: {token: AppConfig.token},url:pUrl,type:POST,data:JSON.stringify(pData),//pData,//JSON.stringify(),contentType:&q…