easyExcel多sheet导入表格

	@PostMapping("/importExcelOther")
	@ApiOperationSupport(order = 9)
	@ApiOperation(value = "导入excel数据", notes = "传入excel文件")
	public R importExcelOther(@RequestParam("file") MultipartFile file) {
		if (file.getSize()==0){
			throw new RuntimeException("文件大小不能为空");
		}
		ETLExecutionThreadLocal.setStartTime(System.currentTimeMillis());

		String s = odsPvtService.importAllSheet(file);
		dwPvtServiceImpl.ODdsToDw();
		if (s.equals("success")) {
			return R.success("导入成功");
		} else {
			throw new RuntimeException(s);
		}

	}

下面开始进入正题

public interface IOdsPvtService {


	String importAllSheet(MultipartFile file);
}
	 @EtlLog
	@Transactional
	@Override
	public String importAllSheet(MultipartFile file) {

		try (InputStream inputStream = file.getInputStream()) {
			// 创建临时文件
			File tempFile = createTempFile(file);
			// 读取Excel数据
			List<LunchDataMultiSheetListener> listenerList = readExcelData(tempFile);

			// 处理Excel数据
			Map<String, List<Object>> stringListMap = handleExcelData(listenerList);
			for (String s : stringListMap.keySet()) {
				List<Object> objects = stringListMap.get(s);
				switch (s) {
					case "特质焦虑问卷":
						List<OdsPvtSasEntity> entities = (List<OdsPvtSasEntity>) (List<?>) objects;
						odsPvtSasService.saveBatch(entities);
						break;
					case "压力知觉量表":
						List<OdsPvtPssEntity> pssEntities = (List<OdsPvtPssEntity>) (List<?>) objects;
						odsPvtPssService.saveBatch(pssEntities);
						break;
					case "生活满意度量表":
						List<OdsPvtSwlsEntity> shsEntities = (List<OdsPvtSwlsEntity>) (List<?>) objects;
						odsPvtSwlsService.saveBatch(shsEntities);
						break;
					case "主观幸福感量表":
						List<OdsPvtShsEntity> sdsEntities = (List<OdsPvtShsEntity>) (List<?>) objects;
						odsPvtShsService.saveBatch(sdsEntities);
						break;
					case "抑郁自评量表":
						List<OdsPvtSdsEntity> mlqEntities = (List<OdsPvtSdsEntity>) (List<?>) objects;
						odsPvtSdsService.saveBatch(mlqEntities);
						break;
					case "生命意义感量表":
						List<OdsPvtMlqEntity> mlqEntities1 = (List<OdsPvtMlqEntity>) (List<?>) objects;
						odsPvtMlqService.saveBatch(mlqEntities1);
						break;
					case "自尊量表":
						List<OdsPvtSesEntity> sesEntities = (List<OdsPvtSesEntity>) (List<?>) objects;
						odsPvtSesService.saveBatch(sesEntities);
						break;
					case "人格特质维度问卷":
						List<OdsPvtDyEntity> dyEntities = (List<OdsPvtDyEntity>) (List<?>) objects;
						odsPvtDyService.saveBatch(dyEntities);
						break;
					case "大五人格问卷":
						List<OdsPvtNeoFfiEntity> neoFfiEntity = (List<OdsPvtNeoFfiEntity>) (List<?>) objects;
						odsPvtNeoFfiService.saveBatch(neoFfiEntity);
						break;
					case "TKI冲突模式量表":
						List<OdsPvtTkiEntity> tkiFfiEntity = (List<OdsPvtTkiEntity>) (List<?>) objects;
						odsPvtTkiService.saveBatch(tkiFfiEntity);
						break;
					case "人际关系量表":
						List<OdsPvtNriEntity> nriEntity = (List<OdsPvtNriEntity>) (List<?>) objects;
						odsPvtNriService.saveBatch(nriEntity);
						break;
					case "亲社会行为倾向量表":
						List<OdsPvtPtmEntity> ptmEntity = (List<OdsPvtPtmEntity>) (List<?>) objects;
						odsPvtPtmService.saveBatch(ptmEntity);
						break;
					case "Buss-Warren攻击问卷":
						List<OdsPvtBwaqEntity> waqEntity = (List<OdsPvtBwaqEntity>) (List<?>) objects;
						odsPvtBwaqService.saveBatch(waqEntity);
						break;
					case "加工速度测评":
						List<OdsPvtSgEntity> waqEntity1 = (List<OdsPvtSgEntity>) (List<?>) objects;
						odsPvtSgService.saveBatch(waqEntity1);
						break;
					case "执行功能测评":
						List<OdsPvtTsEntity> tsEntity = (List<OdsPvtTsEntity>) (List<?>) objects;
						odsPvtTsService.saveBatch(tsEntity);
						break;
					case "情景记忆测评":
						List<OdsPvtEmEntity> waqEntity2 = (List<OdsPvtEmEntity>) (List<?>) objects;
						odsPvtEmService.saveBatch(waqEntity2);
						break;
					case "工作记忆测评":
						List<OdsPvtWmEntity> waqEntity3 = (List<OdsPvtWmEntity>) (List<?>) objects;
						odsPvtWmService.saveBatch(waqEntity3);
						break;
					case "注意力测评":
						List<OdsPvtSzhxEntity> waqEntity4 = (List<OdsPvtSzhxEntity>) (List<?>) objects;
						odsPvtSzhxService.saveBatch(waqEntity4);
						break;
					case "逻辑推理测评":
						List<OdsPvtRpmsEntity> waqEntity5 = (List<OdsPvtRpmsEntity>) (List<?>) objects;
						odsPvtRpmsService.saveBatch(waqEntity5);
						break;
					case "视空间测评":
						List<OdsPvtMrEntity> waqEntity6 = (List<OdsPvtMrEntity>) (List<?>) objects;
						odsPvtMrService.saveBatch(waqEntity6);
						break;

					case "特质应对方式问卷":
						List<OdsPvtTcsqEntity> waqEntity7 = (List<OdsPvtTcsqEntity>) (List<?>) objects;
						odsPvtTcsqService.saveBatch(waqEntity7);
						break;
					case "情绪调节量表":
						List<OdsPvtErqEntity> waqEntity8 = (List<OdsPvtErqEntity>) (List<?>) objects;
						odsPvtErqService.saveBatch(waqEntity8);
						break;
					case "心理弹性量表":
						List<OdsPvtCdRiscEntity> waqEntity9 = (List<OdsPvtCdRiscEntity>) (List<?>) objects;
						odsPvtCdRiscService.saveBatch(waqEntity9);
						break;
					case "自我效能感量表":
						List<OdsPvtGsesEntity> waqEntity10 = (List<OdsPvtGsesEntity>) (List<?>) objects;
						odsPvtGsesService.saveBatch(waqEntity10);
						break;
					case "基本信息调查表":
						List<OdsPvtBaseInfoEntity> odsPvtBaseInfoEntities = (List<OdsPvtBaseInfoEntity>) (List<?>) objects;
						odsPvtBaseInfoService.saveBatch(odsPvtBaseInfoEntities);
						break;

					default:
						// 可选:如果存在无法识别的实体类名称,可以选择抛出异常或进行适当处理
						break;
				}

			}

			return "success";
		} catch (IOException e) {
			e.printStackTrace();
			return e.getMessage();
		}
	}

	/**
	 * 读取Excel数据
	 */
	private List<LunchDataMultiSheetListener> readExcelData(File file) {
		ExcelReader excelReader = EasyExcel.read(file).build();
		List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
		List<LunchDataMultiSheetListener> listenerList = sheets.stream()
			.map(sheet -> {
				LunchDataMultiSheetListener listener = new LunchDataMultiSheetListener();
				ReadSheet readSheet = EasyExcel.readSheet(sheet.getSheetNo()).registerReadListener(listener).build();
				excelReader.read(readSheet);
				List<List<String>> dataList = listener.getDataList();
				return listener;
			})
			.collect(Collectors.toList());
		excelReader.finish();
		return listenerList;
	}


	/**
	 * 创建临时文件
	 */
	private File createTempFile(MultipartFile file) throws IOException {
		String originalFilename = file.getOriginalFilename();
		String[] filename = originalFilename.split("\\.");
		File tempFile = File.createTempFile(filename[0], "." + filename[1] + ".");
		file.transferTo(tempFile);
		tempFile.deleteOnExit();
		return tempFile;
	}

	//业务层
	private Map<String, List<Object>> handleExcelData(List<LunchDataMultiSheetListener> listenerList) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		Map<String, List<Object>> entityMap = new HashMap<>();

		listenerList.forEach(listener -> listener.getDataList().forEach(lineData -> {
			System.out.println("lineData = " + lineData);
			// 其它业务处理。。
			String type = lineData.get(2);
			Class entityClassBySheetName = getEntityClassBySheetName(type);
			if (entityClassBySheetName == null) {
				return;
			}
			// 使用反射创建新的对象
			try {
				Object entity = entityClassBySheetName.newInstance();

				// 设置属性值
				Field[] fields = entityClassBySheetName.getDeclaredFields();
				for (int i = 0; i < lineData.size(); i++) {
					if (i == lineData.size() - 1) {
						try {
							Field field = fields[i];
							field.setAccessible(true);
							String dateTimeString = lineData.get(i);
							LocalDateTime localDateTime = LocalDateTime.parse(dateTimeString, formatter);
							field.set(entity, localDateTime);
							continue;
						} catch (Exception e) {//最后一个字段类型可能是String类型,如果出问题,那就直接填字符串
							Field field = fields[i];
							field.setAccessible(true);
							field.set(entity, lineData.get(i));
							continue;
						}
					}
					Field field = fields[i];
					field.setAccessible(true);
					field.set(entity, lineData.get(i));
				}
				Field importTimeField =fields[lineData.size()];
				importTimeField.setAccessible(true);
				importTimeField.set(entity, LocalDateTime.now());
				// ...
				// 将对象添加到对应的列表中
				List<Object> entityList = entityMap.getOrDefault(type, new ArrayList<>());
				entityList.add(entity);
				entityMap.put(type, entityList);

			} catch (InstantiationException | IllegalAccessException e) {
				e.printStackTrace();
				// 处理异常
			}
		}));

		return entityMap;

	}


	// 根据 sheetName 返回对应的实体类型
	private Class getEntityClassBySheetName(String sheetName) {
		// 在此根据 sheetName 返回对应的实体类型,例如:
		if (sheetName.equals("特质焦虑问卷")) {
			return OdsPvtSasEntity.class;
		} else if (sheetName.equals("压力知觉量表")) {
			return OdsPvtPssEntity.class;
		} else if (sheetName.equals("生活满意度量表")) {
			return OdsPvtSwlsEntity.class;
		} else if (sheetName.equals("主观幸福感量表")) {
			return OdsPvtShsEntity.class;
		} else if (sheetName.equals("抑郁自评量表")) {
			return OdsPvtSdsEntity.class;
		} else if (sheetName.equals("生命意义感量表")) {
			return OdsPvtMlqEntity.class;
		} else if (sheetName.equals("自尊量表")) {
			return OdsPvtSesEntity.class;
		} else if (sheetName.equals("人格特质维度问卷")) {
			return OdsPvtDyEntity.class;
		} else if (sheetName.equals("大五人格问卷")) {
			return OdsPvtNeoFfiEntity.class;
		} else if (sheetName.equals("TKI冲突模式量表")) {
			return OdsPvtTkiEntity.class;
		} else if (sheetName.equals("人际关系量表")) {
			return OdsPvtNriEntity.class;
		} else if (sheetName.equals("亲社会行为倾向量表")) {
			return OdsPvtPtmEntity.class;

		} else if (sheetName.equals("Buss-Warren攻击问卷")) {
			return OdsPvtBwaqEntity.class;
		} else if (sheetName.equals("加工速度测评")) {
			return OdsPvtSgEntity.class;
		} else if (sheetName.equals("执行功能测评")) {
			return OdsPvtTsEntity.class;
		} else if (sheetName.equals("情景记忆测评")) {
			return OdsPvtEmEntity.class;
		} else if (sheetName.equals("工作记忆测评")) {
			return OdsPvtWmEntity.class;
		} else if (sheetName.equals("注意力测评")) {//注意力测评的表结构有问题 todo
			return OdsPvtSzhxEntity.class;
		} else if (sheetName.equals("逻辑推理测评")) {
			return OdsPvtRpmsEntity.class;
		} else if (sheetName.equals("视空间测评")) {
			return OdsPvtMrEntity.class;
		} else if (sheetName.equals("特质应对方式问卷")) {
			return OdsPvtTcsqEntity.class;
		} else if (sheetName.equals("情绪调节量表")) {
			return OdsPvtErqEntity.class;
		} else if (sheetName.equals("心理弹性量表")) {
			return OdsPvtCdRiscEntity.class;
		} else if (sheetName.equals("自我效能感量表")) {
			return OdsPvtGsesEntity.class;
		} else if (sheetName.equals("基本信息调查表")){
			return OdsPvtBaseInfoEntity.class;
		}

		return null;//返回空为了后续做准备

	}
}

必须建立一个监听器

package org.springblade.common.listener;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

@Slf4j
@Data
public class LunchDataMultiSheetListener extends AnalysisEventListener<Map<Integer, String>> {

	private List<List<String>> dataList;
	public LunchDataMultiSheetListener() {
		this.dataList = new ArrayList<>();
	}

	/**
	 * 每读到一行数据都调用invoke方法
	 *
	 * @param integerObjectMap
	 * @param context
	 */
	@Override
	public void invoke(Map<Integer, String> integerObjectMap, AnalysisContext context) {
		Integer rowIndex = context.readRowHolder().getRowIndex();
		System.out.println("rowIndex = " + rowIndex);
		// key为列号,value为单元格的内容
		log.info("解析到数据:{}", integerObjectMap);


		// 获取当前解析的sheet的信息
		String sheetName = context.readSheetHolder().getSheetName();
//        Integer sheetIndex = context.readSheetHolder().getSheetNo();
//        System.out.println("当前解析的sheet名称:" + sheetName);
//        System.out.println("当前解析的sheet索引:" + sheetIndex);


		// 把数据放到dataList里面,便于统一处理
		LinkedList<String> strings = new LinkedList<>();
		integerObjectMap.forEach((k, v) -> {
			strings.add(v);
		});
		this.dataList.add(strings);
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		// 读完所有数据,做统一处理。
		// 当然还可以拿到listener之外处理

		log.info("数据读取完成");
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EasyExcel 支持导入多个 sheet。可以通过 Workbook 接口中的读取方法实现。例如,以下代码将多个 sheet 导入EasyExcel 中: ```java Workbook workbook = EasyExcel.read(fileName).build(); for (Sheet sheet : workbook) { // do something } ``` 然后,您可以在循环中对每个 sheet 进行操作,例如读取数据、获取 sheet 名称等。 ### 回答2: EasyExcel是一种基于POI封装而成的简单易用的Excel操作工具,它可以轻松地实现Excel的创建、读取、修改和导出等功能。对于一个Excel文件包含多个Sheet数据的情况,如何使用EasyExcel实现导入呢? 首先需要在项目中加入EasyExcel的依赖,可以使用Maven的方式引入EasyExcel相关依赖包。 其次需要定义实体类,用于映射Excel文件中的数据。一般情况下,每个Sheet对应一个实体类,可以根据需要自行定义。需要注意的是,实体类中的字段名称要与Excel文件中的表头名称相对应。 然后需要编写导入Excel文件的代码。EasyExcel提供了多种导入方式,其中最常用的就是读取Excel文件中的每个Sheet数据并将其转换为对应的实体类对象。代码如下: ```java String filename = "demo.xlsx"; // 读取Excel文件中的所有Sheet数据 List<Map<Integer, String>> dataList = EasyExcelUtil.readExcel(filename); // 遍历Sheet列表,将每个Sheet的数据转换为对应的实体类对象 for (Map<Integer, String> sheetData : dataList) { List<MyEntity> entityList = new ArrayList<>(); for (Map.Entry<Integer, String> entry : sheetData.entrySet()) { // 根据表头名称获取对应的字段名称 String fieldName = getFieldNameByHeaderName(entry.getValue()); // 根据字段名称获取对应的字段值 Object fieldValue = getFieldValueByString(entry.getKey(), entry.getValue()); // 将字段值赋给实体类对象 PropertyUtils.setProperty(myEntity, fieldName, fieldValue); } // 将实体类对象添加到列表中 entityList.add(myEntity); } // 将实体类对象列表保存到数据库中 myService.saveDataList(entityList); ``` 其中,`EasyExcelUtil.readExcel()`方法用于读取Excel文件中的所有Sheet数据,返回值是一个包含所有Sheet数据的列表。遍历Sheet列表后,将每个Sheet中的数据转换为对应的实体类对象存储到列表中,最后将列表中的实体类对象保存到数据库中即可。 总之,EasyExcel导入多个Sheet数据的方法是读取Excel文件中的所有Sheet数据并将其转换为对应的实体类对象,最后保存到数据库中即可。其代码实现简单,易于扩展,是一种非常实用的方式。 ### 回答3: EasyExcel是SpringBoot项目中的一个Excel操作工具,它能够帮助我们方便地读取和写入Excel文件。在实际的开发中,我们常常需要将一个Excel文件中的多个Sheet导入到数据库中,EasyExcel提供了非常方便的解决方案。 EasyExcel提供了多种导入Sheet的方式,其中包括使用注解和不使用注解两种方式。下面我们将以使用注解的方式为例,介绍如何实现导入多个Sheet。 首先,我们需要在实体类上使用注解来说明我们要导入哪些Sheet,以及Sheet中每列的数据类型等信息。例如,假设我们要导入Excel文件中的两个Sheet,分别为“用户信息”和“订单信息”,我们需要定义两个实体类如下: ```java @ExcelSheet(name = "用户信息") public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // 省略getter/setter方法 } @ExcelSheet(name = "订单信息") public class Order { @ExcelProperty("订单号") private String orderNumber; @ExcelProperty("金额") private Float amount; // 省略getter/setter方法 } ``` 在上面的代码中,我们使用了@ExcelSheet和@ExcelProperty两个注解来定义Sheet和每列的信息。其中@ExcelSheet注解用于定义Sheet的名称,@ExcelProperty注解用于定义每列的标题名称。 接下来,我们需要编写一个导入Excel文件的方法,具体代码如下: ```java @RestController public class ExcelImportController { @PostMapping("/import") public void importExcel(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); ExcelReader excelReader = EasyExcel.read(inputStream).build(); List<Object> users = excelReader.read(new Sheet(0, 1, User.class)); List<Object> orders = excelReader.read(new Sheet(1, 1, Order.class)); excelReader.finish(); // 进行数据库插入操作 } } ``` 在上面的代码中,我们首先通过MultipartFile获取Excel文件的输入流。然后使用EasyExcel的ExcelReader类来读取Excel文件。我们需要调用excelReader.read方法来获取每个Sheet的数据,读取数据时需要指定Sheet的索引和从第几行开始读取数据。最后我们需要记得调用excelReader.finish方法来关闭Excel文件的输入流。 除了使用@ExcelSheet和@ExcelProperty注解定义实体类外,我们还可以不使用注解的方式进行导入。具体代码如下: ```java @RestController public class ExcelImportController { @PostMapping("/import") public void importExcel(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); ExcelReader excelReader = EasyExcel.read(inputStream).build(); List<User> users = excelReader.read(new Sheet(0, 1, User.class)); List<Order> orders = excelReader.read(new Sheet(1, 1, Order.class)); excelReader.finish(); // 进行数据库插入操作 } } ``` 以上就是使用EasyExcel导入多个Sheet的方式。实现起来非常简单,只需要使用注解或者不使用注解的方式定义实体类即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值