Ⅰ、Scenario Description
In some cases, simple template definitions cannot meet business requirements, and more complex Excel template definitions are needed. The following describes how to define complex-type templates.
Ⅱ、Code Example:
java
@Model.model(TestApply.MODEL_MODEL)
@Model(displayName = "Test Application")
public class TestApply extends IdModel {
public static final String MODEL_MODEL = "top.TestApply";
@Field.String
@Field(displayName = "Addresser")
private String addresser;
@Field.String
@Field(displayName = "Entrusted Unit")
private String entrustedUnit;
@Field.String
@Field(displayName = "Payer")
private String payer;
@Field.String
@Field(displayName = "Payer Unit Address")
private String paymentUnitAdd;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(Ⅰ)Template Definition
java
package pro.shushi.pamirs.top.core.temp;
import org.springframework.stereotype.Component;
import pro.shushi.pamirs.file.api.builder.SheetDefinitionBuilder;
import pro.shushi.pamirs.file.api.builder.WorkbookDefinitionBuilder;
import pro.shushi.pamirs.file.api.enmu.ExcelAnalysisTypeEnum;
import pro.shushi.pamirs.file.api.enmu.ExcelDirectionEnum;
import pro.shushi.pamirs.file.api.enmu.ExcelHorizontalAlignmentEnum;
import pro.shushi.pamirs.file.api.model.ExcelWorkbookDefinition;
import pro.shushi.pamirs.file.api.util.ExcelHelper;
import pro.shushi.pamirs.file.api.util.ExcelTemplateInit;
import pro.shushi.pamirs.top.api.model.TestApply;
import java.util.Collections;
import java.util.List;
@Component
public class DemoTemplate implements ExcelTemplateInit {
public static final String TEMPLATE_NAME = "DemoTemplate";
@Override
public List<ExcelWorkbookDefinition> generator() {
WorkbookDefinitionBuilder builder = WorkbookDefinitionBuilder.newInstance(TestApply.MODEL_MODEL, TEMPLATE_NAME)
.setDisplayName("Test Demo");
DemoTemplate.createSheet(builder);
return Collections.singletonList(builder.build());
}
private static void createSheet(WorkbookDefinitionBuilder builder) {
SheetDefinitionBuilder sheetBuilder = builder.createSheet().setName("Test Demo");
buildBasicInfo(sheetBuilder);
}
private static void buildBasicInfo(SheetDefinitionBuilder builder) {
//A1:D8:Indicates the number of cells occupied by the header, and the range must be larger than the actual header row
BlockDefinitionBuilder mergeRange = builder.createBlock(TestApply.MODEL_MODEL, ExcelAnalysisTypeEnum.FIXED_HEADER, ExcelDirectionEnum.HORIZONTAL, "A1:D8")
//Preset rows
.setPresetNumber(10)
//Which cells to merge
.createMergeRange("A1:D1")
.createMergeRange("A2:D2")
.createMergeRange("A3:D3")
.createMergeRange("A4:A6")
.createMergeRange("B4:B6")
.createMergeRange("C4:C6")
.createMergeRange("D4:D5");
//createHeader creates a row, createCell creates a cell, setField specifies the parsing field, and setIsConfig specifies true to mark that this row is a value that needs to be parsed
mergeRange.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle()).setIsConfig(Boolean.TRUE)
.createCell().setField("addresser").setStyleBuilder(ExcelHelper.createDefaultStyle().setWidth(6000)).and()
.createCell().setField("entrustedUnit").and()
.createCell().setField("payer").and()
.createCell().setField("paymentUnitAdd").and()
.and()
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Demo").and()
.createCell().and()
.createCell().and()
.createCell().and()
.and()
//Since this row is merged into one cell, other values can be left unset
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Effective Amount").and()
.createCell().and()
.createCell().and()
.createCell().and()
.and()
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.RIGHT))
.createCell().setValue("Amount Unit: RMB").and()
.createCell().and()
.createCell().and()
.createCell().and()
.and()
//EasyExcel cannot parse empty rows, so values are written here. Since the above uses createMergeRange to merge cells and the D column is split, fill in the values of each cell to make the merged cells the same.
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Addresser").and()
.createCell().setValue("Entrusted Unit").and()
.createCell().setValue("Payer").and()
.createCell().setValue("Address").and()
.and()
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Addresser").and()
.createCell().setValue("Entrusted Unit").and()
.createCell().setValue("Payer").and()
.createCell().setValue("Address").and()
.and()
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Addresser").and()
.createCell().setValue("Entrusted Unit").and()
.createCell().setValue("Payer").and()
.createCell().setValue("Payer Unit Address").and()
.and()
.createHeader().setStyleBuilder(ExcelHelper.createDefaultStyle(typeface -> typeface.setBold(Boolean.TRUE)).setHorizontalAlignment(ExcelHorizontalAlignmentEnum.CENTER))
.createCell().setValue("Total").and()
.createCell().and()
.createCell().and()
.createCell();
}
}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
104
105
106
107
108
109
110
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
104
105
106
107
108
109
110
Note:
Chained calls should not be too long. If they are too long, you can use parameters to承接 (intercept), otherwise it may cause a stack overflow during compilation.
