经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
POI导入具有合并了单元格的Excel
来源:cnblogs  作者:榴莲蛋炒饭  时间:2018/10/25 9:36:42  对本文有异议

  POI进行单行单行地导入的数据在网上有许多的文章,但是要导入一个具有合并单元格的excel貌似比较难找。刚好最近完成了这样的一个需求,要求导入具有合并单元格的excel:

  1. 1 /**
  2. 2 * 读取excel数据,调用这方法开始
  3. 3 * @param is
  4. 4 * @param indexNum 至少需要多少列数据
  5. 5 */
  6. 6 public static List<Object[]> readExcelToObj(InputStream is,int indexNum) {
  7. 7
  8. 8 Workbook wb = null;
  9. 9 List<Object[]> objArrList = null;
  10. 10 try {
  11. 11 objArrList = new ArrayList<>();
  12. 12 wb = WorkbookFactory.create(is);
  13. 13 readExcel(wb, 0, 0, 0,objArrList,indexNum);
  14. 14 } catch (InvalidFormatException e) {
  15. 15 e.printStackTrace();
  16. 16 } catch (IOException e) {
  17. 17 e.printStackTrace();
  18. 18 }
  19. 19 return objArrList;
  20. 20 }
  1. 1 /**
  2. 2 * 读取excel文件
  3. 3 * @param wb
  4. 4 * @param sheetIndex sheet页下标:从0开始
  5. 5 * @param startReadLine 开始读取的行:从0开始
  6. 6 * @param tailLine 去除最后读取的行
  7. 7 */
  8. 8 public static void readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine, List<Object[]> objArrList, int indexNum) {
  9. 9 Sheet sheet = wb.getSheetAt(sheetIndex);
  10. 10 Row row = null;
  11. 11
  12. 12 for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {
  13. 13 row = sheet.getRow(i);
  14. 14 List<Object> objList = new ArrayList<>();
  15. 15 for(int j = 0 ; j<row.getLastCellNum();j++) {
  16. 16 //for(Cell c : row) {
  17. 17 Cell c = row.getCell(j);
  18. 18 if(c==null){
  19. 19 objList.add("");
  20. 20 continue;
  21. 21 }
  22. 22 boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
  23. 23           //判断是否具有合并单元格
  24. 24 if(isMerge) {
  25. 25 String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
  26. 26 objList.add(rs);
  27. 27 }else {
  28. 28 objList.add(getCellValue(c));
  29. 29 }
  30. 30
  31. 31 }
  32. 32 while(objList.size()<indexNum){
  33. 33 objList.add("");
  34. 34 }
  35. 35 objArrList.add(objList.toArray());
  36. 36 }
  37. 37 }
  1. 1 /**
  2. 2 * 获取合并单元格的值
  3. 3 * @param sheet
  4. 4 * @param row
  5. 5 * @param column
  6. 6 * @return
  7. 7 */
  8. 8 public static String getMergedRegionValue(Sheet sheet ,int row , int column){
  9. 9 int sheetMergeCount = sheet.getNumMergedRegions();
  10. 10
  11. 11 for(int i = 0 ; i < sheetMergeCount ; i++){
  12. 12 CellRangeAddress ca = sheet.getMergedRegion(i);
  13. 13 int firstColumn = ca.getFirstColumn();
  14. 14 int lastColumn = ca.getLastColumn();
  15. 15 int firstRow = ca.getFirstRow();
  16. 16 int lastRow = ca.getLastRow();
  17. 17
  18. 18 if(row >= firstRow && row <= lastRow){
  19. 19
  20. 20 if(column >= firstColumn && column <= lastColumn){
  21. 21 Row fRow = sheet.getRow(firstRow);
  22. 22 Cell fCell = fRow.getCell(firstColumn);
  23. 23 return getCellValue(fCell) ;
  24. 24 }
  25. 25 }
  26. 26 }
  27. 27
  28. 28 return null ;
  29. 29 }
  1. 1 /**
  2. 2 * 判断指定的单元格是否是合并单元格
  3. 3 * @param sheet
  4. 4 * @param row 行下标
  5. 5 * @param column 列下标
  6. 6 * @return
  7. 7 */
  8. 8 public static boolean isMergedRegion(Sheet sheet,int row ,int column) {
  9. 9 int sheetMergeCount = sheet.getNumMergedRegions();
  10. 10 for (int i = 0; i < sheetMergeCount; i++) {
  11. 11 CellRangeAddress range = sheet.getMergedRegion(i);
  12. 12 int firstColumn = range.getFirstColumn();
  13. 13 int lastColumn = range.getLastColumn();
  14. 14 int firstRow = range.getFirstRow();
  15. 15 int lastRow = range.getLastRow();
  16. 16 if(row >= firstRow && row <= lastRow){
  17. 17 if(column >= firstColumn && column <= lastColumn){
  18. 18 return true;
  19. 19 }
  20. 20 }
  21. 21 }
  22. 22 return false;
  23. 23 }
  1. 1 /**
  2. 2 * 获取单元格的值
  3. 3 * @param cell
  4. 4 * @return
  5. 5 */
  6. 6 public static String getCellValue(Cell cell){
  7. 7
  8. 8 if(cell == null) return "";
  9. 9
  10. 10 if(cell.getCellType() == Cell.CELL_TYPE_STRING){
  11. 11
  12. 12 return cell.getStringCellValue();
  13. 13
  14. 14 }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
  15. 15
  16. 16 return String.valueOf(cell.getBooleanCellValue());
  17. 17
  18. 18 }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
  19. 19
  20. 20 return cell.getCellFormula() ;
  21. 21
  22. 22 }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
  23. 23
  24. 24 return String.valueOf(cell.getNumericCellValue());
  25. 25
  26. 26 }
  27. 27 return "";
  28. 28 }

  注意:这导入功能也适用于单行读取,直接调用 readExcelToObj() 方法即可;参数1:传入excel文件的输入流;参数2:指定你希望至少要读入多少列数据(比如传入个0,就代表:如果你有的行只有3列数据的话,那么获得的数组长度就只有3;如果你传入了10,那些只有3列的数据会自动填充空字符串给数组,使每个数组最小长度为10);

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号