1.Excel的导出
这是我刚开始工作所写的博客,(java小白)为了让自己对这些新学的知识,框架更加的熟悉,熟练,以此来此记录,如有错误,请各位大佬指正!!!
因为公司采用的前后端分离方式,所以本人所有的代码都只有后端接口。且返回的结果集是公司自己封装的一个josn处理结果集。(全部返回josn字符串)
1.1导入依赖
导入EasyPoi依赖,我导入的是4.1.0版本,如要导入其他版本,请考虑版本冲突问题。
<easypoi.version>4.1.0</easypoi.version>
<!-- easypoi依赖 -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>${easypoi.version}</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>${easypoi.version}</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>${easypoi.version}</version>
</dependency>
1.2导出源码
实体类:
在想要导出的字段上加Excel注解,自己在name属性设置导出后的key值
web层:
@RequestMapping(value = "/personnelCountOut",method = RequestMethod.POST)
public void personnelCountOut(
HttpServletResponse response,
@RequestBody ItemRecordDTO itemRecordDTO) throws IOException {
//itemRecordDTOS 为想要导出的数据,
List<ItemRecordDTO> itemRecordDTOS = itemRecordService.listItemPersonnelCountList(itemRecordDTO);
// 设置响应输出的头类型
// 设置响应输出的头类型
response.setHeader("content-Type", "application/vnd.ms-excel");
// 设计导出文件的名称,尽量不要中文
String fileName = new String("导出.xls".getBytes(), "ISO-8859-1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
//输出流。
ServletOutputStream out = response.getOutputStream();
// 创建参数对象(用来设定excel得sheet的内容等信息)
ExportParams params = new ExportParams() ; //sheet
// title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
params.setSheetName("导出");
Workbook workbook = ExcelExportUtil.exportExcel(params, ItemRecordDTO.class,itemRecordDTOS) ;
workbook.write(out);
}
上面的ItemRecordDTO 实体类是一个搜索条件,根据自己的实际情况来创建,也可以导出所有,就是不要条件,那么就不需要实体类参数,请求方法改为get。有对象参数请求方式为post。
1.3导出测试结果
直接浏览器输出该接口的路径,进行下载。
http://localhost:8080/ts/api/ts/manage/xf/v1/learningPowerManage/exportTemplate
根据自己真实的路径进行修改。
打开文档看看是不是我们前面放进去的数据
ExcelPoi导出成功!!!
2.简单的Excel的导入
不考虑重复,以及格式问题
2.1定义导入的实体类
自定义一个导入的实体类,@Data注解作用就是创建这些类的Getter、Setter和构造方法。
如果需要使用这个注解需要导入lombok依赖;如果使用这个注解,就自己创建Getter、Setter和构造方法。
<properties>
<lombok.version>1.18.8</lombok.version>
</properties>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
实体类:
导入的字段都需要加上@Excel注解,name= excel表格内的名称(最好与字段名相同)。
@Data
public class ExcelInputObj {
/**
* id
*/
@Excel(name = "id")
private String id;
/**
* 身份证号
*/
@Excel(name = "身份证号")
private String partyMemberIdnumber;
/**
* 姓名
*/
@Excel(name = "姓名")
private String partyMemberName;
/**
* 电话
*/
@Excel(name = "电话")
private String partyMemberPhone;
/**
* 入党日期
*/
@Excel(name = "入党日期")
private Date partyMemberTime;
private static final long serialVersionUID = 1L;
2.2导入源码
这里需要注意表头的行数设置一定要正确!否则集合数据将无法读取。一定要区分表头与标题的区别,表头是列名称,标题是表头上面的文字,示例文件中没有标题,所以setTitleRows为0
@RequestMapping(value = "/input")
public void excelInput(@RequestParam("file") MultipartFile multipartFile) throws Exception {
ImportParams params = new ImportParams();
// 表头设置为2行
params.setHeadRows(2);
// 标题行设置为0行,默认是0,可以不设置
params.setTitleRows(0);
// 开启Excel校验
params.setNeedVerify(true);
params.setVerifyHandler(excelRepetitionApi);
ExcelImportResult<PartyMemberInfo> result = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(),
PartyMemberInfo.class, params);
System.out.println("是否校验失败: " + result.isVerfiyFail());
System.out.println("校验失败的集合:" + JSONObject.toJSONString(result.getFailList()));
System.out.println("校验通过的集合:" + JSONObject.toJSONString(result.getList()));
for (PartyMemberInfo entity : result.getFailList()) {
int line = entity.getRowNum() + 1;
String msg = "第" + line + "行的错误是:" + entity.getErrorMsg();
System.out.println(msg);
}
}
2.3导入测试
如下图所示,测试成功
获取到要插入到数据库中的数据,再使用批量插入方法,将集合插入到数据库中
在dao层创建批量插入方法:
int insertPartyInfoList(@Param("excelInputObjs") List<ExcelInputObj> excelInputObjs);
sql语句:(根据自己的数据库字段进行修改)
<insert id="insertPartyInfoList">
insert into party_member_info(party_member_Idnumber, id, party_member_name, party_member_phone,
party_member_time) values
<foreach collection="excelInputObjs" separator="," index="index" item="item">
(#{item.partyMemberIdnumber},#{item.id},#{item.partyMemberName},#{item.partyMemberPhone},#{item.partyMemberTime})
</foreach>
</insert>
在service层批量添加创建接口:
int insertPartyInfoList(List<ExcelInputObj> excelInputObj);
实现类:
@Override
public int insertPartyInfoList(List<ExcelInputObj> excelInputObj) {
return partyMemberInfoMapper.insertPartyInfoList(excelInputObj);
}
在controller层的那个类中加入批量添加的方法
int i =partyMemberInfoService.insertPartyInfoList(results);
最终返回结果:
看看数据库有没有成功添加
原先数据库
添加后的数据库
其他字段可以根据自己实体类的字段进行添加
EasyPoi简单的导入导出就到这啦!!!!