贵州毕节建设局网站官网,福田公司电话号码多少,搜索引擎营销方式,wordpress 文章顺序1 简介
使用POI在导出导出excel、导出csv、word时代码有点过于繁琐#xff0c;好消息是近两年在开发市场上流行一种简化POI开发的类库#xff1a;easyPOI。从名称上就能发现就是为了简化开发。
能干什么#xff1f;
Excel的快速导入导出,Excel模板导出,Word模板导出,可以…1 简介
使用POI在导出导出excel、导出csv、word时代码有点过于繁琐好消息是近两年在开发市场上流行一种简化POI开发的类库easyPOI。从名称上就能发现就是为了简化开发。
能干什么
Excel的快速导入导出,Excel模板导出,Word模板导出,可以仅仅5行代码就可以完成Excel的导入导出,修改导出格式简单粗暴,快速有效。
为谁而开发
不太熟悉poi的 不想写太多重复太多的 只是简单的导入导出的 喜欢使用模板的 都可以使用easypoi
目标是什么 Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作。
再次强调一下easyPOI完全替代不了POI
需要的依赖
把项目中的poi的依赖去除
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-base/artifactIdversion4.1.0/version
/dependency
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-web/artifactIdversion4.1.0/version
/dependency
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-annotation/artifactIdversion4.1.0/version
/dependency或SpringBoot
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-spring-boot-starter/artifactIdversion4.1.0/version
/dependency2 注解方式导出Excel表
第一步修改实体类添加注解
其中主要用到的注解是Excel注解更详细的说明请看这里 (按住ctrl点击)
此处注意必须要有空构造函数否则会报错“对象创建错误”
package com.itheima.pojo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.opencsv.bean.CsvBindByName;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
import java.util.List;
/*** 员工*/
Data
Table(nametb_user)
public class User {IdKeySql(useGeneratedKeys true)Excel(name 编号, orderNum 0, width 5)private Long id; //主键Excel(name 员工名, orderNum 1, width 15)private String userName; //员工名Excel(name 手机号, orderNum 2, width 15)private String phone; //手机号Excel(name 省份名, orderNum 3, width 15)private String province; //省份名Excel(name 城市名, orderNum 4, width 15)private String city; //城市名Excel(name 工资, orderNum 5, width 10)private Integer salary; // 工资JsonFormat(patternyyyy-MM-dd)Excel(name 入职日期, format yyyy-MM-dd,orderNum 6, width 15)private Date hireDate; // 入职日期private String deptId; //部门idExcel(name 出生日期, format yyyy-MM-dd,orderNum 7, width 15)private Date birthday; //出生日期Excel(name 照片, orderNum 10,width 15,type 2)private String photo; //一寸照片Excel(name 现在居住地址, orderNum 9, width 30)private String address; //现在居住地址private ListResource resourceList; //办公用品}
第二步UserController添加方法
GetMapping(value /downLoadWithEasyPOI,name 使用EasyPOI下载Excel)
public void downLoadWithEasyPOI(HttpServletRequest request,HttpServletResponse response) throws Exception{userService.downLoadXlsxWithEayPoi(request,response);
}第三步UserService实现方法
public void downLoadXlsxWithEayPoi(HttpServletRequest request, HttpServletResponse response) throws Exception {// 查询用户数据ListUser userList userMapper.selectAll();//指定导出的格式是高版本的格式ExportParams exportParams new ExportParams(员工信息, 数据,ExcelType.XSSF);// 直接使用EasyPOI提供的方法Workbook workbook ExcelExportUtil.exportExcel(exportParams, User.class, userList);String filename员工信息.xlsx;// 设置文件的打开方式和mime类型ServletOutputStream outputStream response.getOutputStream();response.setHeader( Content-Disposition, attachment;filename new String(filename.getBytes(),ISO8859-1));response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);workbook.write(outputStream);
}3 注解方式导入
有导出就应该有导入我们就把刚才导出的数据库导入到表中
Excel导入时需要的参数类ImportParams常用设置说明
读取指定的sheet 比如要读取上传得第二个sheet 那么需要把startSheetIndex 1 就可以了读取几个sheet 比如读取前2个sheet,那么 sheetNum2 就可以了读取第二个到第五个sheet 设置 startSheetIndex 1 然后sheetNum 4读取全部的sheet sheetNum 设置大点就可以了保存Excel 设置 needVerfiy true,默认保存的路径为upload/excelUpload/Test/yyyyMMddHHmss 保存名称上传时间五位随机数 如果自定义路径 修改下saveUrl 就可以了,同时saveUrl也是图片上传时候的保存的路径判断一个Excel是不是合法的Excel importFields 设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入图片的导入
有图片的导出就有图片的导入,导入的配置和导出是一样的,但是需要设置保存路径 1.设置保存路径saveUrl 默认为upload/excelUpload 可以手动修改 ImportParams 修改下就可以了
第一步修改实体类表明哪些需要导入
package com.itheima.pojo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
import java.util.List;
/*** 员工*/
Data
Table(nametb_user)
public class User {IdKeySql(useGeneratedKeys true)Excel(name 编号, orderNum 0, width 5)private Long id; //主键Excel(name 员工名, orderNum 1, width 15,isImportFieldtrue)private String userName; //员工名Excel(name 手机号, orderNum 2, width 15,isImportFieldtrue)private String phone; //手机号Excel(name 省份名, orderNum 3, width 15,isImportFieldtrue)private String province; //省份名Excel(name 城市名, orderNum 4, width 15,isImportFieldtrue)private String city; //城市名Excel(name 工资, orderNum 5, width 10, type10, isImportFieldtrue) //type10表示会导出数字private Integer salary; // 工资JsonFormat(patternyyyy-MM-dd)Excel(name 入职日期, format yyyy-MM-dd,orderNum 6, width 15,isImportFieldtrue)private Date hireDate; // 入职日期private String deptId; //部门idExcel(name 出生日期, format yyyy-MM-dd,orderNum 7, width 15,isImportFieldtrue)private Date birthday; //出生日期Excel(name 照片, orderNum 10,width 15,type 2,isImportFieldtrue,savePath D:\\java_report\\workspace\\user_management\\src\\main\\resources\\static\\user_photos\\)private String photo; //一寸照片Excel(name 现在居住地址, orderNum 9, width 30,isImportFieldtrue)private String address; //现在居住地址private ListResource resourceList; //办公用品}
第二步修改UserController中的导入方法
PostMapping(value /uploadExcle, name 上传用户数据)
public void uploadExcle(MultipartFile file) throws Exception{// userService.uploadExcle(file);userService.uploadExcleWithEasyPOI(file);
}第三步在UserService中添加使用easyPOI导入的方法
public void uploadExcleWithEasyPOI(MultipartFile file) throws Exception {ImportParams importParams new ImportParams();importParams.setTitleRows(1); //有多少行的标题importParams.setHeadRows(1);//有多少行的头ListUser userList ExcelImportUtil.importExcel(file.getInputStream(),User.class,importParams);System.out.println(userList);for (User user : userList) {user.setId(null);userMapper.insertSelective(user);}
}4 模板方式导出数据
模板是处理复杂Excel的简单方法复杂的Excel样式可以用Excel直接编辑完美的避开了代码编写样式的雷区同时指令的支持也提了模板的有效性 采用的写法是{{}}代表表达式然后根据表达式里面的数据取值
关于样式问题 easypoi不会改变excel原有的样式
需求导出用户的详细信息这个功能我们做过今天我们使用easyPOI的方式再做一次
第一步制作模板
这个模板和我们做的userInfo2.xlsx模板一样只是这个变量使用了{{}}包起来了
第二步放到项目中 第三步改写UserController中导出用户信息的方法
GetMapping(value /download,name 导出用户详细信息)
public void downLoadUserInfoWithTempalte(Long id,HttpServletRequest request,HttpServletResponse response) throws Exception{// userService.downLoadUserInfoWithTempalte(id,request,response);// userService.downLoadUserInfoWithTempalte2(id,request,response);userService.downLoadUserInfoWithEastPOI(id,request,response);
}第四步完成UserService中的方法
public void downLoadUserInfoWithEastPOI(Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {// 获取模板的路径File rootPath new File(ResourceUtils.getURL(classpath:).getPath()); //SpringBoot项目获取根目录的方式File templatePath new File(rootPath.getAbsolutePath(),/excel_template/userInfo3.xlsx);// 读取模板文件TemplateExportParams params new TemplateExportParams(templatePath.getPath(),true);// 查询用户转成mapUser user userMapper.selectByPrimaryKey(id);MapString, Object map EntityUtils.entityToMap(user);ImageEntity image new ImageEntity();// image.setHeight(640); //测试发现 这里设置了长度和宽度在合并后的单元格中没有作用// image.setWidth(380);image.setRowspan(4);//向下合并三行image.setColspan(2);//向右合并两列image.setUrl(user.getPhoto());map.put(photo, image);Workbook workbook ExcelExportUtil.exportExcel(params, map);// 导出的文件名称String filename用户详细信息数据.xlsx;// 设置文件的打开方式和mime类型ServletOutputStream outputStream response.getOutputStream();response.setHeader( Content-Disposition, attachment;filename new String(filename.getBytes(),ISO8859-1));response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);workbook.write(outputStream);
}5 导出CSV
csv的导出基本上和excel的导出一致,大体参数也是一致的
CsvExportParams 的参数描述如下
属性类型默认值功能encodingStringUTF8文件编码spiltMarkString,分隔符textMarkString“字符串识别,可以去掉,需要前后一致titleRowsint0表格头,忽略headRowsint1标题exclusionsString[]0忽略的字段
需求改写之前使用OpenCSV导出csv文件
第一步修改UserController方法
GetMapping(value /downLoadCSV,name 导出用户数据到CSV文件中)
public void downLoadCSV(HttpServletResponse response) throws Exception{// userService.downLoadCSV(response);userService.downLoadCSVWithEasyPOI(response);
}第二步完成UserService方法
public void downLoadCSVWithEasyPOI(HttpServletResponse response) throws Exception {ServletOutputStream outputStream response.getOutputStream();
// 文件名String filename百万数据.csv;
// 设置两个头 一个是文件的打开方式 一个是mime类型response.setHeader( Content-Disposition, attachment;filename new String(filename.getBytes(),ISO8859-1));response.setContentType(application/csv);
// 创建一个用来写入到csv文件中的writerCsvExportParams params new CsvExportParams();
// 设置忽略的列params.setExclusions(new String[]{照片}); //这里写表头 中文ListUser list userMapper.selectAll();CsvExportUtil.exportCsv(params, User.class, list, outputStream);}说明从上述的代码中你会发现如果需要导出几百万数据时不可能全部加载到一个List中的所以easyPOI的方式导出csv是支持不了太大的数据量的如果导出几百万条数据还是得选择OpenCSV方式导出。
Excel注解详细
属性类型类型说明nameStringnull列名needMergebooleanfasle纵向合并单元格orderNumString“0”列的排序,支持name_idreplaceString[]{}值得替换 导出是{a_id,b_id} 导入反过来savePathString“upload”导入文件保存路径typeint1导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本widthdouble10列宽heightdouble10列高,后期打算统一使用ExcelTarget的height,这个会被废弃,注意isStatisticsbooleanfasle自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点isHyperlinkbooleanfalse超链接,如果是需要实现接口返回对象isImportFieldbooleantrue校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_idexportFormatString“”导出的时间格式,以这个是否为空来判断是否需要格式化日期importFormatString“”导入的时间格式,以这个是否为空来判断是否需要格式化日期formatString“”时间格式,相当于同时设置了exportFormat 和 importFormatdatabaseFormatString“yyyyMMddHHmmss”导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string类型,这个需要设置这个数据库格式,用以转换时间格式输出numFormatString“”数字格式化,参数是Pattern,使用的对象是DecimalFormatimageTypeint1导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的suffixString“”文字后缀,如% 90 变成90%isWrapbooleantrue是否换行 即支持\nmergeRelyint[]{}合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了mergeVerticalbooleanfasle纵向合并内容相同的单元格