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());
|
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 导入结果
|
* @return 导入结果
|
||||||
*/
|
*/
|
||||||
int importFromPath(ImportPathDto importPathDto, String createBy);
|
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.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
|
||||||
|
|
@ -1046,5 +1048,59 @@ public class CmsContentServiceImpl implements CmsContentService {
|
||||||
return totalSuccessCount;
|
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