工具方法:java读取Excel合并单元格(简单实例)
生活随笔
收集整理的這篇文章主要介紹了
工具方法:java读取Excel合并单元格(简单实例)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?Apache POI是Apache軟件基金會的開源項目,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。
需要的mavan依賴:
<!-- Excel poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.9</version></dependency>ExcelUtil.java
package com.citywy.controller;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.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddress;public class ExcelUtil {public static void main(String[] args){ExcelUtil excelUtil = new ExcelUtil();//讀取excel數(shù)據(jù)ArrayList<Map<String,String>> result = excelUtil.readExcelToObj("d:\\first\\a.xlsx");for(Map<String,String> map:result){System.out.println("輸出:"+map);}}/*** 讀取excel數(shù)據(jù)* @param path*/private ArrayList<Map<String,String>> readExcelToObj(String path) {Workbook wb = null;ArrayList<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 ArrayList<Map<String,String>> readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) {Sheet sheet = wb.getSheetAt(sheetIndex);Row row = null;ArrayList<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 { // System.out.print(c.getRichStringCellValue()+"++++ ");returnStr = c.getRichStringCellValue().getString();}if(c.getColumnIndex()==0){map.put("id",returnStr);}else if(c.getColumnIndex()==1){map.put("base",returnStr);}else if(c.getColumnIndex()==2){map.put("siteName",returnStr);}else if(c.getColumnIndex()==3){map.put("articleName",returnStr);}else if(c.getColumnIndex()==4){map.put("mediaName",returnStr);}else if(c.getColumnIndex()==5){map.put("mediaUrl",returnStr);}else if(c.getColumnIndex()==6){map.put("newsSource",returnStr);}else if(c.getColumnIndex()==7){map.put("isRecord",returnStr);}else if(c.getColumnIndex()==8){map.put("recordTime",returnStr);}else if(c.getColumnIndex()==9){map.put("remark",returnStr);}}result.add(map);}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 結束行* @param firstCol 開始列* @param lastCol 結束列*/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讀取內容*/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);elsewb = 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();}} }附加個人需求:
/*** str最后一行讀不到,手動最后加一行廢數(shù)據(jù)* 附加:將讀取的內容合并為 * 【高危職業(yè)】什么是高危職業(yè)_十大高危職業(yè)_xxx_xxx_xxx 最多8條* 所屬欄目讀取最后一個/后的值 職業(yè)病防治 */public static void main(String[] args){ExcelUtil excelUtil = new ExcelUtil();//讀取excel數(shù)據(jù)ArrayList<Map<String,String>> result = excelUtil.readExcelToObj("d:\\xreadexcel\\a.xlsx");Map<String, Object> result1 = new HashMap<String, Object>();String str="";for(Map<String,String> map:result){String id = map.get("id");String value = map.get("base");String menu = map.get("siteName");if(menu.contains("/")){menu=menu.substring(menu.lastIndexOf("/")+1);}if(result1.containsKey(id)){if(getCount(str, "_")<7){str=str+"_"+value; }}else{if(!str.equals("")){System.out.println(str); //【高危職業(yè)】什么是高危職業(yè)_十大高危職業(yè)_..._..._...最多8條}//System.out.println(id); //高危職業(yè)//System.out.println(menu.trim());//職業(yè)病防治 str="【"+id+"】"+value;result1.put(id, value);}}}/*** 獲取字符串指定字符個數(shù)* @param str* @param tag* @return*/public static int getCount(String str, String tag) {int index = 0;int count = 0; while ((index = str.indexOf(tag)) != -1 ) {str = str.substring(index + tag.length()); count++;}return count;}轉載:https://www.cnblogs.com/jiuchongxiao/p/5659884.html
總結
以上是生活随笔為你收集整理的工具方法:java读取Excel合并单元格(简单实例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用接口根据关键词取亚马逊商品数据
- 下一篇: 用于实时实例分割的Deep Snake算