java poi 讀取有合併單元格的EXCEL檔案
阿新 • • 發佈:2019-01-14
資料的樣子是這樣的
public String addReportByExcel(Long userId,InputStream inputStream,String fileName) throws BusinessException{ String message = "Import success"; boolean isE2007 = false; //判斷是否是excel2007格式 if(fileName.endsWith("xlsx")){ isE2007 = true; } int rowIndex = 0; int columnIndex = 0; try { InputStream input = inputStream; //建立輸入流 Workbook wb = null; //根據檔案格式(2003或者2007)來初始化 if(isE2007){ wb = new XSSFWorkbook(input); }else{ wb = new HSSFWorkbook(input); } Sheet sheet = wb.getSheetAt(0); //獲得第一個表單 //System.out.println("總行數:"+sheet.getLastRowNum()); List<CellRangeAddress> cras = getCombineCell(sheet); //isMergedRegion(Sheet sheet,int row ,int column);判斷是不是合併單元格\ int count = sheet.getLastRowNum()+1;//總行數 List<InspectionReport> irs = new ArrayList<>(); for(int i = 1; i < count;i++){ rowIndex = i; Row row = sheet.getRow(i); InspectionReport ir = new InspectionReport(); ir.setReportName(getCellValue(row.getCell(0))); ir.setShift(Double.valueOf(getCellValue(row.getCell(1))).intValue()); ir.setLine(getCellValue(row.getCell(2))); ir.setStationCode(getCellValue(row.getCell(3))); ir.setArea(Double.valueOf(getCellValue(row.getCell(4))).intValue()); ir.setReportStatus(Double.valueOf(getCellValue(row.getCell(5))).intValue()); List<InspectionItem> items = new ArrayList<>(); if(isMergedRegion(sheet,i,0)){ int lastRow = getRowNum(cras,sheet.getRow(i).getCell(0),sheet); for(;i<=lastRow;i++){ row = sheet.getRow(i); InspectionItem item = new InspectionItem(); item.setItem(getCellValue(row.getCell(6))); item.setMethod(getCellValue(row.getCell(7))); item.setMode(getCellValue(row.getCell(8))); item.setStandardValue(getCellValue(row.getCell(9))); item.setDeviationValue(getCellValue(row.getCell(10))); String pinci = getCellValue(row.getCell(11)); Double d = Double.valueOf(pinci); item.setFrequency(d.intValue()); items.add(item); } i--; }else{ row = sheet.getRow(i); InspectionItem item = new InspectionItem(); item.setItem(getCellValue(row.getCell(6))); item.setMethod(getCellValue(row.getCell(7))); item.setMode(getCellValue(row.getCell(8))); item.setStandardValue(getCellValue(row.getCell(9))); item.setDeviationValue(getCellValue(row.getCell(10))); String pinci = getCellValue(row.getCell(11)); Double d = Double.valueOf(pinci); item.setFrequency(d.intValue()); items.add(item); } ir.setItems(items); irs.add(ir); } XaResult<List<InspectionReport>> saved = inspectionReportService.createByXls(1l, irs); message = saved.getMessage(); /*JSONArray js= new JSONArray(); js.addAll(irs); System.out.println(js.toJSONString());*/ } catch (Exception ex) { //xr.setMessage("Import failed, please check the data in "+rowIndex+" rows "+columnIndex+" columns "); message = "Import failed, please check the data in "+rowIndex+" rows "; } return message; }
/** * 獲取單元格的值 * @param cell * @return */ public String getCellValue(Cell cell){ if(cell == null) return ""; if(cell.getCellType() == Cell.CELL_TYPE_STRING){ return cell.getStringCellValue(); }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){ return String.valueOf(cell.getBooleanCellValue()); }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){ return cell.getCellFormula() ; }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ return String.valueOf(cell.getNumericCellValue()); } return ""; }
/** * 合併單元格處理,獲取合併行 * @param sheet * @return List<CellRangeAddress> */ public List<CellRangeAddress> getCombineCell(Sheet sheet) { List<CellRangeAddress> list = new ArrayList<CellRangeAddress>(); //獲得一個 sheet 中合併單元格的數量 int sheetmergerCount = sheet.getNumMergedRegions(); //遍歷所有的合併單元格 for(int i = 0; i<sheetmergerCount;i++) { //獲得合併單元格儲存進list中 CellRangeAddress ca = sheet.getMergedRegion(i); list.add(ca); } return list; } private int getRowNum(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet){ int xr = 0; int firstC = 0; int lastC = 0; int firstR = 0; int lastR = 0; for(CellRangeAddress ca:listCombineCell) { //獲得合併單元格的起始行, 結束行, 起始列, 結束列 firstC = ca.getFirstColumn(); lastC = ca.getLastColumn(); firstR = ca.getFirstRow(); lastR = ca.getLastRow(); if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) { if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) { xr = lastR; } } } return xr; } /** * 判斷單元格是否為合併單元格,是的話則將單元格的值返回 * @param listCombineCell 存放合併單元格的list * @param cell 需要判斷的單元格 * @param sheet sheet * @return */ public String isCombineCell(List<CellRangeAddress> listCombineCell,Cell cell,Sheet sheet) throws Exception{ int firstC = 0; int lastC = 0; int firstR = 0; int lastR = 0; String cellValue = null; for(CellRangeAddress ca:listCombineCell) { //獲得合併單元格的起始行, 結束行, 起始列, 結束列 firstC = ca.getFirstColumn(); lastC = ca.getLastColumn(); firstR = ca.getFirstRow(); lastR = ca.getLastRow(); if(cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) { if(cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) { Row fRow = sheet.getRow(firstR); Cell fCell = fRow.getCell(firstC); cellValue = getCellValue(fCell); break; } } else { cellValue = ""; } } return cellValue; } /** * 獲取合併單元格的值 * @param sheet * @param row * @param column * @return */ public String getMergedRegionValue(Sheet sheet ,int row , int column){ int sheetMergeCount = sheet.getNumMergedRegions(); for(int i = 0 ; i < sheetMergeCount ; i++){ CellRangeAddress ca = sheet.getMergedRegion(i); int firstColumn = ca.getFirstColumn(); int lastColumn = ca.getLastColumn(); int firstRow = ca.getFirstRow(); int lastRow = ca.getLastRow(); if(row >= firstRow && row <= lastRow){ if(column >= firstColumn && column <= lastColumn){ Row fRow = sheet.getRow(firstRow); Cell fCell = fRow.getCell(firstColumn); return getCellValue(fCell) ; } } } return null ; } /** * 判斷指定的單元格是否是合併單元格 * @param sheet * @param row 行下標 * @param column 列下標 * @return */ private boolean isMergedRegion(Sheet sheet,int row ,int column) { 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(); if(row >= firstRow && row <= lastRow){ if(column >= firstColumn && column <= lastColumn){ return true; } } } return false; }