Java 利用EasyPoi做Excel模板的导入导出操作

  • 项目背景
  • 加入pom依赖
  • 项目Excel模板图
  • 代码实现
    • 首先是实体类定义
    • Excel 实现导入
    • Excel的导出
  • 结束语

项目背景

作为一名传统业务的程序员,每天都要不得不面对对各种类型的Excel的操作。想想都让人头疼。尤其是那种表头有的要纵向合并单元格,有的横向单元格合并的Excel,听听就让人头脑发麻。
最近,在做这方面的Excel操作的时候,就接到一个这样的场景。费了一番心思和各种模拟操作。终于大功告成。

加入pom依赖

     <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>1.1.2-beta5</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>

加入以上这些依赖(时间有些久,大概记得这些),这里面有几个坑,大家请认真对待。首先就是最后两个依赖的版本必须是一致性的,其次。这两个依赖版本必须一致,否则会出现问题。

项目Excel模板图

在实现时,先来看看我们的模板样式吧。

图1模板就是项目中遇到的一个第一种情况的模板。

图2的模板开始有些复杂了。接下来是图3模板。
图3这就是我遇到的第三种类型的模板,比第二种稍微复杂些。

针对这些固定不变的类型模板,就可以给模板的表头取出定义成实体类对象,然后通过EasyPoi操作对象,将问题简单化。

代码实现

首先是实体类定义

由于有三张不同的Excel表,所以,我定义了三个实体类(get和set就不写了)。

public class CalendarIndexEntity extends BaseRowModel {
@ExcelProperty(value = {"Cycle Name"}, index = 0)
private String cycleName;@ExcelProperty(value = {"Tenant ID"}, index = 1)
private String tenantID;@ExcelProperty(value = {"League Entity"}, index = 2)
private String leagueEntity;@ExcelProperty(value = {"Year"}, index = 3)
private String year;@ExcelProperty(value = {"Payroll Frequency"}, index = 4)
private String payrollFrequency;
}

这是针对图1建立的实体。

public class CalendarMonthlyEntity extends BaseRowModel {
@ExcelProperty(value = {"Step","Step"}, index = 0)
private String payrollProcessNo;
@ExcelProperty(value = {"Process Name","Process Name"}, index = 1)
private String payrollProcessName;
@ExcelProperty(value = {"Jan","1"}, index = 2)
private String jan;
@ExcelProperty(value = {"Feb","1"}, index = 3)
private String feb;
@ExcelProperty(value = {"Mar","1"}, index = 4)
private String mar;@ExcelProperty(value = {"Apr","1"}, index = 5)
private String apr;
@ExcelProperty(value = {"May","1"}, index = 6)
private String may;
@ExcelProperty(value = {"Jun","1"}, index = 7)
private String jun;@ExcelProperty(value = {"Jul","1"}, index = 8)
private String jul;
@ExcelProperty(value = {"Aug","1"}, index = 9)
private String aug;
@ExcelProperty(value = {"Sep","1"}, index = 10)
private String sep;@ExcelProperty(value = {"Oct","1"}, index = 11)
private String oct;
@ExcelProperty(value = {"Nov","1"}, index = 12)
private String nov;
@ExcelProperty(value = {"Dec","1"}, index = 13)
private String dec;@ExcelProperty(value = {"Mail To","Mail To"}, index = 14)
private String sendMail;
@ExcelProperty(value = {"Mail CC","Mail CC"}, index = 15)
private String ccMail;
}

这是针对图2建立的实体类。

public class CalendarMultipleEntity extends BaseRowModel {
@ExcelProperty(value = {"Step","Step"}, index = 0)
private String payrollProcessNo;@ExcelProperty(value = {"Process Name","Process Name"}, index = 1)
private String payrollProcessName;@ExcelProperty(value = {"Jan","1"}, index = 2)
private String jan;
@ExcelProperty(value = {"Jan","2"}, index = 3)
private String jan1;@ExcelProperty(value = {"Feb","1"}, index = 4)
private String feb;
@ExcelProperty(value = {"Feb","2"}, index = 5)
private String feb1;@ExcelProperty(value = {"Mar","1"}, index = 6)
private String mar;
@ExcelProperty(value = {"Mar","2"}, index = 7)
private String mar1;@ExcelProperty(value = {"Apr","1"}, index = 8)
private String apr;
@ExcelProperty(value = {"Apr","2"}, index = 9)
private String apr1;@ExcelProperty(value = {"May","1"}, index = 10)
private String may;
@ExcelProperty(value = {"May","2"}, index = 11)
private String may1;@ExcelProperty(value = {"Jun","1"}, index = 12)
private String jun;
@ExcelProperty(value = {"Jun","2"}, index = 13)
private String jun1;@ExcelProperty(value = {"Jul","1"}, index = 14)
private String jul;
@ExcelProperty(value = {"Jul","2"}, index = 15)
private String jul1;@ExcelProperty(value = {"Aug","1"}, index = 16)
private String aug;
@ExcelProperty(value = {"Aug","2"}, index = 17)
private String aug1;@ExcelProperty(value = {"Sep","1"}, index = 18)
private String sep;
@ExcelProperty(value = {"Sep","2"}, index = 19)
private String sep1;@ExcelProperty(value = {"Oct","1"}, index = 20)
private String oct;
@ExcelProperty(value = {"Oct","2"}, index = 21)
private String oct1;@ExcelProperty(value = {"Nov","1"}, index = 22)
private String nov;
@ExcelProperty(value = {"Nov","2"}, index = 23)
private String nov1;@ExcelProperty(value = {"Dec","1"}, index = 24)
private String dec;
@ExcelProperty(value = {"Dec","2"}, index = 25)
private String dec1;@ExcelProperty(value = {"Mail To","Mail To"}, index = 26)
private String sendMail;
@ExcelProperty(value = {"Mail CC","Mail CC"}, index = 27)
private String ccMail;
}

这是针对图3建立的实体内。

这次该介绍下些实体类的具体细节了。

  1. 实体类要继承 BaseRowModel
  2. @ExcelProperty(value = {“Process Name”,“Process Name”}, index = 1)这个注解表示对应表中的表头。value值可以任意多个,但实际表述不一样,一个值表示表头占一个单元格的表头,两个一样的值表示,单元格竖向合并,三个一样的值就是值竖向合并三个单元格。 另外两个不一样的值,表示竖向放着表头顺序,三个类似。
  3. 如何横向合并单元格,可以定义两个@ExcelProperty(value = {“Process Name”,""}, index = 1),但是index要值要大一位。因为index表示在表中的哪一列(注意。默认0为第一列)

Excel 实现导入

public class ExcelUtils {public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo, int headLineNum) {ExcelListener excelListener = new ExcelListener();ExcelReader reader = getReader(excel, excelListener);if (reader == null) {return null;}reader.read(new Sheet(sheetNo, headLineNum, rowModel.getClass()));return excelListener.getDatas();}
}

这是我用到的一个单表的导入读取。
下面就是开始读取Excel了。
Object objects = ExcelUtils.readExcel(file, new CalendarIndexEntity(), 1, 1);
List calendarIndexEntities= (List)objects;

这就是读取到的Excel数据,其中参数分别是文件模板,模板中的实体类,该表是第几个sheet(sheet默认为1),从第几行开始读取数据(默认为0)。

Excel的导出

 ServletOutputStream out = response.getOutputStream();ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);//1:表示第几页sheet,CalendarIndexEntity.class,这个表示要写入的实体操作Sheet sheet = new Sheet(1, 0,CalendarIndexEntity.class);//设置自适应宽度sheet.setAutoWidth(Boolean.TRUE);// 第一个 sheet 名称sheet.setSheetName("Index");//list为CalendarIndexEntity.class类实体集合writer.write(list, sheet);response.setCharacterEncoding("utf-8");//设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setContentType("multipart/form-data");//设置文件名中文编码,防止乱码new String(fileName.getBytes("utf-8"), "ISO8859-1");response.setHeader("Pragma", "No-cache");response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Expose-Headers", "content-disposition");response.setHeader("Content-disposition", "attachment;filename=" + new String(             fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xlsx");writer.finish();response.setContentType("multipart/form-data");response.setCharacterEncoding("utf-8");out.flush();

结束语

这就是我在项目中遇到的问题。第一次写,如有说的不清,或者不对的地方,希望大家指出错误,谢谢!

Java 利用EasyPoi做Excel模板的导入导出操作相关推荐

  1. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  2. VB中Excel 2010的导入导出操作

    VB中Excel 2010的导入导出操作 编写人:左丘文 2015-4-11 近来这已是第二篇在讨论VB的相关问题,今天在这里,我想与大家一起分享一下在VB中如何从Excel中导入数据和导出数据到Ex ...

  3. PHP利用phpExcel实现Excel数据的导入导出

    phpExcel包的下载地址:http://download.csdn.net/detail/kesixin/9920920 首先先说一下,这段例程是使用在Thinkphp的开发框架上,要是使用在其他 ...

  4. Java利用EasyPoi实现excel文件导入和导出

    1.导入依赖 <!--导数导入数据 依赖--> <!--easy poi--> <dependency><groupId>cn.afterturn< ...

  5. java做 excel文件的 导入导出 (SSM+layer)

    做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...

  6. 【JavaWeb开发】使用java实现简单的Excel文件的导入与导出(POI)

    前言:在实际的开发中,我们经常需要用户在界面中输入大量重复且有规律的数据,但是一个表单一个表单的填写效率过慢,而且过多的表单也会给JavaWeb的业务逻辑开发带来不小的困扰,所以我们可以使用一个Exc ...

  7. Java利用jenkins做项目的自动化部署

    本地的jekins密码 2722e8ea873b4cf08884c22dff732bab 这篇文章主要介绍了Java利用jenkins做项目的自动化部署,小编觉得挺不错的,现在分享给大家,也给大家做个 ...

  8. vue实现下载EXCEL模板、导入EXCEL文件

    vue实现下载EXCEL模板.导入EXCEL文件 在项目中很常见需要先下载模板,根据模板导入 下面展示一些 下载模板代码片段. 需要有一个下载模板的接口,点击下载触发函数,调用接口,返回下载地址 接口 ...

  9. java利用poi实现Excel考勤报表的输出

    java利用poi实现Excel考勤报表的输出 实现效果 SXSSFWorkbook超大数据导出 标题.表头.内容有样式 可以多个sheet(满65535行数据换新的sheet) 一度为快 maven ...

最新文章

  1. 面试题:找出出现次数超过1/2和1/3的数
  2. 15个初学者必看的基础SQL查询语句
  3. MySQL - 分页查询优化的两个案例解析
  4. Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
  5. LabVIEW(七):多态VI
  6. 高等数学下-赵立军-北京大学出版社-题解-练习10.1
  7. 红黑树插入时的自平衡
  8. law是什么的缩写_Lawyer和Attorney 有什么不同?
  9. Acoustica 7 Premium Edition for Mac(音频处理软件) v7.3.28
  10. (45)System Verilog 类中变量随机激励约束语法
  11. jquery的ajax查询数据库,jquery中使用ajax获取远程页面信息
  12. 面试官:说说Java对象的四种引用方式
  13. Struts2教程3:struts.xml常用配置解析
  14. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
  15. C/C++[算法入门]..
  16. ENSP静态路由配置
  17. lwj_C#_类的属性,方法参数 举例习题
  18. Java监听mysql的binlog详解(mysql-binlog-connector)
  19. Java相关知识点总结
  20. 中国联通和中国电信措手不及,中国移动主动发起5G流量价格战

热门文章

  1. 渗透时Linux系统该如何提权?
  2. 产业园区的10种主要招商渠道
  3. ps2019最新版-安装地址
  4. 内存专题--各种RAM/ROM/Cache/Flash等内存概念与区别
  5. 国际学术论文写作笔记02李福安:怎样用英语撰写科技论文
  6. 计算机语言有几种 各有什么特点,计算机语言分为几类?每一类各有什么特点?...
  7. 软银收购ARM如何布局物联网?
  8. proteus常见问题解答
  9. Javascript Canvas 实现粒子动画效果分享
  10. (全文翻译)基于深度残差收缩网络的故障诊断Deep Residual Shrinkage Networks for Fault Diagnosis