easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
-
-
cn.afterturn -
easypoi-spring-boot-starter -
4.3.0 -
-
-
-
cn.afterturn -
easypoi-base -
4.3.0 -
-
-
cn.afterturn -
easypoi-web -
4.3.0 -
-
-
cn.afterturn -
easypoi-annotation -
4.3.0 -
- /**
- * @author wangli
- * @create 2022-08-27 15:35
- */
- @Data
- @ToString
- public class Person {
- @Excel(name = "序号")
- private int id;
-
- @Excel(name = "名字")
- private String name;
-
- @Excel(name = "年纪")
- private Integer age;
- }
@Excel
这个是必须使用的注解,如果需求简单只使用这一个注解也是可以的,涵盖了常用的Excel需求,需要大家熟悉这个功能,主要分为基础,图片处理,时间处理,合并处理几块,name_id是上面讲的id用法,这里就不累言了
属性 | 类型 | 默认值 | 功能 |
---|---|---|---|
name | String | null | 列名,支持name_id |
needMerge | boolean | fasle | 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row) |
orderNum | String | "0" | 列的排序,支持name_id |
replace | String[] | {} | 值得替换 导出是{a_id,b_id} 导入反过来 |
savePath | String | "upload" | 导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/ |
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[] | {} | 合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了 |
mergeVertical | boolean | fasle | 纵向合并内容相同的单元格 |
fixedIndex | int | -1 | 对应excel的列,忽略名字 |
isColumnHidden | boolean | false | 导出隐藏列 |
我们使用easyPOI的
importExcel(File file, Class> pojoClass, ImportParams params)
方法,需要传入File对象,但是我们传入的是MultipartFile,所以我们还需将MultipartFile转换为File
所以我再下面也提供了转换的方法multipartFileToFile
- /**
- * 传入excel文件转换为对象集合
- * @param multipartFile
- */
- @PostMapping("/excelReport")
- public void excelReport(@ModelAttribute("multipartFile") MultipartFile multipartFile) {
- try {
- ImportParams params = new ImportParams();
- //表格标题行数,默认0
- params.setTitleRows(0);
- //表头行数,默认1
- params.setHeadRows(1);
- List
list = null; - //导入excel
- list = ExcelImportUtil.importExcel(multipartFileToFile(multipartFile), Person.class, params);
- System.out.println(list.size());
- list.forEach(System.out::println);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * MultipartFile转化为file
- *
- * @param file
- * @return
- * @throws Exception
- */
- public File multipartFileToFile(MultipartFile file) throws Exception {
- File toFile = null;
- if (file.equals("") || file.getSize() <= 0) {
- file = null;
- } else {
- InputStream ins = null;
- ins = file.getInputStream();
- toFile = new File(file.getOriginalFilename());
- inputStreamToFile(ins, toFile);
- ins.close();
- }
- return toFile;
-
- }
-
- private static void inputStreamToFile(InputStream ins, File file) {
- try {
- OutputStream os = new FileOutputStream(file);
- int bytesRead = 0;
- byte[] buffer = new byte[8192];
- while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
- os.write(buffer, 0, bytesRead);
- }
- os.close();
- ins.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }