前言
推荐一个小而全的java工具类hutool,这个类库有比较完善的官方文档,其中还会有案例代码,用来讲解如何使用其中的工具类,我将官网的地址放在下面了,有兴趣的小伙伴可以去看看
也不讲太多废话了进入正题
今日内容
- Excel 表格导出
- Excel 表格导入
正文
导入pom
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
1.Excel 表格导出 实现
Service层
@Override
public ExcelWriter export(Long currentCompanyId) {
//数据源
List<DeviceVo> device = dao.findDevice(projId);
//生成xlsx格式 需要使用 使用ExcelUtil.getWriter(true)创建。
ExcelWriter writer = ExcelUtil.getWriter(true);
//只导出有别名的列,默认是会将未命中的记录排在首位,如果不加会多导出一行
writer.setOnlyAlias(true);
// 左 字段名 右 Excel表头别名
writer.addHeaderAlias("number","设备号");
writer.addHeaderAlias("name","设备名称");
writer.addHeaderAlias("deviceTypeName","设备类型");
writer.addHeaderAlias("status","设备当前状态");
writer.addHeaderAlias("note","备注");
writer.addHeaderAlias("productionDate","生产日期");
writer.addHeaderAlias("installationDate","安装日期");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(device,true);
return writer;
}
Controller层
@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {
long currentCompanyId = ContextSession.getCurrentCompanyId();
//得到ExcelWriter 对象
ExcelWriter export = deviceService.export(currentCompanyId);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//设置文件名
String fileName = URLEncoder.encode("设备列表", "UTF-8");
//设置响应头 fileName.xlsx"是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
//获取字节输出流
ServletOutputStream outputStream= response.getOutputStream();
//关闭流前,先清空缓冲区数据
export.flush(outputStream,true);
// 关闭流,释放内存
outputStream.close();
// 关闭writer,释放内存
export.close();
}
2.Excel 表格导入 实现
表格列头
实体类
@Data
public class WriteDevice {
private String number;
private String name;
private String deviceTypeName;
private String note;
private LocalDateTime productionDate;
private LocalDateTime installationDate;
private String status;
private String online;
private String projectName;
}
Controller层
@PostMapping(path="/import")
public ApiResult importData(@RequestParam("file") MultipartFile file) throws IOException {
//字节输入流
InputStream inputStream = file.getInputStream();
//通过输入流创建ExcelReader 对象
ExcelReader reader = ExcelUtil.getReader(inputStream);
//这个同上导入
reader.addHeaderAlias("设备编号","number");
reader.addHeaderAlias("设备名称","name");
reader.addHeaderAlias("设备类型","deviceTypeName");
reader.addHeaderAlias("备注","note");
reader.addHeaderAlias("生产日期","productionDate");
reader.addHeaderAlias("安装日期","installationDate");
reader.addHeaderAlias("状态","status");
reader.addHeaderAlias("是否上线","online");
reader.addHeaderAlias("所属项目","projectName");
List<WriteDevice> devices = reader.readAll(WriteDevice.class);
//业务方法
deviceService.BatchAdd(devices);
return resultWrapOk();
}
Service层
@Override
public void BatchAdd(List<WriteDevice> list) {
//循环添加进数据库,这逻辑就根据自己字段来编写添加的数据
list.forEach(item ->{
Device device = new Device();
long count = dao.getCountByMt(Mql.getWhere("number", AssertParams.notBlank(item.getNumber())));
AssertBiz.isTrue(count == 0, "设备号已存在");
device.setNumber(item.getNumber());
device.setName(item.getName());
Map map = deviceTypeDao.findByName(item.getDeviceTypeName());
device.setDeviceTypeId(Long.parseLong(map.get("id")+""));
device.setProtocolType(Long.parseLong(map.get("protocol_type")+""));
device.setNote(item.getNote());
device.setProductionDate(item.getProductionDate());
device.setInstallationDate(item.getInstallationDate());
//0.停用 1.启用
if ("停用".equals(item.getStatus())){
device.setStatus(0);
}else if ("启用".equals(item.getStatus())){
device.setStatus(1);
}
if ("在线".equals(item.getOnline())){
device.setOnline(true);
}else if ("离线".equals(item.getOnline())){
device.setOnline(false);
}
Long byName1 = projectDao.findByName(item.getProjectName());
device.setProjectId(byName1);
dao.insert(device);
});
}
后记
希望这篇博客能帮小伙伴们吧,其实刚才看了一下hutool类库的文档内容还是挺丰富的,还是值的看一看的,好的散会