`
李宏喜
  • 浏览: 119466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

灵活使用递归算法,生成Excel文件中的复合表头

阅读更多
    最近,在开发中,需要导出数据到excel文件,文件的表头的格式是不一致的。有复合表头,也有单表头,那么如何灵活地生成excel文件中的复合表头。



首先有一个JSON字符串格式的字段描述,如下所示:
       var columnDefs = [{
                key:"unit",
                label:"单位"
            },{
                key:"form",
                label:"货物"
            },{
                key:"putin",
                label:"2011年03月",
                children:[{
                        key:"shout",
                        label:"buy"
                },{
                        key:"sale",
                        label:"销售"
                },{
                        key:"rate",
                        label:"百分比(%)"
                }]
            },{
                key:"average",
                label:"平均(%)"
            }];
 
    如果表的宾栏中有子栏,children是不为空的。自己写的代码,是在项目中写的,比较匆忙,还有提高的余地:

  
   private int insertHeader(HSSFSheet sheet, List columns, 
                 int rowIndex, HSSFWorkbook wb) {
        HSSFCellStyle cellStyle = this.getCellStyle(wb);
        cellStyle.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFRow row = sheet.createRow(rowIndex);
        //横向的单元格的列数,这里设置一个方法外的变量,初始化为零
        nextCellIndex  = 0;
        int rowNumber = setSubCellValue(sheet, rowIndex, 
                             cellStyle, row, nextCellIndex, columns);
        //设置每一行的自适应单元格内容的长度
        setColumnWidth(sheet, rowNumber);
        //返回生成表头之后的行数
        return rowNumber;
    }
    private int setSubCellValue(HSSFSheet sheet, 
            int rowIndex,    HSSFCellStyle cellStyle, 
            HSSFRow row, int nextCellIndex, List columns) {
        HSSFRow nextRow = null;
        //遍历json格式的字段描述,并横向生成单元格
        for (int i = 0; i < columns.size(); i++) {
            JSONObject column = (JSONObject) columns.get(i);
            JSONArray children = (JSONArray) column.get("children");
            if (children != null) {
                   //设置父表格,并返回下一个单元格的列数
                   nextCellIndex = setParentCellValue(sheet, cellStyle, row, 
                   nextCellIndex, column, children.size());
                   nextCellIndex = nextCellIndex + 1;
                   //因为存在子表格,所以生成下一行
                   if (nextRow == null) {
                       nextRow = sheet.createRow(++rowIndex);
                   }
                   //使子单元格的位置,回退的到起始位置
                   int subCellStartPosition = nextCellIndex - children.size();
                   //递归生成子单元格,这里参数可以简化
                   setSubCellValue(sheet, rowIndex, 
                 cellStyle, nextRow, subCellStartPosition, children);
               } else {
                   //如果不是复合表头,直接生成并设置单元格
                   nextCellIndex = setCellValue(sheet, cellStyle, row, nextCellIndex, column);
                   ++nextCellIndex;
            }
        }
        //跨行的单元格合并
        mergeRowByColumn(sheet, rowIndex, columns, nextRow, cellStyle);
        //递归,生成这一行的单元格,并返回当前行数
        return rowIndex;
    }
    //设置复合单元格的父表格
    private int setParentCellValue(HSSFSheet sheet, HSSFCellStyle cellStyle, HSSFRow row, int cellIndex, 
        JSONObject field, int childrenSize) {
        cellIndex = setCellValue(sheet,cellStyle, row, cellIndex, field);
        int columnFrom = cellIndex;
        int columnTo = columnFrom + childrenSize - 1;
        createMergeCell(sheet, row, cellStyle, columnFrom, columnTo);
        return columnTo;
    }
    private int setCellValue(HSSFSheet sheet, HSSFCellStyle cellStyle, HSSFRow row, int cellIndex, JSONObject column) {
        HSSFCell subCell = row.createCell(cellIndex);
        subCell.setCellStyle(cellStyle);
        subCell.setCellValue(column.get("label").toString());
        return cellIndex;
    } 

    
  • 大小: 22.6 KB
0
2
分享到:
评论
3 楼 happwang 2015-09-23  
能否分一份完整的。谢谢。1039580989@163.com
2 楼 sunnycyl 2012-08-02  
你好,能把完整的代码给我发一下吗,最近要用这些,邮箱sunnycyl666@163.com,感激不尽!
1 楼 freeman2012 2011-09-30  
怎么还差这几方法没有写出来的呢?

是版权的问题啊?

完整一点嘛!哥们!

相关推荐

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在文件遍历中,递归算法通常从根目录开始,检查每个目录中的文件,如果文件不是目标,则继续进入子目录进行相同的操作,直到找到目标文件或遍历完整个文件系统。递归算法简洁明了,易于理解,但可能导致大量的函数...

    使用递归算法在指定目录下查找文件(2KB)

    在IT领域,递归算法是一种常见且强大的工具,尤其在处理层次结构问题时,如在文件系统中查找特定文件。本话题将详细讲解如何利用递归算法在指定目录及其子目录下查找大小为2KB的文件,同时也会涉及到一些相关的编程...

    5!递归算法和非递归算法

    在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 递归算法是一种直接或间接...

    在JSP中使用递归算法生成目录树

    本文将介绍一种使用递归算法在JSP中生成目录树的方法,结合数据库技术,使得动态生成目录树变得可行。 1. 基本思路: 生成目录树的关键在于理解目录结构的层次关系,这通常可以通过递归算法来实现。递归是一种解决...

    使用递归算法打印目录下所有的文件

    在这个场景中,我们要讨论如何使用递归算法来打印一个目录及其所有子目录下的所有文件。 首先,我们需要理解递归的基本原理。递归由两个主要部分组成:基本情况(base case)和递归情况(recursive case)。基本...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    程序2_delphi_milemut_递归算法_

    delphi_milemut_递归算法”是使用Delphi编程语言实现的一个应用,旨在通过递归方法列出指定目录“C:\Windows\AppPatch”及其所有子目录下的文件名和大小,并将这些信息显示在用户界面或者保存到文本文件中。...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

    abap简单递归算法

    本文将深入探讨一个ABAP中的简单递归算法——计算阶乘,并通过SE38报表的形式进行展示。 #### 二、递归算法简介 递归算法是一种通过调用自身来解决问题的方法。它通常用于解决那些可以通过子问题的解来构建整个...

    C语言编写去掉excel文件中的表头

    6. **批量处理**:要处理同一文件夹下的所有Excel文件,可以使用文件遍历算法,如递归遍历目录,找到所有`.xls`或`.xlsx`文件,然后对每个文件应用上述步骤。 7. **目录操作**:在C语言中,可以使用`opendir`, `...

    pb中使用递归算法实现树的遍历

    pb中使用递归算法实现树的遍历

    使用递归算法在指定目录下查找文件

    本文将深入探讨如何使用递归算法在指定目录下查找文件,这在软件开发、系统管理以及数据分析等场景中都十分常见。递归算法是一种以自身为解决手段的方法,通过重复调用自身来解决问题或计算数据。在文件系统中,递归...

    Java递归算法构造JSON树形结构

    Java 递归算法构造 JSON 树形结构是指通过 Java 语言使用递归算法将数据库中的菜单表构建成树形的 JSON 格式发送给第三方。这种方法可以将复杂的树形结构数据转换成易于理解和处理的 JSON 格式。 在 Java 中,使用...

    简单的递归算法 随机生成不重复的双色球号码

    用简短的JAVA代码使用递归算法生成随机不重复的双色球号码

    程序设计中递归算法

    ### 递归算法在程序设计中的应用 #### 一、递归的概念与本质 递归是一种重要的编程思想,在计算机科学和数学领域都有广泛的应用。它指的是一个过程或函数直接或间接地调用自身来解决问题的方法。递归的核心在于将...

    递归算法与循环算法的分析

    在二分查找算法中,也可以选择使用递归算法或循环算法。递归算法的时间复杂度为 O(logn),循环算法的时间复杂度也为 O(logn)。但是,循环算法的空间复杂度较低,且更容易实现。 在选择算法时,需要根据对效率要求的...

    使用C++,请给出此题的递归算法及非递归算法。

    在编程领域,递归算法和非递归算法是两种常见的解决问题的方法。递归算法是通过函数或...在文件`main.cpp`中,你可以找到具体问题的递归和非递归实现示例,而`描述.docx`可能包含更多关于这个问题的细节和背景信息。

    koch曲线的递归算法

    递归算法的关键在于明确递归基(基本情况,不需要再递归的情况)和递归步骤(如何将问题分解成更小的相同问题)。在Koch曲线中,递归基是原始的直线段,而递归步骤是将线段替换为四个更小的线段。 总之,Koch曲线是...

    汉诺塔问题的非递归算法

    非递归算法的基本思想是通过循环使用两个步骤来依次移动圆盘,而非递归调用。第一个步骤是针对最少的圆盘进行操作,保持最小圆盘在最上方,以便于后续的移动。第二个步骤则是重复上述过程,逐步将其他圆盘移动到目标...

Global site tag (gtag.js) - Google Analytics