From e5433853ecbac1d2b558083d6d25f0057e2dba51 Mon Sep 17 00:00:00 2001 From: wangzhiwei Date: Mon, 13 Apr 2026 15:14:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(CmsContent):=20=E6=B7=BB=E5=8A=A0=E4=BB=8E?= =?UTF-8?q?ZIP=E6=96=87=E4=BB=B6=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5Excel?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 importFromZip 接口支持ZIP文件批量导入 - 实现ZIP文件解压并遍历内部Excel文件逻辑 - 集成现有Excel导入方法处理单个文件导入 - 添加Office临时文件过滤机制 - 实现导入进度和结果统计功能 - 提供详细的导入日志记录和错误处理 --- .../controller/CmsContentController.java | 21 +++++++ .../skills/service/CmsContentService.java | 9 +++ .../service/impl/CmsContentServiceImpl.java | 56 +++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/src/main/java/com/kexue/skills/controller/CmsContentController.java b/src/main/java/com/kexue/skills/controller/CmsContentController.java index ae7fef4..bb893a6 100644 --- a/src/main/java/com/kexue/skills/controller/CmsContentController.java +++ b/src/main/java/com/kexue/skills/controller/CmsContentController.java @@ -333,4 +333,25 @@ public class CmsContentController { return CommonResult.failed("导入失败:" + e.getMessage()); } } + + /** + * 从ZIP文件批量导入Excel数据到CmsContent + * + * @param file ZIP文件 + * @param createBy 创建人 + * @return 导入结果 + */ + @PostMapping("/importFromZip") + @Operation(summary = "从ZIP文件批量导入Excel数据", description = "上传ZIP文件,批量导入其中的所有Excel文件到CmsContent") + @RequireAuth + public CommonResult importFromZip(@RequestParam("file") MultipartFile file, @RequestParam("createBy") String createBy) { + try { + byte[] zipFileBytes = file.getBytes(); + int successCount = cmsContentService.importFromZip(zipFileBytes, createBy); + return CommonResult.success(successCount); + } catch (IOException e) { + e.printStackTrace(); + return CommonResult.failed("导入失败:" + e.getMessage()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/kexue/skills/service/CmsContentService.java b/src/main/java/com/kexue/skills/service/CmsContentService.java index a1abb98..6874afd 100644 --- a/src/main/java/com/kexue/skills/service/CmsContentService.java +++ b/src/main/java/com/kexue/skills/service/CmsContentService.java @@ -201,4 +201,13 @@ public interface CmsContentService extends BaseService { * @return 导入结果 */ int importFromPath(ImportPathDto importPathDto, String createBy); + + /** + * 从ZIP文件批量导入Excel数据到CmsContent + * + * @param zipFileBytes ZIP文件字节数组 + * @param createBy 创建人 + * @return 成功导入的记录数 + */ + int importFromZip(byte[] zipFileBytes, String createBy); } \ No newline at end of file diff --git a/src/main/java/com/kexue/skills/service/impl/CmsContentServiceImpl.java b/src/main/java/com/kexue/skills/service/impl/CmsContentServiceImpl.java index eeddf6a..a4e647b 100644 --- a/src/main/java/com/kexue/skills/service/impl/CmsContentServiceImpl.java +++ b/src/main/java/com/kexue/skills/service/impl/CmsContentServiceImpl.java @@ -28,6 +28,8 @@ import java.io.InputStream; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import cn.dev33.satoken.stp.StpUtil; @@ -1046,5 +1048,59 @@ public class CmsContentServiceImpl implements CmsContentService { return totalSuccessCount; } + @Override + public int importFromZip(byte[] zipFileBytes, String createBy) { + int totalSuccessCount = 0; + int totalFiles = 0; + + try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zipFileBytes))) { + ZipEntry entry; + + // 遍历ZIP文件中的所有条目 + while ((entry = zipInputStream.getNextEntry()) != null) { + String fileName = entry.getName(); + + // 跳过目录和非Excel文件 + if (entry.isDirectory() || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) { + zipInputStream.closeEntry(); + continue; + } + + // 跳过Office临时锁定文件 + String simpleName = new File(fileName).getName(); + if (simpleName.startsWith("~$")) { + zipInputStream.closeEntry(); + continue; + } + + totalFiles++; + System.out.println("当前处理第 " + totalFiles + " 个文件,文件名称是:" + fileName); + + try { + // 读取Excel文件内容到字节数组 + byte[] fileBytes = zipInputStream.readAllBytes(); + + // 调用现有的 importFromExcel 方法进行导入 + int successCount = importFromExcel(fileBytes, createBy); + totalSuccessCount += successCount; + System.out.println("第 " + totalFiles + " 个文件导入成功,导入了 " + successCount + " 条记录"); + } catch (Exception e) { + System.err.println("导入文件失败: " + fileName); + e.printStackTrace(); + // 单个文件导入失败不影响其他文件 + } finally { + zipInputStream.closeEntry(); + } + } + + System.out.println("导入完成,共处理 " + totalFiles + " 个文件,成功导入 " + totalSuccessCount + " 条记录"); + } catch (Exception e) { + System.err.println("ZIP文件导入操作失败"); + e.printStackTrace(); + } + + return totalSuccessCount; + } + } \ No newline at end of file