/**
* 导入
* 该方法用于处理用户上传的文件,将其中的数据解析并存储为输入输出详情实体。
* 注意:仅支持导入格式为xlsx的文件,且文件大小不能超过10MB。
*
* @param file 上传的文件,预期为xlsx格式,将从中读取数据并存储为实体。
*/
@Override
public void importModelEntityInfo(MultipartFile file) {
try {
// 校验文件格式是否为xlsx
validateFileFormat(file);
// 校验文件大小是否超过10MB
validateFileSize(file);
// 使用EasyExcel框架读取上传的文件
EasyExcel.read(file.getInputStream(), modelEntity.class, new ReadListener<modelEntity>() {
/**
* 定义每次批量处理的数据量
*/
public static final int BATCH_COUNT = 1000;
/**
* 用于临时存储从文件中读取的数据,直至达到批量处理的数量或读取完毕
*/
private List<modelEntity> cachedDataList = new ArrayList<>(BATCH_COUNT);
/**
* 当读取到一定数量的数据时,调用该方法进行数据的批量处理
* @param data 从文件中读取到的单条数据
* @param context 分析上下文,提供了一些额外的信息
*/
@Override
public void invoke(modelEntity data, AnalysisContext context) {
cachedDataList.add(data);
// 当缓存的数据达到批量处理的数量时,进行数据的存储
if (cachedDataList.size() >= BATCH_COUNT) {
saveData(cachedDataList);
// 存储完成后清空缓存
cachedDataList.clear();
}
}
/**
* 当所有数据都被读取并处理完毕后,调用该方法进行剩余数据的处理
* @param context 分析上下文,提供了一些额外的信息
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 处理剩余的数据(如果有的话)
saveData(cachedDataList);
}
/**
* 将缓存中的数据存储到数据库中
* @param cachedDataList 待存储的数据列表
*/
private void saveData(List<modelEntity> cachedDataList) {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
// 调用具体的方法将数据存储到数据库
saveCachedDataList(cachedDataList);
log.info("存储数据库成功!");
}
}).sheet().doRead();
} catch (Exception e) {
log.error("导入失败", e);
throw new RuntimeException("导入失败", e);
}
}
/**
* 校验文件格式
* @param file 需要校验的文件
* @throws IllegalArgumentException 如果文件格式不正确
*/
private void validateFileFormat(MultipartFile file) throws IllegalArgumentException {
if (!StringUtils.endsWith(file.getOriginalFilename(), ".xlsx")) {
throw new IllegalArgumentException("只支持导入xlsx格式的文件");
}
}
/**
* 校验文件大小
* @param file 需要校验的文件
* @throws IllegalArgumentException 如果文件大小超过限制
*/
private void validateFileSize(MultipartFile file) throws IllegalArgumentException {
if (file.getSize() > 10 * 1024 * 1024) { // 假设最大文件大小为10MB
throw new IllegalArgumentException("文件大小不能超过10MB");
}
}
/**
* 保存缓存的数据到数据库
* @param cachedDataList 待保存的数据列表
*/
private void saveCachedDataList(List<modelEntity> cachedDataList) {
// 这里应该实现具体的数据库保存逻辑
}
上述中的modelEntity是你要导入的实体类;下面是modelEntity的一个参考实例:
@Getter
@Setter
@EqualsAndHashCode
public class modelEntity{
/**
* 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
*/
@ExcelProperty(index = 2)
private Double doubleData;
/**
* 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
*/
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
}
如果上述的实现不能满足你的需求请参考Easy Excel 的官方文档:读Excel | Easy Excel (alibaba.com)