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

 

 

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

pom引入

不再需要其他jar

cn.afterturn

easypoi-base

3.0.3

cn.afterturn

easypoi-web

3.0.3

cn.afterturn

easypoi-annotation

3.0.3

编写实体类

此处注意必须要有空构造函数,否则会报错“对象创建错误”

关于注解@Excel,其他还有@ExcelCollection,@ExcelEntity ,@ExcelIgnore,@ExcelTarget等,此处我们用不到,可以去官方查看更多

属性类型类型说明

name

String

null

列名

needMerge

boolean

fasle

纵向合并单元格

orderNum

String

"0"

列的排序,支持name_id

replace

String[]

{}

值得替换 导出是{a_id,b_id} 导入反过来

savePath

String

"upload"

导入文件保存路径

type

int

1

导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本

width

double

10

列宽

height

double

10

列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意

isStatistics

boolean

fasle

自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点

isHyperlink

boolean

false

超链接,如果是需要实现接口返回对象

isImportField

boolean

true

校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id

exportFormat

String

""

导出的时间格式,以这个是否为空来判断是否需要格式化日期

importFormat

String

""

导入的时间格式,以这个是否为空来判断是否需要格式化日期

format

String

""

时间格式,相当于同时设置了exportFormat 和 importFormat

databaseFormat

String

"yyyyMMddHHmmss"

导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出

numFormat

String

""

数字格式化,参数是Pattern,使用的对象是DecimalFormat

imageType

int

1

导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的

suffix

String

""

文字后缀,如% 90 变成90%

isWrap

boolean

true

是否换行 即支持\n

mergeRely

int[]

{}

合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了

mergeVertical

boolean

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> 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> list, String fileName, HttpServletResponse response) {

Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);

if (workbook != null);

downLoadExcel(fileName, response, workbook);

}

public static List importExcel(String filePath,Integer titleRows,Integer headerRows, Class pojoClass){

if (StringUtils.isBlank(filePath)){

return null;

}

ImportParams params = new ImportParams();

params.setTitleRows(titleRows);

params.setHeadRows(headerRows);

List 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 List importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class pojoClass){

if (file == null){

return null;

}

ImportParams params = new ImportParams();

params.setTitleRows(titleRows);

params.setHeadRows(headerRows);

List 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 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 personList = FileUtil.importExcel(filePath,1,1,Person.class);

//也可以使用MultipartFile,使用 FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class pojoClass)导入

System.out.println("导入数据一共【"+personList.size()+"】行");

//TODO 保存数据库

}

导出结果

 

导出结果

测试导入

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

 

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

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。