java讀取Excel導(dǎo)入去除空行簡單方法
問題:
在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))) || !"操作要點".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("行操作要點不能為空").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("行操作要點不能為空").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ù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Java并發(fā)編程中的CyclicBarrier使用解析
這篇文章主要介紹了Java并發(fā)編程中的CyclicBarrier使用解析,CyclicBarrier從字面意思上來看,循環(huán)柵欄,這篇文章就來分析下是到底是如何實現(xiàn)循環(huán)和柵欄的,需要的朋友可以參考下2023-12-12關(guān)于spring項目中無法加載resources下文件問題及解決方法
在學(xué)習(xí)Spring過程中,TestContext框架試圖檢測一個默認(rèn)的XML資源位置,再resources下創(chuàng)建了一個com.example的文件夾,執(zhí)行時,報錯,本文給大家介紹spring項目中無法加載resources下文件,感興趣的朋友跟隨小編一起看看吧2023-10-10Java實現(xiàn)學(xué)生管理系統(tǒng)詳解流程
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06JavaWeb動態(tài)導(dǎo)出Excel可彈出下載
這篇文章主要介紹了JavaWeb動態(tài)導(dǎo)出Excel,對Excel可彈出進(jìn)行下載操作,感興趣的小伙伴們可以參考一下2016-03-03SpringSecurity的@EnableWebSecurity注解詳解
這篇文章主要介紹了SpringSecurity的@EnableWebSecurity注解詳解,@EnableWebSecurity是開啟SpringSecurity的默認(rèn)行為,它的上面有一個Import注解導(dǎo)入了WebSecurityConfiguration類,就是往IOC容器中注入了WebSecurityConfiguration這個類,需要的朋友可以參考下2023-11-11