最近,在开发中,需要导出数据到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
分享到:
相关推荐
VC对磁盘文件遍历搜索的递归算法和非递归算法 里面的文档是讲解递归算法和递归算法的 里面还有一个Vc工程文件,是我自己写的,关于非递归算法,其实里面那些被注释掉的部分是递归算法,大家仔细看看就知道了,
在JSP中使用递归算法生成目录树 计算机工程与设计2005年第1期
.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法
使用递归算法在指定目录下查找文件(2KB)
递归算法详解递归算法详解递归算法详解递归算法详解
用简短的JAVA代码使用递归算法生成随机不重复的双色球号码
使用递归算法,把"C:\Windows\AppPatch"这个目录中的所有文件(包括子文件夹中的文件)的名称和大小,列出到界面或文本中。
使用递归算法打印目录下所有的文件,递归也是帮助我们在编程时解决一些数学上的问题,一般经常解决的就是阶乘问题!
5!递归算法和非递归算法,面试专用,适合新手
18.递归算法与递归算法应用.ppt
C#递归查找文件,返回地址的集合,用于对文件操作时使用
编写递归算法,计算二叉树中叶子结点的数目
使用递归算法在指定目录下查找文件
快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...
递归算法转为非递归算法。方法、过程,用栈的原理
acm递归算法总结acm递归算法总结!!!!!!!!!!!!!!!!!!!!!!!
用非递归解决八皇后的问题,是经典的非递归算法,学习数据结构中很有用
主要介绍了JavaScript递归算法生成树形菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
折半查找的递归算法,非常实用,可以实现的C语言程序
快速选择非递归与递归算法实现