快速报表开发框架

(一) 前言
我们已经有很多写excel报表框架,很有名气象POI、JXL等。但是,写报表依然需要写很多代码才能生成一张复杂的报表。那么,有没有快速简单的办法呢?例如几行代码搞定一张报表输出?例如5行代码输出一张报表:
OutputHelper outputHelper = OutputHelperFactory.getOutputHelper(templateFileName, templateNames);
BeanMapping mapping = outputHelper.getTemplateManager().createBeanMappingFromExcel("template", "Customer",Customer.class);
outputHelper.writeData("Output", new InitCustomerData().getCustomers(), mapping);
outputHelper.getCurrentWorkbook().clearTemplateSheet(templateNames);
outputHelper.getCurrentWorkbook().save("c://fasterreports/BeanHorizontalOutput.xls");

那去这里看看吧:http://sourceforge.net/projects/fasterexcel

(二) 快速开发案例
1) 输出一个简单bean的列表
 步骤1:定义类

public class Customer {

private static final long serialVersionUID = 0;
private String id;
private String code;
private String name;

public String getId() {
return id;
}

public String getCode() {
return code;
}

public String getName() {
return name;
}

public void setId(String id) {
this.id = id;
}

public void setCode(String code) {
this.code = code;
}

public void setName(String name) {
this.name = name;
}


}

 步骤2:为这个输出创建一个excel模板
String fileName = "c://fasterreports/QuickStartTemplate.xls";
TemplateManager templateManager = new TemplateManager();
templateManager.createBeanTemplateStyle(fileName, Customer.class);

输出的QuickStartTemplate.xls文件的Customer单元格:
code style styleSample
email style styleSample
entityAction style styleSample
fax style styleSample
id style styleSample
name style styleSample
你可以调整需要输出的顺序,删除一些不需要输出的字段,例如id/ entityAction是报表不需要的,还可以在styleSample调整输出的字体颜色、大小或者是其他自定义的样式。

输出的QuickStartTemplate.xls文件的template单元格:
DefaultApplyStyleBy variable byFieldName
DefaultBeanWriteDirection variable VERTICAL
DefaultStartRowNumber variable 1
DefaultStartColumnNumber variable 0
DefaultBeanWriteDirection表示打印方向是水平输出还是垂直方向输出;
DefaultStartRowNumber表示从哪一行开始输出;
DefaultStartColumnNumber表示从哪一列开始输出;
输出样式文件参考:
调整后的样式文件参考:

 步骤3:获得数据集

public List<Customer> getCustomers() {

List<Customer> result = new ArrayList<Customer>();

for (int i = 1; i < 100; i++) {
Customer customer = new Customer();
customer.setId("id" + i);
customer.setCode("code" + i);
customer.setName("name" + i);
customer.setEmail("email" + i);
customer.setFax("fax" + i);
result.add(customer);
}

return result;
}
在真实的项目中,这个部分通过查询数据库来获得。

 步骤4:输出数据集
// the template excel,which is create by step1.
String templateFileName = "c://fasterreports/QuickStartTemplate.xls";
String[] templateNames = new String[]{"template", "Customer"};

try {
// two template sheet:"template","Customer"
OutputHelper outputHelper = OutputHelperFactory.getOutputHelper(
templateFileName, templateNames);

BeanMapping mapping = outputHelper.getTemplateManager()
.createBeanMappingFromExcel("template", "Customer",
OutputCustomerReport.class);
outputHelper.writeData("Output", new InitCustomerData()
.getCustomers(), mapping);
outputHelper.getCurrentWorkbook().clearTemplateSheet(templateNames);
outputHelper.getCurrentWorkbook().save(
"c://fasterreports/QuickStartOutput.xls");
} catch (IOException e) {
e.printStackTrace();
}

输出结果:
完整的源代码:


2) 输出计算公式

 输出(字段A-字段B),公式跟随行的变化而变化
BeanMapping normalLineBeanMapping = this.templateManager.createBeanMappingFromExcel("template", "Customer",Customer.class);
normalLineBeanMapping.add("profit", new FormulaFieldMapping());
normalLineBeanMapping.getElementMapping("profit").setColumnNumber(7);
normalLineBeanMapping.getElementMapping("profit").setFormula( "{sale}-{cost}");
输出结果:=F3-G3(其中sale属性是在F列,cost属性在G列)
解析:BeanMapping是Customer数据集到excel单元格的样式映射类,定义了Customer类有哪些属性需要输出,输出的方向和每个属性对应到excel单元的哪一行或者是哪一列。
normalLineBeanMapping.add("profit", new FormulaFieldMapping())代码段创建了一个计算列,之后配置了它在excel单元的第7列开始输出。

 输出汇总SUM({字段名})

MergedRegionMapping faxRegionMapping = new MergedRegionMapping();
faxRegionMapping.addOnMergedRegion(new AppendTotalLineListener(this.outputCustomerReport));
normalLineBeanMapping.add("fax", faxRegionMapping);
解析:MergedRegionMapping是合并区域样式映射类,如果fax字段的值和上一行的值不同时,自动触发一个MergedRegion事件。AppendTotalLineListener 类实现了MergedRegionListener接口并接受一个MergedRegion事件。
AppendTotalLineListener 类最终调用了如下代码来增加一个汇总行:
List<Customer> result = new ArrayList<Customer>();
// 打印空行
Customer nullReport = new Customer();
result.add(nullReport);
outputHelper.appendDataForBeanStyle(outputContext, nullReport);
该汇总行使用了另外一个样式映射类:
BeanMapping totalLineBeanMapping = this.templateManager.createBeanMappingFromExcel("template", "TotalStyleCustomer",Customer.class);
totalLineBeanMapping.getElementMappings().remove("sale");
totalLineBeanMapping.add("sale", new SUMFormulaFieldMapping());
totalLineBeanMapping.getElementMapping("sale").setFormula(
"SUM({sale})");

最终输出:
完整源代码:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值