- A+
所属分类:java
我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)
开发中经常会遇到的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等,此处我们用不到,可以去官方查看更多
属性 | 类型 | 类型 | 说明 |
---|---|---|---|
名称 | 串 | 空值 | 列名 |
needMerge | 布尔 | FASLE | 纵向合并单元格 |
ORDERNUM | 串 | “0” | 列的排序,支持名_ID |
更换 | 串[] | {} | 值得替换导出是{a_id,b_id}导入反过来 |
savePath | 串 | “上传” | 导入文件保存路径 |
类型 | INT | 1 | 导出类型1是文本2是图片,3是函数,10是数字默认是文本 |
宽度 | 双 | 10 | 列宽 |
高度 | 双 | 10 | 列高,后期打算统一使用@ExcelTarget的高度,这个会被废弃,注意 |
isStatistics | 布尔 | FASLE | 自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点 |
isHyperlink | 布尔 | 假 | 超链接,如果是需要实现接口返回对象 |
isImportField | 布尔 | 真正 | 校验字段,看看这个字段是不是导入的Excel中中有,如果没有说明是错误的Excel中,读取失败,支持名_ID |
exportFormat | 串 | “” | 导出的时间格式,以这个是否为空来判断是否需要格式化日期 |
importFormat | 串 | “” | 导入的时间格式,以这个是否为空来判断是否需要格式化日期 |
格式 | 串 | “” | 时间格式,相当于同时设置了exportFormat和importFormat |
databaseFormat | 串 | “YYYYMMDDHHMMSS” | 导出时间设置,如果字段是日期类型则不需要设置数据库如果是string类型,这个需要设置这个数据库格式,用以转换时间格式输出 |
numFormat | 串 | “” | 数字格式化,参数是模式,使用的对象是DecimalFormat的 |
图像类型 | INT | 1 | 导出类型1从文件读取2是从数据库中读取默认是文件同样导入也是一样的 |
后缀 | 串 | “” | 文字后缀,如%90变成90% |
isWrap | 布尔 | 真正 | 是否换行即支持\ n |
mergeRely | INT [] | {} | 合并单元格依赖关系,比如第二列合并是基于第一列则{1}就可以了 |
mergeVertical | 布尔 | FASLE | 纵向合并内容相同的单元格 |
实体类
- 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 保存数据库
- }
导出结果

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

导入结果