欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java讀取Excel導(dǎo)入去除空行簡單方法

 更新時間:2023年07月19日 12:06:51   作者:傻瓜傻了個瓜  
這篇文章主要給大家介紹了關(guān)于java讀取Excel導(dǎo)入去除空行的簡單方法,在日常開發(fā)中,想必都遇到過批處理的需求,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下

問題:

在Java讀取Excel導(dǎo)入操作時, sheet.getLastRowNum()會統(tǒng)計帶有格式的空白行,導(dǎo)致獲取的最大行數(shù)不準(zhǔn)確,數(shù)據(jù)導(dǎo)入失敗。

解決:

在操作過程中刪除存在樣式的空白行

可通過將空白行(內(nèi)容為空,但是存在樣式)進(jìn)行sheet.removeRow刪除后

再調(diào)用getLastRowNum()進(jìn)行行數(shù)統(tǒng)計,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)))
				|| !"操作要點(diǎn)".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的第二行索行開始,遍歷到最后一行(第一行是標(biāo)題,直接跳過不讀?。?
		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","數(shù)據(jù)列超出標(biāo)題范圍");
				return reMap;
			}
			Map<String, Object> projectMap = new LinkedHashMap<>();
			Map<String, Object> mainPointsMap = new LinkedHashMap<>();
			//對每行進(jìn)行列遍歷,即一列一列的進(jìn)行解析
			for(int j=0; j < cellNum; j++) {
				//拿到了excel的列對象
				Cell cell = row.getCell(j);
				//將列對象的行號和列號+下劃線組成key去hashmap中查詢,不為空說明當(dāng)前的cell是合并單元列
				Integer[] firstRowNumberAndCellNumber = mergedRegionMap.get(i+"_"+j);
				//如果是合并單元列,就取合并單元格的首行和首列所在位置讀數(shù)據(jù),否則就是直接讀數(shù)據(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("行操作要點(diǎn)不能為空").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("行總分只能為數(shù)字").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("行操作要點(diǎn)不能為空").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("行總分只能為數(shù)字").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","導(dǎo)入成功");
		}catch (Exception e){
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			reMap.put("flag",false);
			reMap.put("msg","導(dǎo)入失敗,請聯(lián)系系統(tǒng)管理員");
		}
		return reMap;
	}
//獲取準(zhǔn)確的文件行數(shù)
	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進(jìn)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++) {
			//拿到每個合并單元格,開始行,結(jié)束行,開始列,結(jié)束列
			CellRangeAddress range = sheet.getMergedRegion(i);
			int firstColumn = range.getFirstColumn();
			int lastColumn = range.getLastColumn();
			int firstRow = range.getFirstRow();
			int lastRow = range.getLastRow();
			//構(gòu)造一個開始行和開始列組成的數(shù)組
			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;
	}

總結(jié)

到此這篇關(guān)于java讀取Excel導(dǎo)入去除空行的文章就介紹到這了,更多相關(guān)java導(dǎo)入Excel去除空行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解

    Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解

    這篇文章主要介紹了Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring Boot啟動過程全面解析(三)

    Spring Boot啟動過程全面解析(三)

    這篇文章主要介紹了Spring Boot啟動過程全面解析(三)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java并發(fā)編程中的CyclicBarrier使用解析

    Java并發(fā)編程中的CyclicBarrier使用解析

    這篇文章主要介紹了Java并發(fā)編程中的CyclicBarrier使用解析,CyclicBarrier從字面意思上來看,循環(huán)柵欄,這篇文章就來分析下是到底是如何實(shí)現(xiàn)循環(huán)和柵欄的,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于spring項目中無法加載resources下文件問題及解決方法

    關(guān)于spring項目中無法加載resources下文件問題及解決方法

    在學(xué)習(xí)Spring過程中,TestContext框架試圖檢測一個默認(rèn)的XML資源位置,再resources下創(chuàng)建了一個com.example的文件夾,執(zhí)行時,報錯,本文給大家介紹spring項目中無法加載resources下文件,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題

    解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題

    這篇文章主要介紹了解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java微信授權(quán)登錄小程序接口流程

    Java微信授權(quán)登錄小程序接口流程

    微信授權(quán)登錄小程序的流程是一個涉及前端和后端交互的過程,主要目的是讓用戶能夠使用微信賬號快速登錄小程序,避免重復(fù)輸入用戶名和密碼,下面給大家介紹Java微信授權(quán)登錄小程序接口流程,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Mapper類中存在名稱相同的方法重載報錯問題

    Mapper類中存在名稱相同的方法重載報錯問題

    這篇文章主要介紹了Mapper類中存在名稱相同的方法重載報錯問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解流程

    Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解流程

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaWeb動態(tài)導(dǎo)出Excel可彈出下載

    JavaWeb動態(tài)導(dǎo)出Excel可彈出下載

    這篇文章主要介紹了JavaWeb動態(tài)導(dǎo)出Excel,對Excel可彈出進(jìn)行下載操作,感興趣的小伙伴們可以參考一下
    2016-03-03
  • SpringSecurity的@EnableWebSecurity注解詳解

    SpringSecurity的@EnableWebSecurity注解詳解

    這篇文章主要介紹了SpringSecurity的@EnableWebSecurity注解詳解,@EnableWebSecurity是開啟SpringSecurity的默認(rèn)行為,它的上面有一個Import注解導(dǎo)入了WebSecurityConfiguration類,就是往IOC容器中注入了WebSecurityConfiguration這個類,需要的朋友可以參考下
    2023-11-11

最新評論