feat(CmsContent): 添加从ZIP文件批量导入Excel数据功能
- 新增 importFromZip 接口支持ZIP文件批量导入 - 实现ZIP文件解压并遍历内部Excel文件逻辑 - 集成现有Excel导入方法处理单个文件导入 - 添加Office临时文件过滤机制 - 实现导入进度和结果统计功能 - 提供详细的导入日志记录和错误处理
This commit is contained in:
parent
7841b94872
commit
e5433853ec
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue