关于excel多层级(树形)数据结构,提取成树形结构数据并导出到数据库

10 篇文章 0 订阅

在开发中遇到一个问题,就是有一张excel表中的数据时多层级的,不是普通一行一行的,而是,一行对应多行,多行之中的每一行在对应多行数据。形成树形结构:

如上图所示:我遇到的excel表的结构:

导入到数据库中,是有多个表组成的!我要实现把这些数据提取出来西港城一个树形而机构的List,然后转为json,导入数据库。

献上我的核心代码:

// 获取Excel内容
  public static List<?> getContent(Sheet sheet) {
    List<Map> list = new ArrayList<>();
    List<Map> cbfList = new ArrayList<>();
    List<Map> dkxxList = new ArrayList<>();
    List<Map> familyList = new ArrayList<>();
    List<Map> cbfList98=new ArrayList<>();
    List<Integer> cbfRowsIndex=new ArrayList<Integer>();
    Map map=new HashMap();
    List<String> titles=new ArrayList<>();
    // Excel数据总行数
    int rowCount = sheet.getLastRowNum();//getPhysicalNumberOfRows();
    //int columnCount = sheet.getRow(2).getPhysicalNumberOfCells();获取不为空的总列数 getPhysicalNumberOfCells()
    int columnCount =sheet.getRow(2).getLastCellNum() - sheet.getRow(2).getFirstCellNum();
    for(int x=0;x<sheet.getRow(2).getPhysicalNumberOfCells();x++){
      //titles.add(getValue(sheet.getRow(0).getCell(x)));
      if (StringUtils.isNotNull(getCellValue(sheet.getRow(2),x) != null))
      {
        String value =getCellValue(sheet.getRow(2),x).toString();
        System.out.println(value);
        titles.add(value);
      }
      else
      {
        titles.add(null);
      }
    }
    System.out.println("数据字段列表"+JsonUtil.beanToJson(titles));
    // 遍历首行前三列为发包方数据信息,固定第五行开始为数据行
    Row rowFbf =sheet.getRow(5);
    Map mapFbf=new HashMap();
    for (int j = 0; j <=2; j++) {
      Cell cell = rowFbf.getCell(j);
      if (cell != null && cell.getCellTypeEnum() != CellType.BLANK) {
        mapFbf.put(titles.get(j), getCellValue(rowFbf, j).toString());
      }
    }
    list.add(mapFbf);
    //下面开始进行正式的数据提取,嵌套lsit,Map形式展示数据
    for (int i = 5; i<=rowCount; i++){
      Row cbfRow=sheet.getRow(i);
      Map mapCbf=new HashMap();
      int cbfRowIndex = 0;
      for(int j=3;j<=8;j++){
        if(StringUtil.isNotEmpty(getCellValue(cbfRow,j).toString())){
          cbfRowIndex=i;
          mapCbf.put(titles.get(j),getCellValue(cbfRow,j).toString());
          mapCbf.put("cbfRowIndex",cbfRowIndex);
          //System.out.println(getCellValue(row,3).toString());
        }
      }
      //System.out.println("承包方数据的列数:"+titles.indexOf("gsshr"));
      for(int j=titles.indexOf("cbfdcrq");j<=titles.indexOf("gsshr");j++){
        //if(StringUtil.isNotEmpty(getCellValue(cbfRow,j).toString())){
          mapCbf.put(titles.get(j),getCellValue(cbfRow,j).toString());
        //}
      }
      //System.out.println(cbfids);
      //下面时提取98年承包方信息数据
      int cbf98index= titles.indexOf("yhzmc98");
      Map map98=new HashMap();
      for(int x=cbf98index;x<=columnCount;x++){
        if(StringUtil.isNotEmpty(getCellValue(cbfRow,x).toString())){
          mapCbf.put(titles.get(x),getCellValue(cbfRow,x).toString());
        }
      }
      //cbfList98.add(map98);
      int columnIndex=titles.indexOf("cbfmc");
      Map dkMap =new HashMap();
      for(int n=titles.indexOf("sfkbdk");n<=titles.indexOf("dkbdh");n++){
        //if(StringUtil.isNotEmpty(getCellValue(cbfRow, n).toString())){
        dkMap.put(titles.get(n), getCellValue(cbfRow, n).toString());
        dkMap.put("dkRowIndex",i);
        //}
      }
      dkxxList.add(dkMap);
      //System.out.println("第" + (i+1) + "条承包方地块数据:"+dkMap);
      Map familiyMap=new HashMap();
      for(int z=titles.indexOf("cyxm");z<=titles.indexOf("cybdrq");z++){
        familiyMap.put(titles.get(z),getCellValue(cbfRow,z));
        familiyMap.put("familyRowIndex",i);
      }
      familyList.add(familiyMap);
      //System.out.println("第" + (i+1) + "条家庭成员数据:"+familyList);
      if(mapCbf.get("elcbdkzs")!=null&&mapCbf.get("cbfRowIndex")!="0") {
        //System.out.println("承包方数据行:"+mapCbf.get("cbfRowIndex"));
        cbfList.add(mapCbf);
        //System.out.println("第" + (i+1) + "条承包方数据:" + JsonUtil.beanToJson(cbfList));
      }
    }
    //System.out.println("总行数:"+sheet.getLastRowNum());
    //System.out.println("承包方所有数据:"+cbfList);
    List<Map> allCbfList =cbfList;
    for(int y=0;y<cbfList.size();y++){
      List dkList=new ArrayList<>();
      List famList=new ArrayList<>();
      Map cbfMap=cbfList.get(y);
      //System.out.println("每个承包方的Map数据:"+cbfMap);
      int cbfRowNum=Integer.parseInt(String.valueOf(cbfMap.get("cbfRowIndex")));
      //System.out.println("数据:"+cbfRowNum);
      if(y==cbfList.size()-1){
        int allRowCount=sheet.getLastRowNum();
        for(int m=cbfRowNum-5;m<=allRowCount-5;m++){
          //System.out.println("承包方每一行的序号:"+m);
          //System.out.println("总行数"+allRowCount);
          int dkRowIndex=Integer.parseInt(String.valueOf(dkxxList.get(m).get("dkRowIndex")));
          if(m==(dkRowIndex-5)){
            if(StringUtil.isNotEmpty(dkxxList.get(m).get("dklb").toString())) {
              dkxxList.get(m).remove("dkRowIndex");
              dkList.add(dkxxList.get(m));
            }
            //dkList.addAll(dkxxList);
          }
          int familyRowIndex=Integer.parseInt(String.valueOf(familyList.get(m).get("familyRowIndex")));
          if(m==(familyRowIndex-5)){
            if(StringUtil.isNotEmpty(familyList.get(m).get("cyxm").toString())) {
              familyList.get(m).remove("familyRowIndex");
              famList.add(familyList.get(m));
            }
            //famList.addAll(familyList);
          }
        }
      }else{
        Map cbfMap2=cbfList.get(y+1);
        //System.out.println("本条数据:"+cbfMap);
        //System.out.println("下一条数据:"+cbfMap2);
        int cbfRowNum2=Integer.parseInt(String.valueOf(cbfMap2.get("cbfRowIndex")));
        for(int m=cbfRowNum-5;m<cbfRowNum2-5;m++){
          //System.out.println("承包方每一行的详细"+m);
          //System.out.println("所有地块信息的总数:"+dkxxList.size());
          int dkRowIndex=Integer.parseInt(String.valueOf(dkxxList.get(m).get("dkRowIndex")));
          //System.out.println("地块信息的行数:"+dkRowIndex);
          if(m==(dkRowIndex-5)){
            if(StringUtil.isNotEmpty(dkxxList.get(m).get("dklb").toString())) {
              dkxxList.get(m).remove("dkRowIndex");
              dkList.add(dkxxList.get(m));
            }
            //dkList.addAll(dkxxList);
            //System.out.println("map数据"+dkxxList.get(m));
          }
          int familyRowIndex=Integer.parseInt(String.valueOf(familyList.get(m).get("familyRowIndex")));
          if(m==(familyRowIndex-5)){
            if(StringUtil.isNotEmpty(familyList.get(m).get("cyxm").toString())){
              familyList.get(m).remove("familyRowIndex");
              famList.add(familyList.get(m));
            }
            //famList.addAll(familyList);
            //System.out.println("map数据"+famList);
          }
        }
      }
      //去除列表中为空的项
      //famList.removeAll(Collections.singleton(""));
      //dkList.removeAll(Collections.singleton(""));
      cbfMap.put("jtcyxx",famList);
      cbfMap.put("dkxx",dkList);
      cbfList.get(y).putAll(cbfMap);
      cbfList.get(y).remove("cbfRowIndex");
      System.out.println("承包方数据带家庭成员和地块信息:"+cbfMap);
    }
    //cbfList =getCbfList(cbfList,sheet,dkxxList,familyList);
    //去除隶属列表中为空的项
    cbfList.removeAll(Collections.singleton(null));
    map.put("allcbf",cbfList);
    list.add(map);
    //System.out.println("第" + i + "条承包方数据:" + JsonUtil.beanToJson(list));
    logger.info("所有数据:"+list);
    return list;
  }

首先,Java对excel的操作用有两种:jxl和poi,这里我用的是poi,所以我准备开始思路:第一行的前三列为第一层数据,然后及接着后面二层数据为承包方户主信息,第三层数据为家庭 成员信息还有地块信息。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
树形结构数据导出 Excel 可以使用 Java 的 POI 库来实现。POI 是一组用于处理 Microsoft Office 文档的 Java 库,包括 Excel、Word、PowerPoint 等文档格式。 具体实现如下: 1. 在 pom.xml 中添加以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建 Excel 文件并写入数据。这里以树形结构数据为例,假设已经从数据库中查询到了树形结构数据,可以使用递归的方式将数据写入 Excel 表格中。 ```java public void exportToExcel(List<Node> nodeList, String filePath) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); int rowIndex = 0; for (Node node : nodeList) { rowIndex = writeNodeToExcel(sheet, node, rowIndex, 0); } FileOutputStream outputStream = new FileOutputStream(filePath); workbook.write(outputStream); workbook.close(); } private int writeNodeToExcel(Sheet sheet, Node node, int rowIndex, int level) { Row row = sheet.createRow(rowIndex++); Cell cell = row.createCell(level); cell.setCellValue(node.getName()); for (Node child : node.getChildren()) { rowIndex = writeNodeToExcel(sheet, child, rowIndex, level + 1); } return rowIndex; } ``` 以上代码中,`Node` 表示树形结构中的一个节点,包含了节点名称和子节点列表。`exportToExcel` 方法接收一个节点列表和一个文件路径作为参数,将节点列表写入 Excel 文件中。`writeNodeToExcel` 方法递归地将节点和子节点写入 Excel 表格中,其中 `level` 参数表示节点的层级。 3. 调用 `exportToExcel` 方法将数据导出 Excel 文件。 ```java List<Node> nodeList = // 从数据库中查询树形结构数据 String filePath = "/path/to/excel.xlsx"; exportToExcel(nodeList, filePath); ``` 以上就是将树形结构数据导出 Excel 的方法,代码中省略了异常处理等细节,请根据实际情况进行补充。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值