feat(CmsContent): 添加从ZIP文件批量导入Excel数据功能

- 新增 importFromZip 接口支持ZIP文件批量导入
- 实现ZIP文件解压并遍历内部Excel文件逻辑
- 集成现有Excel导入方法处理单个文件导入
- 添加Office临时文件过滤机制
- 实现导入进度和结果统计功能
- 提供详细的导入日志记录和错误处理
This commit is contained in:
wangzhiwei 2026-04-13 15:14:31 +08:00
parent 7841b94872
commit e5433853ec
3 changed files with 86 additions and 0 deletions

View File

@ -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<Integer> 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());
}
}
}

View File

@ -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);
}

View File

@ -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;
}
}