java讀取Excel導入去除空行簡單方法
問題:
在Java讀取Excel導入操作時, sheet.getLastRowNum()會統(tǒng)計帶有格式的空白行,導致獲取的最大行數(shù)不準確,數(shù)據(jù)導入失敗。


解決:
在操作過程中刪除存在樣式的空白行
可通過將空白行(內(nèi)容為空,但是存在樣式)進行sheet.removeRow刪除后
再調(diào)用getLastRowNum()進行行數(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的第二行索行開始,遍歷到最后一行(第一行是標題,直接跳過不讀?。?
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ù)列超出標題范圍");
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);
//如果是合并單元列,就取合并單元格的首行和首列所在位置讀數(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","導入成功");
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
reMap.put("flag",false);
reMap.put("msg","導入失敗,請聯(lián)系系統(tǒng)管理員");
}
return reMap;
}
//獲取準確的文件行數(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進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導入去除空行的文章就介紹到這了,更多相關(guān)java導入Excel去除空行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解
這篇文章主要介紹了Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Java并發(fā)編程中的CyclicBarrier使用解析
這篇文章主要介紹了Java并發(fā)編程中的CyclicBarrier使用解析,CyclicBarrier從字面意思上來看,循環(huán)柵欄,這篇文章就來分析下是到底是如何實現(xiàn)循環(huán)和柵欄的,需要的朋友可以參考下2023-12-12
關(guān)于spring項目中無法加載resources下文件問題及解決方法
在學習Spring過程中,TestContext框架試圖檢測一個默認的XML資源位置,再resources下創(chuàng)建了一個com.example的文件夾,執(zhí)行時,報錯,本文給大家介紹spring項目中無法加載resources下文件,感興趣的朋友跟隨小編一起看看吧2023-10-10
SpringSecurity的@EnableWebSecurity注解詳解
這篇文章主要介紹了SpringSecurity的@EnableWebSecurity注解詳解,@EnableWebSecurity是開啟SpringSecurity的默認行為,它的上面有一個Import注解導入了WebSecurityConfiguration類,就是往IOC容器中注入了WebSecurityConfiguration這個類,需要的朋友可以參考下2023-11-11

