关于Easyexcel读取EXCEL合并单元格信息

关于Easyexcel读取EXCEL合并单元格信息

1.excel模版

@Configuration
public class TestModel {
    
    
	/**
	 *  开发部
	 */
	@ExcelProperty(value = "开发部",index = 0)
	private String kaifabu;
	
	/**
	 * A2
	 */
	@ExcelProperty(value = "A2",index = 1)
	private String a2qiyoutian;
	
	/**
	 * 区块
	 */
	@ExcelProperty(value = "区块",index =2)
	private String qukuai;
	
	/**
	 * 项目部
	 */
	@ExcelProperty(value = "项目部",index =3)
	private String xiangmubu;
	
	/**
	 * 开发部
	 */
	@ExcelProperty(value = "开发部1部", index =4)
	private String kaifabu1;

	public String getKaifabu() {
    
    
		return kaifabu;
	}

	public void setKaifabu(String kaifabu) {
    
    
		this.kaifabu = kaifabu;
	}

	public String geta2qiyoutian() {
    
    
		return a2qiyoutian;
	}

	public void seta2qiyoutian(String a2qiyoutian) {
    
    
		this.a2qiyoutian = a2qiyoutian;
	}

	public String getQukuai() {
    
    
		return qukuai;
	}

	public void setQukuai(String qukuai) {
    
    
		this.qukuai = qukuai;
	}

	public String getXiangmubu() {
    
    
		return xiangmubu;
	}

	public void setXiangmubu(String xiangmubu) {
    
    
		this.xiangmubu = xiangmubu;
	}

	public String getKaifabu1() {
    
    
		return kaifabu1;
	}

	public void setKaifabu1(String kaifabu1) {
    
    
		this.kaifabu1 = kaifabu1;
	}

	@Override
	public String toString() {
    
    
		return "TestModel [kaifabu=" + kaifabu + ", a2qiyoutian=" + a2qiyoutian + ", qukuai=" + qukuai + ", xiangmubu="
				+ xiangmubu + ", kaifabu1=" + kaifabu1 + "]";
	}
}

2.Service层(处理单元格)


@Service
public class TryService extends AnalysisEventListener<Map<Integer,String>>{
    
    
// class readModel extends AnalysisEventListener<Map<Integer, String>>{
    
    
	
	private static final Logger log = LoggerFactory.getLogger(TryService.class);

		// 所有要插入的数据
		 public static List<TestModel> datas = new ArrayList<>();
			// 缓存上一级跨行的数据
			Map<Integer, String>preContent;
			@Override
			public void invoke(Map<Integer, String> o, AnalysisContext analysisContext) {
    
    
				// TODO Auto-generated method stub
				TestModel testModel = new TestModel();
				String kaifabu = o.get(0);
				String a2qiyoutian = o.get(1);
				String qukuai = o.get(2);
				String xiangmubu = o.get(3);
				String kaifabu1 = o.get(4);
				
				// 如果数据是空的话,从缓存对象中取值
				if(StringUtils.isEmpty(kaifabu)){
    
    
				kaifabu = preContent.get(0);
				}
				if(StringUtils.isEmpty(a2qiyoutian)) {
    
    
				a2qiyoutian = preContent.get(1);
				}
				if(StringUtils.isEmpty(qukuai)) {
    
    
				qukuai = preContent.get(2);
				}
				if(StringUtils.isEmpty(xiangmubu)) {
    
    
				xiangmubu = preContent.get(3);
				}
				if(StringUtils.isEmpty(kaifabu1)) {
    
    
				kaifabu1 = preContent.get(4);
				}
        // 为单元格赋值
				testModel.setKaifabu(kaifabu);
				testModel.seta2qiyoutian(a2qiyoutian);
				testModel.setQukuai(qukuai);
				testModel.setXiangmubu(xiangmubu);
				testModel.setKaifabu1(kaifabu1);
				
				// 将数据放入list
				datas.add(testModel);
				// 复用跨行数据的实现
				String uniquKey = o.get(0);
				if(!StringUtils.isEmpty(uniquKey) || preContent == null) {
    
    
					preContent = o;
				}
			}

			@Override
			public void doAfterAllAnalysed(AnalysisContext context) {
    
    
				// TODO Auto-generated method stub
				log.info("读取数据完成");
			}
}

	

这里面主要还是基于传统EasyExcel读取信息的原理,在对单元格方面做出了处理,并且excel表格数据都主要存储在datas里面

		// 将数据放入list
			datas.add(testModel);

原理是将合并元格数据放入Map中进行存储,然后对单元格里面的内容进行判断,如果该区间的单元格为空,则将缓存中的值赋给其单元格。

	String uniquKey = o.get(0);
				if(!StringUtils.isEmpty(uniquKey) || preContent == null) {
    
    
					preContent = o;
				}

如果A列的值为空,那么说明这是跨行列,如果取的值不是空,那说明这是第一次读取跨行列数据,如果preContent为空,说明这是第一次读取sheet表格的数据

3.Rest层

这里代码比较糙(可能存在不必要的代码),主要是用于测试方法是否合理正确。

@RequestMapping("uploadProjectDepartmentExcel")
	public JSONObject uploadProjectDepartmentExcel(@RequestParam(value = "file") MultipartFile file) {
    
    
		JSONObject returnData = new JSONObject();
		JSONObject response = new JSONObject();
		returnData.put("cmd", "uploadProjectDepartmentExcel");
		returnData.put("type", "response");
		returnData.put("response", response);
		
		try {
    
    
			// 检验前端数据
			if(file == null || file.isEmpty()) {
    
    
				throw new MyException("未找到 file字段");
			}
			// 暂存临时文件
			String path = FilePath.CACHE_PATH + "/uploadFile" + System.currentTimeMillis() + "/";
			String originalFilename = file.getOriginalFilename();
			log.info("缓存文件:"+originalFilename );
			File filepath = new File(path);
			
			// 创建文件夹
			if(!filepath.exists()) {
    
    
				filepath.mkdirs();
			}
			// 文件路径
			File uploadFile = new File(path + originalFilename);
			file.transferTo(uploadFile);
			/*************************** 1、读取数据 ***************************/
			// 表单
			int sheetNo = 0;
			// 行数(从该行开始读取)
			int headRownumber = 0;
			EasyExcel.read(uploadFile,new ProjectManagementExcelService()).sheet(sheetNo).headRowNumber(headRownumber).doRead();
			List<ProjectManagementExcelModel> message = ProjectManagementExcelService.datas;
			response.put("res", true);
			response.put("message", message);
		}catch (MyException e) {
    
    
			// TODO: handle exception
			log.error("uploadProjectDepartmentExcel",e.getReason());
			response.put("res", false);
			response.put("exception", e.getReason());
		}catch (Exception e) {
    
    
			// TODO: handle exception
			log.error("uploadProjectDepartmentExcel",e.getMessage());
			response.put("res", false);
			response.put("exception", e.getMessage());
		}
		return returnData;
	}

试过文本地址和文本流两种方法来导入excel,后来发现通过地址来导入excel是行的通的。

猜你喜欢

转载自blog.csdn.net/weixin_51220967/article/details/126433314