利用POI遍历出层级结构的excel表格
import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.util.CellRangeAddress; public class Util { /** * 获取 和并列 List 并截图有效参数 * @param lc * @return */ public static List<String> getMergedString(List <CellRangeAddress> lc){ //创建一个字符串链表 List<String> ls = new ArrayList<String>(); //遍历链表去掉多余的符号 for(CellRangeAddress cra : lc){ ls.add(cra.toString().substring(40).replaceAll("\\[", "").replaceAll("\\]", "")); } //将链表中的数据导进数组当中以便遍历比较 String[] ls1 = new String[ls.size()]; for(int i=0 ;i<ls1.length;i++){ ls1[i] = ls.get(i); } // for(String s :ls1){ // System.out.println(s); // } for(int i=0; i<ls1.length;i++){ for(int j=i;j<ls1.length;j++){ if(ls1[i].charAt(0)>ls1[j].charAt(0)){ String temp = ls1[i]; ls1[i] = ls1[j]; ls1[j] = temp; } } } for(int i=0; i<ls1.length;i++){ for(int j=i;j<ls1.length;j++){ if(Util.getTheRangeNumber(ls1[i])>Util.getTheRangeNumber(ls1[j])){ String temp = ls1[i]; ls1[i] = ls1[j]; ls1[j] = temp; } } } // for(String s :ls1){ // System.out.println(s); // } List<String> ls2 = new ArrayList<String>(); for(int i=0 ;i<ls1.length;i++){ ls2.add(ls1[i]); } return ls2; } public static int getTheRangeNumber(String s){ String str = s.substring(1); String[] strArr = str.split("\\:"); int i = Integer.parseInt(strArr[0]); return i; } public static int getTheRangeNumber2(String s){ String str = s.substring(1); String[] strArr = str.split("\\:"); String str2 = strArr[1].substring(1); int i = Integer.parseInt(str2); return i; } public static boolean isMerged(int i,int column,List<String> ls){ char c = (char) (column+65); List<String> ls1 = new ArrayList<String>(); for(String s :ls){ if(c==s.charAt(0)){ ls1.add(s); } } for(String s:ls1){ if(i>Util.getTheRangeNumber(s)&&i<Util.getTheRangeNumber2(s)){ return true; } } return false; } }
import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import org.apache.poi.ss.usermodel.Footer; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class Test { /** * @param args * @throws IOException */ //定义文件所在位置 public static String FILE_TO_BE_READ = "C:\\Users\\Administrator\\Desktop\\健康档案.xlsx"; //定义第几张sheet; public static int SHEET_NUM = 4; //最小行数 从小0开始 public static int FIRST_ROW; //最大行数 public static int LAST_ROW; public static void main(String[] args) throws IOException { //获取工作薄 XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(FILE_TO_BE_READ)); //获取工作页 XSSFSheet sheet = workbook.getSheetAt(SHEET_NUM); //获取单元格 XSSFCell s = sheet.getRow(1).getCell(0); //获取最小行数 FIRST_ROW = sheet.getFirstRowNum(); //获取最大行数 LAST_ROW = sheet.getLastRowNum(); StringBuilder sb = new StringBuilder(); List <CellRangeAddress> al =sheet.getMergedRegions(); List<String> ls = Util.getMergedString(al); // for(int i=0;i<366;i++){ // // XSSFCell s2 = sheet.getRow(i+1).getCell(0); // if(s2.toString().trim()!="") // // System.out.print(s2+","); // } String temp = "{"; for(int i = 0; i<ls.size();i++){ String s1= ls.get(i); // System.out.println(s1); int column = s1.charAt(0)-65; // System.out.println(column); for(int i1=Util.getTheRangeNumber(s1);i1<=Util.getTheRangeNumber2(s1);i1++){ // System.out.println(i1); // System.out.println(Util.getTheRangeNumber2(s1)); // System.out.println(column); XSSFCell s2 = sheet.getRow(i1-1).getCell(column); if(s2.getStringCellValue().trim()!=""){ System.out.println(s2.getStringCellValue()); // temp+=s2.getStringCellValue()+":"; // temp+="["; } XSSFCell s3 = sheet.getRow(i1-1).getCell(column+1); if(s3.getStringCellValue().trim()!=""&&!Util.isMerged(i1-1, column+1, ls)){ System.out.println(s3.getStringCellValue()); // temp+=s3.getStringCellValue()+":"; // temp+="}"; } } } // // System.out.println(Util.isMerged(60, 0, ls)); // // XSSFCell s2 = sheet.getRow(60).getCell(2); // System.out.println(s2.getStringCellValue()); // System.out.println(temp); } }