利用easyExcel导出导入Excel,超简洁
程序员文章站
2024-03-21 11:56:46
...
一.导出数据
1.导入EasyExcel的jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.5</version>
</dependency>
2.编写POJO
准备工作已经完成,导出开始,首先需要一个pojo类,导出的字段和Excel文件的字段一样即可。@Data是用了lombok,@ExcelProperty则包含了Excel首行的名称和字段所在位置,从0开始,不能重复。
@Data
public class ExportVo {
@ExcelProperty(value = "名称", index = 0)
private String name;
@ExcelProperty(value = "时间", index = 1)
private Date time;
@NumberFormat("#.##%")
@ExcelProperty(value = "完成率", index = 2)
private Float rate;
}
3.编写导出的处理类
public class ExcelUtil {
public static void download(HttpServletResponse response, String fileName,
Class cls, List dataList)
throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fname = URLEncoder.encode(fileName, "utf-8");
response.setHeader("Content-disposition",
"attachment;filename=" + fname + ExcelTypeEnum.XLSX.getValue());
LongestMatchColumnWidthStyleStrategy longestMatchColumnWidthStyleStrategy =
new LongestMatchColumnWidthStyleStrategy();
EasyExcel.write(response.getOutputStream(), cls)
.sheet("sheet1")
.registerWriteHandler(longestMatchColumnWidthStyleStrategy)
.doWrite(dataList);
response.flushBuffer();
}
4.编写导出接口
@PostMapping("/export")
public void export(@RequestBody ExportDto dto, HttpServletResponse response)
throws IOException {
String fileName = "统计表";
ExcelUtil.download(response, fileName, ExportVo.class,
getExportVoList());
}
private List getExportVoList() {
// 这里主要是获取List<ExportVo>内容,不提供实现了,需要说**意点。
1、导出列表应该有时间之类的限制(例如最近一个月),避免导出Excel过大,过大Excel一般采用分sheet导出(尤其xls文件,有65535条数限制)、分文件打包导出,上传文件服务器异步导出,不可突破的最大导出(限死5w条)。
2、一来考虑数据库查询和内存压力,二来分页插件可能存在最大页数限制,所以较多条数时必须做分页查询,再组合List对象。
3、一般从数据库直接查出数据不满足导出字段需要,有必要时需要做字段转换。
}
启动程序,使用postman试下,直接点Send的话会返回一堆乱码,选择Send and Download则可导出Excel,不过文件名是URL编码过的,这个文件名编码问题在浏览器则不会存在。
二.导入数据
1.导入Excel对应类,ExcelProperty对应导入字段的首部
@Data
public class ImportDto {
@ExcelProperty("名称")
private String name;
@ExcelProperty("数量")
private Integer num;
}
2.导入处理
public class UploadDataListener
extends AnalysisEventListener<ImportDto> {
// 一次导入多少便入库,避免大量入库
private static final int BATCH_COUNT = 50;
// 存放导入列表
List<ImportDto> list = new ArrayList<>();
private ImportService importService;
public UploadDataListener(ImportService importService) {
this.importService = importService;
}
@Override
public void invoke(ImportDto importDto, AnalysisContext analysisContext) {
list.add(importDto);
if (list.size() >= BATCH_COUNT) {
saveData();
list.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
}
private void saveData() {
List<ImportModel> importModelList = new ArrayList<>();
for (ImportDto dto : list) {
ImportModel model = new ImportModel();
model.setName(dto.getName());
model.setNum(dto.getNum())
importModelList.add(model);
}
importService.saveBatch(importModelList);
}
}
3.导入接口
@Autowired
private ImportService importService;
@PostMapping("/import")
public void import(
@RequestParam(value = "file") MultipartFile file,
@Min(1) @RequestParam("type") int type
) throws IOException {
ImportQueryDto dto = new ImportQueryDto();
dto.setType(type);
// ImportDto是导入对应类,UploadDataListener是处理类,逻辑处理服务需要以参数形式传入
EasyExcel.read(file.getInputStream(), ImportDto.class,
new UploadDataListener(importService)).sheet().doRead();
}
实际上,导入文件的内容是需要校验的,数据格式校验等,需要询问产品是否忽略错误的数据,只导入正常的数据,然后怎么友好提示错误的内容,通过返回一个包含错误信息Excel或提示框,更进一步的提示,则是提示到哪一个格子有问题。
上一篇: Java静态绑定和动态绑定的理解
推荐阅读
-
SpringBoot+ EasyExcel实现Excel文件的导入导出
-
利用easyExcel导出导入Excel,超简洁
-
利用EasyExcel将数据导出或导入成Excel格式文件
-
阿里巴巴EasyExcel导入/导出Excel
-
掌财社:Java如何使用EasyExcel实现导入导出excel
-
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
-
Java利用POI实现导入导出Excel表格示例代码
-
Java利用POI实现导入导出Excel表格示例代码
-
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
-
利用phpexcel把excel导入数据库和数据库导出excel实现