用POI读取具有任意合并单元的excel数据

原文:http://blog.csdn.net/ycb1689/article/details/9764191

  1. import java.io.File;  
  2. import java.io.IOException;  
  3.   
  4. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;  
  5. import org.apache.poi.ss.usermodel.Cell;  
  6. import org.apache.poi.ss.usermodel.Row;  
  7. import org.apache.poi.ss.usermodel.Sheet;  
  8. import org.apache.poi.ss.usermodel.Workbook;  
  9. import org.apache.poi.ss.usermodel.WorkbookFactory;  
  10. import org.apache.poi.ss.util.CellRangeAddress;  
  11. import org.junit.Test;  
  12.   
  13. /**  
  14. *   
  15. * @author wcyong  
  16. *  
  17. * @date   2013-6-21  
  18. */  
  19. public class TestReadMergeRegionExcel {  
  20.   
  21. @Test  
  22. public void testReadExcel() {  
  23. readExcelToObj(“f:\\test\\out3.xls”);  
  24. }  
  25.   
  26. /**  
  27. * 读取excel数据  
  28. * @param path  
  29. */  
  30. private void readExcelToObj(String path) {  
  31.   
  32. Workbook wb = null;  
  33. try {  
  34. wb = WorkbookFactory.create(new File(path));  
  35. readExcel(wb, 0, 0, 0);  
  36. } catch (InvalidFormatException e) {  
  37. e.printStackTrace();  
  38. } catch (IOException e) {  
  39. e.printStackTrace();  
  40. }  
  41. }  
  42.   
  43. /**  
  44. * 读取excel文件  
  45. * @param wb   
  46. * @param sheetIndex sheet页下标:从0开始  
  47. * @param startReadLine 开始读取的行:从0开始  
  48. * @param tailLine 去除最后读取的行  
  49. */  
  50. private void readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) {  
  51. Sheet sheet = wb.getSheetAt(sheetIndex);  
  52. Row row = null;  
  53.   
  54. for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {  
  55. row = sheet.getRow(i);  
  56. for(Cell c : row) {  
  57. boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());  
  58. //判断是否具有合并单元格  
  59. if(isMerge) {  
  60. String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());  
  61. System.out.print(rs + “  “);  
  62. }else {  
  63. System.out.print(c.getRichStringCellValue()+”  “);  
  64. }  
  65. }  
  66. System.out.println();  
  67.   
  68. }  
  69.   
  70. }  
  71.   
  72. /**   
  73. * 获取合并单元格的值   
  74. * @param sheet   
  75. * @param row   
  76. * @param column   
  77. * @return   
  78. */    
  79. public String getMergedRegionValue(Sheet sheet ,int row , int column){    
  80.     int sheetMergeCount = sheet.getNumMergedRegions();    
  81.         
  82.     for(int i = 0 ; i < sheetMergeCount ; i++){    
  83.         CellRangeAddress ca = sheet.getMergedRegion(i);    
  84.         int firstColumn = ca.getFirstColumn();    
  85.         int lastColumn = ca.getLastColumn();    
  86.         int firstRow = ca.getFirstRow();    
  87.         int lastRow = ca.getLastRow();    
  88.             
  89.         if(row >= firstRow && row <= lastRow){    
  90.                 
  91.             if(column >= firstColumn && column <= lastColumn){    
  92.                 Row fRow = sheet.getRow(firstRow);    
  93.                 Cell fCell = fRow.getCell(firstColumn);    
  94.                 return getCellValue(fCell) ;    
  95.             }    
  96.         }    
  97.     }    
  98.         
  99.     return null ;    
  100. }    
  101.   
  102. /**  
  103. * 判断合并了行  
  104. * @param sheet  
  105. * @param row  
  106. * @param column  
  107. * @return  
  108. */  
  109. private boolean isMergedRow(Sheet sheet,int row ,int column) {  
  110.   int sheetMergeCount = sheet.getNumMergedRegions();  
  111.   for (int i = 0; i < sheetMergeCount; i++) {  
  112. CellRangeAddress range = sheet.getMergedRegion(i);  
  113. int firstColumn = range.getFirstColumn();  
  114. int lastColumn = range.getLastColumn();  
  115. int firstRow = range.getFirstRow();  
  116. int lastRow = range.getLastRow();  
  117. if(row == firstRow && row == lastRow){  
  118. if(column >= firstColumn && column <= lastColumn){  
  119. return true;  
  120. }  
  121. }  
  122.   }  
  123.   return false;  
  124. }  
  125.   
  126. /**  
  127. * 判断指定的单元格是否是合并单元格  
  128. * @param sheet   
  129. * @param row 行下标  
  130. * @param column 列下标  
  131. * @return  
  132. */  
  133. private boolean isMergedRegion(Sheet sheet,int row ,int column) {  
  134.   int sheetMergeCount = sheet.getNumMergedRegions();  
  135.   for (int i = 0; i < sheetMergeCount; i++) {  
  136. CellRangeAddress range = sheet.getMergedRegion(i);  
  137. int firstColumn = range.getFirstColumn();  
  138. int lastColumn = range.getLastColumn();  
  139. int firstRow = range.getFirstRow();  
  140. int lastRow = range.getLastRow();  
  141. if(row >= firstRow && row <= lastRow){  
  142. if(column >= firstColumn && column <= lastColumn){  
  143. return true;  
  144. }  
  145. }  
  146.   }  
  147.   return false;  
  148. }  
  149.   
  150. /**  
  151. * 判断sheet页中是否含有合并单元格   
  152. * @param sheet   
  153. * @return  
  154. */  
  155. private boolean hasMerged(Sheet sheet) {  
  156.         return sheet.getNumMergedRegions() > 0 ? true : false;  
  157.     }  
  158.   
  159. /**  
  160. * 合并单元格  
  161. * @param sheet   
  162. * @param firstRow 开始行  
  163. * @param lastRow 结束行  
  164. * @param firstCol 开始列  
  165. * @param lastCol 结束列  
  166. */  
  167. private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {  
  168. sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));  
  169. }  
  170.   
  171. /**   
  172. * 获取单元格的值   
  173. * @param cell   
  174. * @return   
  175. */    
  176. public String getCellValue(Cell cell){    
  177.         
  178.     if(cell == null) return “”;    
  179.         
  180.     if(cell.getCellType() == Cell.CELL_TYPE_STRING){    
  181.             
  182.         return cell.getStringCellValue();    
  183.             
  184.     }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){    
  185.             
  186.         return String.valueOf(cell.getBooleanCellValue());    
  187.             
  188.     }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){    
  189.             
  190.         return cell.getCellFormula() ;    
  191.             
  192.     }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){    
  193.             
  194.         return String.valueOf(cell.getNumericCellValue());    
  195.             
  196.     }    
  197.     return “”;    
  198. }    

你可能感兴趣的:(Excel)