java實現(xiàn)讀取帶合并單元格的Excel
java讀取含有合并單元格的Excel
Excel如下:
示例代碼
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.util.CellRangeAddress; public class ExcelUtil { public static void main(String[] args){ ExcelUtil excelUtil = new ExcelUtil(); //讀取excel數(shù)據(jù) List<Map<String,String>> result = excelUtil.readExcelToObj("C:\\Users\\miracle\\Desktop\\合并單元格.xlsx"); for(Map<String,String> map:result){ System.out.println(map); } } /** * 讀取excel數(shù)據(jù) * @param path */ private List<Map<String,String>> readExcelToObj(String path) { Workbook wb = null; List<Map<String,String>> result = null; try { wb = WorkbookFactory.create(new File(path)); result = readExcel(wb, 0, 1, 0); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } /** * 讀取excel文件 * @param wb * @param sheetIndex sheet頁下標:從0開始 * @param startReadLine 開始讀取的行:從0開始 * @param tailLine 去除最后讀取的行 */ private List<Map<String,String>> readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) { Sheet sheet = wb.getSheetAt(sheetIndex); Row row = null; List<Map<String,String>> result = new ArrayList<Map<String,String>>(); for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) { row = sheet.getRow(i); Map<String,String> map = new HashMap<String,String>(); for(Cell c : row) { String returnStr = ""; boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex()); //判斷是否具有合并單元格 if(isMerge) { String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex()); // System.out.print(rs + "------ "); returnStr = rs; }else { //設置單元格類型 c.setCellType(CellType.STRING); // System.out.print(c.getRichStringCellValue()+"++++ "); returnStr = c.getRichStringCellValue().getString(); } if(c.getColumnIndex()==0){ map.put("class",returnStr); }else if(c.getColumnIndex()==1){ map.put("course",returnStr); }else if(c.getColumnIndex()==2){ map.put("student",returnStr); }else if(c.getColumnIndex()==3){ map.put("score",returnStr); } } result.add(map); // System.out.println(); } return result; } /** * 獲取合并單元格的值 * @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 isMergedRow(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; } /** * 判斷指定的單元格是否是合并單元格 * @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; } /** * 判斷sheet頁中是否含有合并單元格 * @param sheet * @return */ private boolean hasMerged(Sheet sheet) { return sheet.getNumMergedRegions() > 0 ? true : false; } /** * 合并單元格 * @param sheet * @param firstRow 開始行 * @param lastRow 結(jié)束行 * @param firstCol 開始列 * @param lastCol 結(jié)束列 */ private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) { sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); } /** * 獲取單元格的值 * @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 ""; } /** * 從excel讀取內(nèi)容 */ public static void readContent(String fileName) { boolean isE2007 = false; //判斷是否是excel2007格式 if(fileName.endsWith("xlsx")) isE2007 = true; try { InputStream input = new FileInputStream(fileName); //建立輸入流 Workbook wb = null; //根據(jù)文件格式(2003或者2007)來初始化 if(isE2007) wb = new XSSFWorkbook(input); else wb = new HSSFWorkbook(input); Sheet sheet = wb.getSheetAt(0); //獲得第一個表單 Iterator<Row> rows = sheet.rowIterator(); //獲得第一個表單的迭代器 while (rows.hasNext()) { Row row = rows.next(); //獲得行數(shù)據(jù) System.out.println("Row #" + row.getRowNum()); //獲得行號從0開始 Iterator<Cell> cells = row.cellIterator(); //獲得第一行的迭代器 while (cells.hasNext()) { Cell cell = cells.next(); System.out.println("Cell #" + cell.getColumnIndex()); switch (cell.getCellType()) { //根據(jù)cell中的類型來輸出數(shù)據(jù) case HSSFCell.CELL_TYPE_NUMERIC: System.out.println(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_STRING: System.out.println(cell.getStringCellValue()); break; case HSSFCell.CELL_TYPE_BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: System.out.println(cell.getCellFormula()); break; default: System.out.println("unsuported sell type======="+cell.getCellType()); break; } } } } catch (IOException ex) { ex.printStackTrace(); } } }
執(zhí)行結(jié)果如下:
{score=10, student=張三, course=語文, class=一(1)班}
{score=20, student=李四, course=語文, class=一(1)班}
{score=30, student=王五, course=語文, class=一(1)班}
{score=40, student=趙六, course=數(shù)學, class=一(1)班}
{score=50, student=田七, course=數(shù)學, class=一(1)班}
{score=60, student=周扒皮, course=數(shù)學, class=一(1)班}
到此這篇關于java實現(xiàn)讀取帶合并單元格的Excel的文章就介紹到這了,更多相關java讀取Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于SpringBoot接口+Redis解決用戶重復提交問題
當網(wǎng)絡延遲的情況下用戶多次點擊submit按鈕導致表單重復提交,用戶提交表單后,點擊瀏覽器的【后退】按鈕回退到表單頁面后進行再次提交也會出現(xiàn)用戶重復提交,辦法有很多,我這里只說一種,利用Redis的set方法搞定,需要的朋友可以參考下2023-10-10SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法
本文主要介紹了SpringBoot結(jié)合Mybatis實現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Java使用雙異步實現(xiàn)將Excel的數(shù)據(jù)導入數(shù)據(jù)庫
在開發(fā)中,我們經(jīng)常會遇到這樣的需求,將Excel的數(shù)據(jù)導入數(shù)據(jù)庫中,這篇文章主要來和大家講講Java如何使用雙異步實現(xiàn)將Excel的數(shù)據(jù)導入數(shù)據(jù)庫,感興趣的可以了解下2024-01-01