1、获取真实的单元格行数

2、判断是否有合并行

package util;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import org.apache.commons.io.FileUtils;
import org.apache.poi.hslf.model.Sheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import com.controller.GraphController;
import com.entity.Tree;public class EBom {//EBom格式的导入/*** 读取excel文件* * @param wb* @param sheetIndex sheet页下标:从0开始* @param startReadLine 开始读取的行:从0开始* @param tailLine 去除最后读取的行* @throws IOException * @throws InvalidFormatException *///String pid, File filepath, Tree rootpublic static Tree getHSSFSheet(String pid, File filepath, Tree root) throws Exception {root=new Tree();HSSFWorkbook workbook = new HSSFWorkbook(FileUtils.openInputStream(filepath));//读取默认的第一个工作表sheetHSSFSheet Hsheet = workbook.getSheetAt(0);//获取sheet中最后一行行号int lastRowNum = Hsheet.getLastRowNum();int realRowNum=0;for(int i=1;i<lastRowNum;i++){HSSFRow currentRow=Hsheet.getRow(i);int count=0;if(currentRow==null){realRowNum=i;break;}else{for(int j=0;j<=currentRow.getLastCellNum();j++){if(currentRow.getCell(j)!=null){if(currentRow.getCell(j).getStringCellValue()!=null&&!currentRow.getCell(j).getStringCellValue().isEmpty()){break;  }else{count++;}}}if(count==currentRow.getLastCellNum()){realRowNum=i-1;break;}}}//给root复制root.setId(pid);root.setPid("");root.setLevel(1);HashMap<String, List<Integer>> map=new HashMap<String, List<Integer>>();int node=0;int pNode=1;List<Tree> list=new ArrayList<>();list.add(root);for(int i=2;i < realRowNum; i++){HSSFRow row = Hsheet.getRow(i);//暂时给定11个单位的长度String value[]=new String[row.getLastCellNum()+1];String cValue[]=new String[11];String pName;Tree tree=new Tree();boolean isMerge = isMergedRegion(Hsheet, i, 0);//判断是否具有合并单元格if (isMerge) {pName = getMergedRegionValue(Hsheet, i, 0);} else {pName=SysUtil.toNumeric(Hsheet, i, 0);}for(int j=1;j<row.getLastCellNum();j++){value[j]=SysUtil.toNumeric(Hsheet, i, j);}//给value重新赋值cValue[0]=value[3];cValue[3]=value[1];cValue[4]=value[2];cValue[2]=value[4];cValue[5]=value[5];cValue[7]=value[6];cValue[8]=value[7];tree.setValue(cValue);if(map.get(pName)==null){//第二层级String[] pValue=new String[11];pValue[0]=pName;Tree p=new Tree();p.setLevel(2);p.setNode(pNode);p.setValue(pValue);p.setBg_color("#9BBACF");p.setType("ass");pNode++;list.add(p);List<Integer> v=new ArrayList<Integer>();node=1;v.add(node);map.put(pName,v);}else{List<Integer> v=map.get(pName); v.add(node++);map.put(pName, v);}tree.setBg_color("#D7DBDE");tree.setType("part");tree.setLevel(3);tree.setNode(node);tree.setValue(cValue);list.add(tree);}setValue(list);GraphController.merge(root,list);//将list集合转换成tree结构return root;}public static Tree getXSSFSheet(String pid, File filepath, Tree root) throws Exception {root=new Tree();XSSFWorkbook workbook = new XSSFWorkbook(FileUtils.openInputStream(filepath));//读取默认的第一个工作表sheetXSSFSheet Xsheet = workbook.getSheetAt(0);//获取sheet中最后一行行号int lastRowNum = Xsheet.getLastRowNum();int realRowNum=0;for(int i=1;i<lastRowNum;i++){XSSFRow currentRow=Xsheet.getRow(i);int count=0;if(currentRow==null){realRowNum=i;break;}else{for(int j=0;j<=currentRow.getLastCellNum();j++){if(currentRow.getCell(j)!=null){if(currentRow.getCell(j).getStringCellValue()!=null&&!currentRow.getCell(j).getStringCellValue().isEmpty()){break;  }else{count++;}}}if(count==currentRow.getLastCellNum()){realRowNum=i-1;break;}}}//给root复制System.out.println(pid);root.setId(pid);root.setPid("");root.setLevel(1);System.out.println("真实行:"+realRowNum);HashMap<String, List<Integer>> map=new HashMap<String, List<Integer>>();int node=0;int pNode=1;List<Tree> list=new ArrayList<>();list.add(root);for(int i=2;i < realRowNum; i++){XSSFRow row = Xsheet.getRow(i);//暂时给定11个单位的长度String value[]=new String[row.getLastCellNum()+1];String cValue[]=new String[11];String pName;Tree tree=new Tree();boolean isMerge = isMergedRegion(Xsheet, i, 0);//判断是否具有合并单元格if (isMerge) {pName = getMergedRegionValue(Xsheet, i, 0);System.out.print(pName + " :");} else {pName=SysUtil.XssfToNumeric(Xsheet, i, 0);System.out.print(SysUtil.XssfToNumeric(Xsheet, i, 0) + "       ");}for(int j=1;j<row.getLastCellNum();j++){value[j]=SysUtil.XssfToNumeric(Xsheet, i, j);System.out.print(SysUtil.XssfToNumeric(Xsheet, i,j) + "       ");}System.out.println();//给value重新赋值cValue[0]=value[3];cValue[3]=value[1];cValue[4]=value[2];cValue[2]=value[4];cValue[5]=value[5];cValue[7]=value[6];cValue[8]=value[7];tree.setValue(cValue);if(map.get(pName)==null){//第二层级String[] pValue=new String[11];pValue[0]=pName;Tree p=new Tree();p.setLevel(2);p.setNode(pNode);p.setValue(pValue);p.setBg_color("#9BBACF");p.setType("ass");pNode++;list.add(p);List<Integer> v=new ArrayList<Integer>();node=1;v.add(node);map.put(pName,v);}else{List<Integer> v=map.get(pName); v.add(node++);map.put(pName, v);}tree.setBg_color("#D7DBDE");tree.setLevel(3);tree.setNode(node);tree.setValue(cValue);tree.setType("part");list.add(tree);}setValue(list);GraphController.merge(root,list);//将list集合转换成tree结构System.out.println(root);return root;}/*** 获取合并单元格的值* * @param sheet* @param row* @param column* @return*/public static String getMergedRegionValue(HSSFSheet sheet, int row, int column) {int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress ca = ((org.apache.poi.ss.usermodel.Sheet) 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 = ((org.apache.poi.ss.usermodel.Sheet) sheet).getRow(firstRow);Cell fCell = fRow.getCell(firstColumn);return getCellValue(fCell);}}}return null;}/*** 获取合并单元格的值* * @param sheet* @param row* @param column* @return*/public static String getMergedRegionValue(XSSFSheet sheet, int row, int column) {int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress ca = ((org.apache.poi.ss.usermodel.Sheet) 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 = ((org.apache.poi.ss.usermodel.Sheet) 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 = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) 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 static boolean isMergedRegion(HSSFSheet sheet, int row, int column) {int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) 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;}private static boolean isMergedRegion(XSSFSheet sheet, int row, int column) {int sheetMergeCount = ((org.apache.poi.ss.usermodel.Sheet) sheet).getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = ((org.apache.poi.ss.usermodel.Sheet) 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 cell* @return*/public static 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 "";}public static void main(String [] arg) throws Exception{File filepath=new File("d:/upload","EBOM.xls");Tree tree = new Tree();String pid="root";getHSSFSheet(pid,filepath,tree);}//赋值,id,pidpublic static void setValue(List<Tree>list){for(int i=1;i<list.size();i++){if(list.get(i).getLevel()>list.get(i-1).getLevel()){list.get(i).setPid(list.get(i-1).getId());list.get(i).setId(list.get(i-1).getId()+"_"+list.get(i).getNode());}else if(list.get(i).getLevel()<list.get(i-1).getLevel()){list.get(i).setPid(list.get(0).getId());list.get(i).setId(list.get(0).getId()+"_"+list.get(i).getNode());}else{list.get(i).setPid(list.get(i-1).getPid());list.get(i).setId(list.get(i).getPid()+"_"+list.get(i).getNode());}}}
}

2、判断是否是合并单元格

poi合并单元格的处理相关推荐

  1. poi 合并单元格添加边框_如何在Excel中的文本和单元格边框之间添加空间

    poi 合并单元格添加边框 Adding a bit of extra padding to your cell boundaries can make it easier for you to re ...

  2. POI 合并单元格自定义插入

    POI合并单元格 合并插入列为合并开始列,同一行对象合并要使用开始行对象. package com.yk.ln.util; import org.apache.poi.hssf.usermodel.H ...

  3. apache poi斜边框线_apache poi合并单元格设置边框

    HSSFWorkbook wb = newHSSFWorkbook(); HSSFSheet sheet=wb.createSheet();//创建一个样式 HSSFCellStyle styleBo ...

  4. apache poi合并单元格设置边框

    HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();//创建一个样式 HSSFCellStyle style ...

  5. java tr合并单元格_java poi合并单元格问题

    使用poi导出的execl合并单元格,会出现下图问题 整个单元格看似合并了,但是文字没有垂直居中,而且execl中所有的合并都会在第三行开始出现灰色分层样式 合并单元格伪代码 String upCom ...

  6. java合并单元格的快捷键_java poi合并单元格问题

    使用poi导出的execl合并单元格,会出现下图问题 整个单元格看似合并了,但是文字没有垂直居中,而且execl中所有的合并都会在第三行开始出现灰色分层样式 合并单元格伪代码 String upCom ...

  7. 关于POI合并单元格后加边框问题,请大家拍砖

    最近由于项目需要用到了POI来生成Excel表格,遇到单元格合并以后怎么加边框,老是解决不了,特意上来请教一下 在网上找了一堆,都不行. 自己写了一个笨方法,可以实现列合并加边框,但是行合并就不行了, ...

  8. Apache POI 合并单元格

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  ); CellRangeAddress  对象的构造方法 ...

  9. Apache POI 合并单元格

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress cellRangeAddress ); CellRangeAddress 对象的构造方法需要传 ...

  10. 解决POI合并单元格后边框不显示问题

    我这里用的方法可能比较笨,就是合并后其间的每个单元格都设置同样的单元格样式,便可以解决这个问题了,如果大家有更简单更好的方法,可以告诉一下,一起学习. //定义Excel文档对象 XSSFWorkbo ...

最新文章

  1. 模型量化--TBN:Convolutional Neural Network with Ternary Inputs and Binary Weights
  2. BCH粉必转 | 围绕BCH建立的相关项目和应用列表汇总
  3. OpenCV——图像修复函数intpaint()使用详解
  4. 立潮头,冲击 “世界一流”——北大建设世界一流数学学科纪实
  5. 一款打包免签分发平台源码+搭建说明
  6. 2022年2月Python小屋编程比赛获奖名单
  7. python切片长度_python的间隔切片技巧
  8. px、pt、em、rem 的区别
  9. 八类网线和七类网线的区别_七类网线和六类网线区别有哪些
  10. 嵌入式学习为什么要选择4412开发板
  11. 什么软件有html5游戏,多款好玩HTML5小游戏带你认识HTML5优势
  12. 2022年最新的Gmail用户统计数据
  13. VBA小模板:一个普通随机抽奖,需要模拟多轮用VBA怎么做?
  14. 输入电压=24V 输出电压=8V 1.5A TO-252-5 DCDC芯片推荐
  15. 如何切换笔记本键盘的功能键?
  16. 乌班图安装nginx
  17. Oracle之条件模糊匹配
  18. [教程] Android PHP 最佳实践视频教程
  19. C语言边沿触发函数,边沿触发在Verilog中又分为两种-Read.PPT
  20. el-select 远程搜索时 没有箭头图标如果需求说需要加上图标的话

热门文章

  1. 设计心理学1_日常的设计 读后感
  2. 原理图符号(原理图库)创建流程及注意事项
  3. Elite Software DuctSize v6.01.224 1CD(风管测算软件)
  4. TCPMP-interface相关文件函数解析 -about.c
  5. pdf转cad怎么弄_还在为cad转pdf烦恼吗?教你CAD批量转pdf
  6. 西安火车站迎来“大手术”
  7. win7下chm打不开
  8. java char类型 unicode字符集 utf-8字符编码
  9. 2022年智慧城市行业概括及现状
  10. 多卡聚合设备 广电视频传输解决方案