讲解视频:Nop入门:使用NopReport导出Excel图表_哔哩哔哩_bilibili
Nop平台内置了一个非常精简的中国式报表引擎NopReport,它可以实现商业报表引擎如FineReport和润乾报表的核心功能。NopReport很巧妙的利用Excel单元格的批注机制来存放扩展信息,可以直接使用Excel模板来作为报表模板,这样大大简化了报表制作过程,并且可以复用客户已有的各种业务表格。
在实现层面,NopReport没有使用Apache POI库,而是选择了直接使用流式接口解析Office XML文件,解析时使用的也不是Java标准的XML解析器,而是自行实现的XNodeParser(速度比标准解析器快2倍)。NopReport是一个非常精简高效的实现,核心代码只有3000多行,却可以达到比商业报表引擎的更好的性能和更好的可扩展性。
本文将介绍NopReport的基本使用方式,以及如何在Excel报表模板中配置图表显示。
NopReport采用了润乾报表发明的层次坐标展开算法,可以通过父子单元格关联展开实现非常复杂的报表逻辑。具体参见非线性中国式报表引擎NopReport源码解析
配置展开单元格:
expandType=r
ds=ds1
field=product
expandType=r表示单元格向下展开,产生多行输出。这个单元格右侧的所有单元格缺省情况下都是它的子格。父格展开后子格自动被复制。以上配置表示按照ds1数据集(列表格式)的product字段进行分组汇总,并为每个分组产生一个输出结果。在子单元格上只要配置field属性就可以按照该属性值进行取值并输出。
NopReport支持导出Excel的时候生成与数据关联的图表。具体做法同样是在备注文本中增加扩展信息。
右键点击图表,选择"编辑可选文字",输入以下配置:

销售数据柱状图
----
----
seriesDataCellRefExpr=xptRt.buildCellRef('Sheet1!B3', seriesModel.index,0,1,3)
seriesTestExpr=seriesModel.index < 2
seriesNameExpr=xptRt.ds('ds1').group('product')[seriesModel.index].key+'Series'
上述配置效果:
Sheet1!B3:D3publicclassTestReportChartextendsBaseTestCase{
@Test
publicvoidtestBarChart(){
IReportEngine reportEngine = newReportEngine();
ExcelWorkbook workbook = reportEngine.getXptModel("/nop/report/demo/test-bar-chart.xpt.xlsx");
ITemplateOutput output = reportEngine.getRendererForXptModel(workbook, "xlsx");
IEvalScope scope = XLang.newEvalScope();
output.generateToFile(getTargetFile("result-bar-chart.xlsx"),scope);
}
}
可以通过scope向报表引擎传递变量,也可以在报表模板的【展开前】配置中通过XScript语言来定义数据集。
可在“----”之后配置以下常用表达式(更多项见 schema:/nop/schema/excel/chart.xdef 的
一个重要的设计原则是:模板需要预置最多的系列数量。运行时不会创建新的系列,只会基于模板中已有的系列进行过滤和配置。
NopReport图表功能支持丰富的图表类型,以下是一些常用图表的示例:










