Easy Excel 大文件数据导入实现


/**
 * 导入
 * 该方法用于处理用户上传的文件,将其中的数据解析并存储为输入输出详情实体。
 * 注意:仅支持导入格式为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)

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值