`

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

    博客分类:
  • java
 
阅读更多

原文: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. }    

分享到:
评论

相关推荐

    Java POI合并Excel根据标题取任意列

    不管是poi还是jxl都无法根据列名取数据,简单的合并Excel,如果每个Excel里每列不一定是按顺序来的,或者么些列有缺失,就不好办了,这个合并方式,是依照JDBC读取数据库的方式,把Excel看成是一个数据库表,返回List&lt;Map&lt;&gt;&gt;...

    java excel tree

    在Java编程领域,生成Excel报表是一项常见的任务,尤其在数据可视化和组织结构管理中。"java excel tree"这个主题正是关于如何使用Java来创建一个基于Excel的组织架构报表,它利用了组合模式和一系列算法来实现自动...

    【Qt QAxObject】使用 QAxObject 高效任意读写 Excel 表

    在Qt开发中,有时我们需要与Microsoft Office的组件交互,例如读取或写入Excel电子表格。在这种情况下,QAxObject类提供了一种有效的方式,它允许我们通过COM(Component Object Model)接口与ActiveX控件进行通信。...

    复杂多表头excel表格的导出及布局,支持拓展

    在IT行业中,处理数据是日常任务之一,而Excel作为广泛使用的数据管理工具,其功能强大且灵活。在处理复杂的业务场景时,往往需要创建多表头的表格来组织和展示数据,这使得信息层次分明,易于理解。本知识点将深入...

    poi-bin-3.0-FINAL-20070503.tar.gz

    描述中提到,将这个压缩包解压并放入工程的`lib`文件夹后,你可以使用Java对Excel进行任意操作。这表明Apache POI提供了丰富的API,使得开发者能够方便地完成各种Excel任务,如创建工作簿、添加工作表、设置单元格值...

    jxls利用模板生成excel文件

    1. **动态数据处理**:支持条件逻辑、循环、合并单元格等复杂操作,使得模板可以处理任意复杂的数据结构。 2. **自动类型转换**:`jxls`可以自动处理不同类型的数据,例如数字、日期、字符串等。 3. **样式控制**...

    Java范例开发大全 (源程序)

     实例139 利用POI读取Word文件中的内容 208  7.3 字符流 209  实例140 按顺序创建文件 210  实例141 按顺序读取文件 211  实例142 追加文件内容 211  实例143 只显示文件中指定的字符 214  实例144 ...

    java范例开发大全(pdf&源码)

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 215 实例...

    java范例开发大全源代码

     实例139 利用POI读取Word文件中的内容 208  7.3 字符流 209  实例140 按顺序创建文件 210  实例141 按顺序读取文件 211  实例142 追加文件内容 211  实例143 只显示文件中指定的字符 214  实例...

    java范例开发大全

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 215 实例...

    Java范例开发大全(全书源程序)

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 ...

Global site tag (gtag.js) - Google Analytics