[]
本主题介绍使用 GcExcel 模板创建 Excel 报表所涉及的步骤。本文将演示如何创建一家公司的营销报告,假设该公司正在推出一系列新的智能手机。因此,需要为计划的营销活动创建 Excel 报告。报告详细列出了计划的发布事件、预算和费用。在本例中,用于绑定数据的数据源是自定义对象。模板布局在不同的 Excel 选项卡中创建,以生成多个报告。
以下步骤介绍如何使用模板创建Excel报表:
在工作表中创建模板布局。使用不同类型的字段定义营销报告的模板布局:
静态字段:定义模板布局中的静态字段,用户标记报告中,静态不变的值。例如,标题字段或模板标题,如营销报告、智能手机、事件等。
绑定字段:在小括号 {{ }} 中指定数据源绑定字段。例如,定义 {{ds.Records.FieldName}} 的绑定字段,其中ds是数据源的别名,在使用addDataSource方法的代码中指定。
表达式字段:指定字段中的函数,根据公式来计算值。
工作表名称:使用工作表创建4个模板布局,并命名为营销报告 (Marketing Report)、智能手机费用 (SmartPhone Expenses) 和启动事件 (Launch Events)。且最后一页的名字指定为 {{ds.Records.Country}},数据绑定字段将根据数据源中 “Country” 字段的值生成多个报告。
模板布局:营销报告
营销报告的布局模板如下图所示,其中使用的Group属性(G=Merge),会将智能手机与相应的记录进行分组,每个组显示一次。Merge值合并每个组的单元格。
模板布局:智能手机费用
在如下图的模板布局中,使用到两个模板属性:单元格扩展(E=H)和单元上下文(C=A3)
单元格扩展(E=H)将水平扩展 SmartPhone 字段。
单元上下文(C=A3)在生成报告时,Expense 属性将会以 A3 的值,即 SmartPhone 为上下文进行生成。
模板布局:启动事件
在如下图的模板布局中,使用到四个模板属性:范围(R=A3:B5)、排序(S=None)、单元格扩展(E=H)和分页符(PageBreak=True)
范围(R=A3:B5)属性用来指定范围内的备选上下文,当范围内的字段没有默认或者指定上下文时,会以当前字段作为上下文。
排序(S=None)表示不需要对数据进行排序。
单元格扩展(E=H)表示 Event 字段将水平展开。
分页符属性将添加垂直分页符和水平分页符。
模板布局: {{ds.Records.Country}}
根据Country字段数据量,会在报告中自动创建多个工作表。
在GcExcel中加载模板。
// 初始化工作簿 workbook
Workbook workbook = new Workbook();
// 加载模板文件 BudgetPlan_CustomObject.xlsx
String templateFile = "BudgetPlan_CustomObject.xlsx";。
workbook.open(templateFile);
``` BudgetVals dataSource = new BudgetVals();
{
dataSource.Records = new ArrayList<BudgetRecord>();
}
BudgetRecord record1 = new BudgetRecord();
record1.SmartPhone = "Apple iPhone 11";
record1.Event = "Phone Launch";
record1.Budget = 1000;
record1.Expense = 950;
record1.City = "Seattle";
record1.Country = "USA";
dataSource.Records.add(record1);
BudgetRecord record2 = new BudgetRecord();
record2.SmartPhone = "Apple iPhone 11";
record2.Event = "CEO Meet";
record2.Budget = 2000;
record2.Expense = 1850;
record2.City = "New York";
record2.Country = "USA";
dataSource.Records.add(record2);
BudgetRecord record3 = new BudgetRecord();
record3.SmartPhone = "Samsung Galaxy S10";
record3.Event = "CEO Meet";
record3.Budget = 1600;
record3.Expense = 1550;
record3.City = "Paris";
record3.Country = "France";
dataSource.Records.add(record3);
BudgetRecord record4 = new BudgetRecord();
record4.SmartPhone = "Apple iPhone XR";
record4.Event = "Phone Launch";
record4.Budget = 1800;
record4.Expense = 1650;
record4.City = "Cape Town";
record4.Country = "South Africa";
dataSource.Records.add(record4);
BudgetRecord record5 = new BudgetRecord();
record5.SmartPhone = "Samsung Galaxy S9";
record5.Event = "Phone Launch";
record5.Budget = 1500;
record5.Expense = 1350;
record5.City = "Paris";
record5.Country = "France";
dataSource.Records.add(record5);
BudgetRecord record6 = new BudgetRecord();
record6.SmartPhone = "Apple iPhone XR";
record6.Event = "CEO Meet";
record6.Budget = 1600;
record6.Expense = 1550;
record6.City = "New Jersey";
record6.Country = "USA";
dataSource.Records.add(record6);
BudgetRecord record7 = new BudgetRecord();
record7.SmartPhone = "Samsung Galaxy S9";
record7.Event = "CEO Meet";
record7.Budget = 1200;
record7.Expense = 1150;
record7.City = "Seattle";
record7.Country = "USA";
dataSource.Records.add(record7);
BudgetRecord record8 = new BudgetRecord();
record8.SmartPhone = "Samsung Galaxy S10";
record8.Event = "Phone Launch";
record8.Budget = 1100;
record8.Expense = 1070;
record8.City = "Durban";
record8.Country = "South Africa";
dataSource.Records.add(record8);
使用addDataSource方法在GcExcel中添加数据源。
// 给工作簿添加数据源,在这里 ds 是数据源的别名,数据源会被用来给模板填充数据。
// 因此模板中定义绑定字段时,数据源要用 ds 表示, 例如:{{ds.Records.SmartPhone}}
workbook.addDataSource("ds", dataSource);
使用ProcessTemplate方法执行模板。
// 调用 processTemplate 来给模板填充数据。
workbook.processTemplate();
保存最终报告。
// 保存为Excel
workbook.save("MarketingReport_CustomObject.xlsx");
营销报告的输出如下所示:
Excel报表:市场营销报表
Excel报表:智能手机费用
Excel报表:启动事件
Excel报表:国家(创建多个报告)
报表生成 "workbook.processTemplate()" 会让原始模板中的绑定字段被替换为实际的数据结果。
如果希望在报表生成的过程中,保留模板工作簿实例,可以使用 IWorkbook 接口中提供 generateReport 方法,该方法可以在处理完模板后,返回一个新的对象示例,用来保存Excel或导出为 PDF 。
此外,该方法还提供了一个重载,可以指定仅生成特定工作表为报表结果。
要使用 generateReport 方法生成报表,请参阅以下示例代码:
//处理模板并返回报表工作簿的实例
IWorkbook report = workbook.generateReport();
//处理模板并返回报表工作簿的实例
//IWorkbook report = workbook.generateReport(workbook.getWorksheets().get("Sales"));
要查看代码示例的实际效果,请参见 生成报表 。