本文主要分享了Java实现生成Excel树形表头完整代码示例,没有什么好解释的,直接看看代码过程。
源数据格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
String[] targetNames = {
"指标名称" ,
"单位" ,
"xx_yy1" ,
"xx_yy2_zz1" ,
"xx_yy2_zz2" ,
"2017年5月_主营业务收入_累计" , "2017年5月_主营业务收入_同比" ,
"2017年5月_主营业务收入_本月" , "2017年5月_主营业务收入_环比" ,
"2017年5月_利润_累计" , "2017年5月_利润_同比" , "2017年5月_利润_本月" , "2017年5月_利润_环比" ,
"2017年6月_主营业务收入_累计" , "2017年6月_主营业务收入_同比" ,
"2017年6月_主营业务收入_本月" , "2017年6月_主营业务收入_环比" ,
"2017年6月_利润_累计" , "2017年6月_利润_同比" , "2017年6月_利润_本月" , "2017年6月_利润_环比"
};
|
生成如下Excel:
第一行不属于树形表头。
代码
SplitCell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package com.zzj.excel;
public class SplitCell {
private String key;
private String parentKey;
private String value;
private int columnIndex;
private int rowIndex;
public SplitCell() {
}
public SplitCell(String key, String value) {
this .key = key;
this .value = value;
}
public SplitCell(String key, String parentKey, String value,
int columnIndex, int rowIndex) {
this .key = key;
this .parentKey = parentKey;
this .value = value;
this .columnIndex = columnIndex;
this .rowIndex = rowIndex;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this .key = key;
}
public String getParentKey() {
return parentKey;
}
public void setParentKey(String parentKey) {
this .parentKey = parentKey;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this .value = value;
}
public int getColumnIndex() {
return columnIndex;
}
public void setColumnIndex( int columnIndex) {
this .columnIndex = columnIndex;
}
public int getRowIndex() {
return rowIndex;
}
public void setRowIndex( int rowIndex) {
this .rowIndex = rowIndex;
}
@Override
public String toString() {
return "CellContent [key=" + key + ", parentKey=" + parentKey + ", value=" + value + ", columnIndex="
+ columnIndex + ", rowIndex=" + rowIndex + "]" ;
}
}
|
MergedCell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package com.zzj.excel;
public class MergedCell {
private String key;
private String parentKey;
private String value;
private int startC;
private int endC;
private int startR;
private int endR;
private Boolean leaf = true ;
// 默认叶子节点
public String getKey() {
return key;
}
public void setKey(String key) {
this .key = key;
}
public String getParentKey() {
return parentKey;
}
public void setParentKey(String parentKey) {
this .parentKey = parentKey;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this .value = value;
}
public int getStartC() {
return startC;
}
public void setStartC( int startC) {
this .startC = startC;
}
public int getEndC() {
return endC;
}
public void setEndC( int endC) {
this .endC = endC;
}
/**
* 单元格合并结束列索引自增
*/
public void incEndC(){
this .endC++;
}
public int getStartR() {
return startR;
}
public void setStartR( int startR) {
this .startR = startR;
}
public int getEndR() {
return endR;
}
public void setEndR( int endR) {
this .endR = endR;
}
public Boolean isLeaf() {
return leaf;
}
public void setLeaf(Boolean leaf) {
this .leaf = leaf;
}
@Override
public String toString() {
return "CellInfo [key=" + key + ", parentKey=" + parentKey + ", value=" + value + ", startC=" + startC
+ ", endC=" + endC + ", startR=" + startR + ", endR=" + endR + ", leaf=" + leaf + "]" ;
}
}
|
CellTransformer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package com.zzj.excel;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class CellTransformer {
private final List<SplitCell> cellContents;
private final int firstRowIndex;
private final int rowSize;
private Map<String, MergedCell> cellInfoMap = new LinkedHashMap<String, MergedCell>();
public CellTransformer(List<SplitCell> cellContents, int firstRowIndex, int rowSize) {
this .cellContents = cellContents;
this .firstRowIndex = firstRowIndex;
this .rowSize = rowSize;
}
public Map<String, MergedCell> transform(){
cellInfoMap.clear();
for (SplitCell cellContent : cellContents) {
MergedCell cellInfo = cellInfoMap.get(cellContent.getKey());
if (cellInfo == null ) {
cellInfo = convertToCellInfo(cellContent);
cellInfoMap.put(cellInfo.getKey(), cellInfo);
} else {
/* 单元格出现多少次,则该单元格就合并多少列 */
cellInfo.incEndC();
// 列结束索引自增(用于列合并)
cellInfo.setLeaf( false );
// 只要重复出现,则为非叶子节点
}
}
// 行合并
for (MergedCell cellInfo : cellInfoMap.values()) {
if (cellInfo.isLeaf()) {
// 如果为叶子节点,则一定合并到最后一行
cellInfo.setEndR(firstRowIndex + rowSize - 1 );
}
}
return cellInfoMap;
}
private MergedCell convertToCellInfo(SplitCell cellContent){
MergedCell cellInfo = new MergedCell();
cellInfo.setKey(cellContent.getKey());
cellInfo.setParentKey(cellContent.getParentKey());
cellInfo.setValue(cellContent.getValue());
cellInfo.setStartC(cellContent.getColumnIndex());
// 结束索引默认为开始索引
cellInfo.setEndC(cellContent.getColumnIndex());
cellInfo.setStartR(cellContent.getRowIndex());
// 结束索引默认为开始索引
cellInfo.setEndR(cellContent.getRowIndex());
return cellInfo;
}
}
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package com.zzj.excel;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import jxl.Workbook;
import jxl.format.CellFormat;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class Main {
private static final String SEPARATOR = "_" ;
public static void main(String[] args) throws Exception {
String[] targetNames = {
"指标名称" ,
"单位" ,
"xx_yy1" ,
"xx_yy2_zz1" ,
"xx_yy2_zz2" ,
"2017年5月_主营业务收入_累计" , "2017年5月_主营业务收入_同比" ,
"2017年5月_主营业务收入_本月" , "2017年5月_主营业务收入_环比" ,
"2017年5月_利润_累计" , "2017年5月_利润_同比" , "2017年5月_利润_本月" , "2017年5月_利润_环比" ,
"2017年6月_主营业务收入_累计" , "2017年6月_主营业务收入_同比" ,
"2017年6月_主营业务收入_本月" , "2017年6月_主营业务收入_环比" ,
"2017年6月_利润_累计" , "2017年6月_利润_同比" , "2017年6月_利润_本月" , "2017年6月_利润_环比"
};
// 设第一行不属于树形表头
String[] extraNames = new String[targetNames.length];
for ( int i = 0 ; i < extraNames.length; i++) {
extraNames[i] = "extra" + i;
}
final int firstTreeRowIndex = 1 ;
int rowSize = getRowSize(targetNames);
List<SplitCell> cellContents = new ArrayList<>();
for ( int i = 0 ; i < targetNames.length; i++) {
String[] values = targetNames[i].split(SEPARATOR);
for ( int j = 0 ; j < values.length; j++) {
String value = values[j];
String key = getKey(values, j);
String parentKey = getParentKey(values, j);
SplitCell cellContent = new SplitCell(key, parentKey, value,
i, j + firstTreeRowIndex);
cellContents.add(cellContent);
}
}
WritableWorkbook workbook = Workbook.createWorkbook( new File( "F:\\template.xls" ));
CellFormat cellFormat = getCellFormat();
WritableSheet sheet = workbook.createSheet( "template" , 0 );
// 第一行
for ( int i = 0 ; i < extraNames.length; i++) {
Label label = new Label(i, 0 , extraNames[i], cellFormat);
sheet.addCell(label);
}
// 树形表头
CellTransformer cellInfoManager = new CellTransformer(cellContents, firstTreeRowIndex, rowSize);
Map<String, MergedCell> map = cellInfoManager.transform();
for (MergedCell cellInfo : map.values()) {
Label label = new Label(cellInfo.getStartC(),
cellInfo.getStartR(), cellInfo.getValue(), cellFormat);
if (cellInfo.getStartC() != cellInfo.getEndC()
|| cellInfo.getStartR() != cellInfo.getEndR()) {
sheet.mergeCells(cellInfo.getStartC(), cellInfo.getStartR(),
cellInfo.getEndC(), cellInfo.getEndR());
}
sheet.addCell(label);
}
workbook.write();
workbook.close();
System.out.println( "导出成功!" );
}
private static CellFormat getCellFormat() throws Exception{
WritableFont font = new WritableFont(WritableFont.ARIAL, 10 , WritableFont.BOLD);
WritableCellFormat cellFormat = new WritableCellFormat();
cellFormat.setFont(font);
cellFormat.setAlignment(jxl.format.Alignment.CENTRE);
cellFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
cellFormat.setWrap( false );
return cellFormat;
}
private static int getRowSize(String[] targetNames) {
int rowSize = 0 ;
for (String t : targetNames) {
rowSize = Math.max(rowSize, t.split(SEPARATOR).length);
}
return rowSize;
}
private static String getKey(String[] values, int index){
StringBuffer sb = new StringBuffer();
for ( int i = 0 ; i < (index + 1 ); i++) {
sb.append(values[i] + SEPARATOR);
}
sb.deleteCharAt(sb.length() - 1 );
return sb.toString();
}
private static String getParentKey(String[] values, int index){
if (index == 0 ) {
return null ;
}
return getKey(values, index - 1 );
}
}
|
总结
以上就是本文关于Java实现生成Excel树形表头完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/zhangzeyuaaa/article/details/74906579