java读取Excel导入去除空行简单方法

 更新时间:2023年07月19日 12:06:51   作者:傻瓜傻了个瓜  
这篇文章主要给大家介绍了关于java读取Excel导入去除空行的简单方法,在日常开发中,想必都遇到过批处理的需求,文中给出了详细的示例代码,需要的朋友可以参考下

问题:

在Java读取Excel导入操作时, sheet.getLastRowNum()会统计带有格式的空白行,导致获取的最大行数不准确,数据导入失败。

解决:

在操作过程中删除存在样式的空白行

可通过将空白行(内容为空,但是存在样式)进行sheet.removeRow删除后

再调用getLastRowNum()进行行数统计,getAccuracyContextNum()方法中。

@Transactional(rollbackFor =  Exception.class)
	public Map<String,Object> importWeb(Workbook wb,String skillName,String skilltype,String office) {
		StringBuilder msg = new StringBuilder();
		Map<String, Object> reMap = new HashMap<>();
		Sheet sheet = wb.getSheetAt(0);
		Row titleRow = sheet.getRow(0);
		if (titleRow.getLastCellNum() != 3 || !"项目名称".equals(getCellValue(titleRow.getCell(0)))
				|| !"操作要点".equals(getCellValue(titleRow.getCell(1))) || !"总分".equals(getCellValue(titleRow.getCell(2)))){
			reMap.put("flag",false);
			reMap.put("msg","模板错误");
			return reMap;
		}
		//获取合并单元格信息的hashmap
		Map<String,Integer[]> mergedRegionMap = getMergedRegionMap(sheet);
		//拿到excel的最后一行的索引
//		int lastRowNum = sheet.getLastRowNum();
		sheet=getAccuracyContextNum(wb,mergedRegionMap);
		int lastRowNum=sheet.getLastRowNum();
		List<Map<String, Object>> projectNameList = new ArrayList<>();
		List<Map<String, Object>> mainPointsList = new ArrayList<>();
		//nursetrain_skill_oper表主键id
		String operId = IdGen.uuid();
		BigDecimal totalScore = new BigDecimal(0);
		//从excel的第二行索行开始,遍历到最后一行(第一行是标题,直接跳过不读取)
		for(int i = 1; i<=lastRowNum ; i++) {
			//拿到excel的行对象
			Row row = sheet.getRow(i);
			//获取excel的行中有多个列
			int cellNum = row.getLastCellNum();
			if (cellNum > 3){
				reMap.put("flag",false);
				reMap.put("msg","数据列超出标题范围");
				return reMap;
			}
			Map<String, Object> projectMap = new LinkedHashMap<>();
			Map<String, Object> mainPointsMap = new LinkedHashMap<>();
			//对每行进行列遍历,即一列一列的进行解析
			for(int j=0; j < cellNum; j++) {
				//拿到了excel的列对象
				Cell cell = row.getCell(j);
				//将列对象的行号和列号+下划线组成key去hashmap中查询,不为空说明当前的cell是合并单元列
				Integer[] firstRowNumberAndCellNumber = mergedRegionMap.get(i+"_"+j);
				//如果是合并单元列,就取合并单元格的首行和首列所在位置读数据,否则就是直接读数据
				if(firstRowNumberAndCellNumber != null) {
					Row rowTmp = sheet.getRow(firstRowNumberAndCellNumber[0]);
					Cell cellTmp = rowTmp.getCell(firstRowNumberAndCellNumber[1]);
					if (j == 0 ){
						projectMap.put("NAME", getCellValue(cellTmp));
						if(StringUtils.isEmpty(getCellValue(cellTmp))) {
							msg.append("第").append(i + 1).append("行项目名称不能为空").append("<br>");
						}
					}
					if (j == 1){
						mainPointsMap.put("NAME", getCellValue(cellTmp));
						if(StringUtils.isEmpty(getCellValue(cellTmp))) {
							msg.append("第").append(i + 1).append("行操作要点不能为空").append("<br>");
						}
					}
					if (j == 2){
						mainPointsMap.put("SCORE", getCellValue(cellTmp));
						if(StringUtils.isEmpty(getCellValue(cellTmp))) {
							msg.append("第").append(i + 1).append("行总分不能为空").append("<br>");
						}else{
							try{
								BigDecimal score = new BigDecimal(getCellValue(cellTmp)).setScale(2,RoundingMode.DOWN);
								totalScore = totalScore.add(score);
							}catch (Exception e){
								msg.append("第").append(i + 1).append("行总分只能为数字").append("<br>");
							}
						}
					}
					mainPointsMap.put("order", i);
				}else{
					if (j == 0 ){
						projectMap.put("NAME", getCellValue(cell));
						if(StringUtils.isEmpty(getCellValue(cell))) {
							msg.append("第").append(i + 1).append("行项目名称不能为空").append("<br>");
						}
					}
					if (j == 1){
						mainPointsMap.put("NAME", getCellValue(cell));
						if(StringUtils.isEmpty(getCellValue(cell))) {
							msg.append("第").append(i + 1).append("行操作要点不能为空").append("<br>");
						}
					}
					if (j == 2){
						mainPointsMap.put("SCORE", getCellValue(cell));
						if(StringUtils.isEmpty(getCellValue(cell))) {
							msg.append("第").append(i + 1).append("行总分不能为空").append("<br>");
						}else {
							try{
								BigDecimal score = new BigDecimal(String.valueOf(getCellValue(cell))).setScale(2,RoundingMode.UP);
								totalScore = totalScore.add(score);
							}catch (Exception e){
								msg.append("第").append(i + 1).append("行总分只能为数字").append("<br>");
							}
						}
					}
					mainPointsMap.put("order", i);
				}
			}
			``````
		try {
			//插入nursetrain_skill_oper表
			//插入nursetrain_skill_oper_item表
			//插入nursetrain_skill_oper_item_step表
			reMap.put("flag",true);
			reMap.put("msg","导入成功");
		}catch (Exception e){
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			reMap.put("flag",false);
			reMap.put("msg","导入失败,请联系系统管理员");
		}
		return reMap;
	}
//获取准确的文件行数
	public Sheet getAccuracyContextNum(Workbook workbook,Map<String,Integer[]> mergedRegionMap) {
		// 取第一个sheet
		Sheet sheet = workbook.getSheetAt(0);
		// 删除空行
		for (int i = 0; i <= sheet.getLastRowNum(); i++) {
			Row row = sheet.getRow(i);
			int cellNum = row.getLastCellNum();
			boolean flag=false;
			for(int j=0; j < cellNum; j++) {
				Integer[] firstRowNumberAndCellNumber = mergedRegionMap.get(i+"_"+j);
				if(firstRowNumberAndCellNumber != null){
					flag=true;
				}
			}
			if (this.isRowEmpty(row) && !flag) {
			// 删除空行
			if (this.isRowEmpty(row)) {
				int lastRowNum = sheet.getLastRowNum();
				if (i >= 0 && i < lastRowNum) {
					sheet.shiftRows(i + 1, lastRowNum, -1);// 将行号为i+1一直到行号为lastRowNum的单元格全部上移一行,以便删除i行
				}
				if (i == lastRowNum) {
					if (row != null) {
						sheet.removeRow(row);
					}
				}
				i--;
			}
		}
		return sheet;
	}
	/**
	 * 判断是否有空行
	 * @param row
	 * @return
	 */
	private  boolean isRowEmpty(Row row) {
		for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
			Cell cell = row.getCell(c);
			if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
				return false;
			}
		}
		return true;
	}
	//将存在合并单元格的列记录入put进hashmap并返回
	public Map<String,Integer[]> getMergedRegionMap(Sheet sheet){
		Map<String,Integer[]> result = new HashMap<String,Integer[]>();
		//获取excel中的所有合并单元格信息
		int sheetMergeCount = sheet.getNumMergedRegions();
		//遍历处理
		for (int i = 0; i < sheetMergeCount; i++) {
			//拿到每个合并单元格,开始行,结束行,开始列,结束列
			CellRangeAddress range = sheet.getMergedRegion(i);
			int firstColumn = range.getFirstColumn();
			int lastColumn = range.getLastColumn();
			int firstRow = range.getFirstRow();
			int lastRow = range.getLastRow();
			//构造一个开始行和开始列组成的数组
			Integer[] firstRowNumberAndCellNumber = new Integer[]{firstRow,firstColumn};
			//遍历,将单元格中的所有行和所有列处理成由行号和下划线和列号组成的key,然后放在hashmap中
			for(int currentRowNumber = firstRow; currentRowNumber <= lastRow; currentRowNumber++) {
				for(int currentCellNumber = firstColumn; currentCellNumber <= lastColumn; currentCellNumber ++) {
					result.put(currentRowNumber+"_"+currentCellNumber, firstRowNumberAndCellNumber);
				}
			}
		}
		return result;
	}

总结

到此这篇关于java读取Excel导入去除空行的文章就介绍到这了,更多相关java导入Excel去除空行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java System.getProperty()-获取系统参数案例详解

    Java System.getProperty()-获取系统参数案例详解

    这篇文章主要介绍了Java System.getProperty()-获取系统参数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring Boot启动过程全面解析(三)

    Spring Boot启动过程全面解析(三)

    这篇文章主要介绍了Spring Boot启动过程全面解析(三)的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java并发编程中的CyclicBarrier使用解析

    Java并发编程中的CyclicBarrier使用解析

    这篇文章主要介绍了Java并发编程中的CyclicBarrier使用解析,CyclicBarrier从字面意思上来看,循环栅栏,这篇文章就来分析下是到底是如何实现循环和栅栏的,需要的朋友可以参考下
    2023-12-12
  • 关于spring项目中无法加载resources下文件问题及解决方法

    关于spring项目中无法加载resources下文件问题及解决方法

    在学习Spring过程中,TestContext框架试图检测一个默认的XML资源位置,再resources下创建了一个com.example的文件夹,执行时,报错,本文给大家介绍spring项目中无法加载resources下文件,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • 解决IDEA导入javaWeb项目注解爆红的问题

    解决IDEA导入javaWeb项目注解爆红的问题

    这篇文章主要介绍了解决IDEA导入javaWeb项目注解爆红的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java微信授权登录小程序接口流程

    Java微信授权登录小程序接口流程

    微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码,下面给大家介绍Java微信授权登录小程序接口流程,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Mapper类中存在名称相同的方法重载报错问题

    Mapper类中存在名称相同的方法重载报错问题

    这篇文章主要介绍了Mapper类中存在名称相同的方法重载报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java实现学生管理系统详解流程

    Java实现学生管理系统详解流程

    这篇文章主要为大家详细介绍了如何利用Java语言实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • JavaWeb动态导出Excel可弹出下载

    JavaWeb动态导出Excel可弹出下载

    这篇文章主要介绍了JavaWeb动态导出Excel,对Excel可弹出进行下载操作,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • SpringSecurity的@EnableWebSecurity注解详解

    SpringSecurity的@EnableWebSecurity注解详解

    这篇文章主要介绍了SpringSecurity的@EnableWebSecurity注解详解,@EnableWebSecurity是开启SpringSecurity的默认行为,它的上面有一个Import注解导入了WebSecurityConfiguration类,就是往IOC容器中注入了WebSecurityConfiguration这个类,需要的朋友可以参考下
    2023-11-11

最新评论