从网络地址读取压缩包文件解析excel,结合easyExcel 导入模板的逻辑处理数据存储
注意:得到文件后需要判断是否有缓存文件,不然会抛出文件类型错误
try {
URL url = new URL(taskInfo.getListFileUrl());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//得到输入流
ZipInputStream zipStream = new ZipInputStream(conn.getInputStream(), Charset.forName("utf-8"));
ZipEntry zipEntry ;
// 循环读取 ZIP 文件中的每一个子文件,若文件不为空且文件名为我们需要的那个("测试.xlsx"),则开始解析
while ((zipEntry = zipStream.getNextEntry()) != null) {
// 这里主要是跳过隐藏文件
if (zipEntry.getName().startsWith("_")) {
continue;
}
//判断是否是excel文件
if(zipEntry.getName().endsWith(".xlsx") || zipEntry.getName().endsWith(".xls")){
// 逐字节读取 ZipInputStream 文件,并将结果存储至一个字节数组缓冲区(ByteArrayOutputStream)中
byte[] buffer = new byte[1024];
int len;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
while ((len = zipStream.read(buffer)) != -1) {
byteStream.write(buffer, 0, len);
}
// 创建 Excel 解析器对象,TaskDistributionZipRepresentation是 easyExcel的导入模板
ExcelAnalysisEventListener<TaskDistributionZipRepresentation> analysisEventListener =
new ExcelAnalysisEventListener<>((representations -> {
getLogger().info("开始存储压缩包文件的数据到数据库,当前共计 {} 条发放清单。", representations.size());
List<TaskDistribution> taskDistributions = new ArrayList<>();
//循环读取excel数据
for (TaskDistributionZipRepresentation representation : representations) {
//具体业务处理逻辑
}
taskDistributionRepository.saveBatch(taskDistributions);
getLogger().info("存储压缩文件的数据到数据库成功,当前共计 {} 条发放清单。", representations.size());
}));
// 将之前的 ByteArrayOutputStream 对象转化为 byte数组,然后使用 EasyExcel 进行解析
ExcelReader excelReader = EasyExcel.read(new ByteArrayInputStream(byteStream.toByteArray()), TaskDistributionZipRepresentation.class, analysisEventListener).build();
ReadSheet readSheet = EasyExcel.readSheet().build();
excelReader.read(readSheet);
//关闭流
byteStream.close();
}
zipStream.close();
}
} catch (IOException e) {
this.getLogger().error("存储发放清单信息失败," + e.getMessage(), e);
throw new UserFriendlyException("存储发放清单信息失败");
}