(一) 前言
我们已经有很多写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 getCustomers() {
List result = new ArrayList();
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 result = new ArrayList();
// 打印空行
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})");
最终输出:
完整源代码: