打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【springboot easypoi】一行代码搞定excel导入导出

我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)

开发中经常会遇到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 保存数据库    }

导出结果

导出结果

测试导入

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


导入结果
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
你还在用原生poi处理excel?太麻烦了来瞧瞧这个
导出Excel表代码
C# 将数据导出到Excel汇总
java导出文件弹出下载框让用户选择路径
使用npoi做excel导出真心方便
Java导出Excel完整例子+完整代码,使用easypoi导出Excel+通用工具类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服