Nop入门:使用Excel模板生成包含图表的报表

作者:canonical_entropy日期:2025/12/30

讲解视频:Nop入门:使用NopReport导出Excel图表_哔哩哔哩_bilibili

Nop平台内置了一个非常精简的中国式报表引擎NopReport,它可以实现商业报表引擎如FineReport和润乾报表的核心功能。NopReport很巧妙的利用Excel单元格的批注机制来存放扩展信息,可以直接使用Excel模板来作为报表模板,这样大大简化了报表制作过程,并且可以复用客户已有的各种业务表格。

在实现层面,NopReport没有使用Apache POI库,而是选择了直接使用流式接口解析Office XML文件,解析时使用的也不是Java标准的XML解析器,而是自行实现的XNodeParser(速度比标准解析器快2倍)。NopReport是一个非常精简高效的实现,核心代码只有3000多行,却可以达到比商业报表引擎的更好的性能和更好的可扩展性。

本文将介绍NopReport的基本使用方式,以及如何在Excel报表模板中配置图表显示。

1. 配置报表展开逻辑

NopReport采用了润乾报表发明的层次坐标展开算法,可以通过父子单元格关联展开实现非常复杂的报表逻辑。具体参见非线性中国式报表引擎NopReport源码解析

配置展开单元格:

  1. 右键单元格插入批注
  2. 在批注中输入配置参数,每行一个参数:
1expandType=r
2ds=ds1
3field=product
4
  • expandType=r表示单元格向下展开,产生多行输出。这个单元格右侧的所有单元格缺省情况下都是它的子格。父格展开后子格自动被复制。
  • ds和field配置指定了从哪个数据集的哪个字段取值。展开单元格中配置field会自动按照该字段进行分组。

以上配置表示按照ds1数据集(列表格式)的product字段进行分组汇总,并为每个分组产生一个输出结果。在子单元格上只要配置field属性就可以按照该属性值进行取值并输出。

2. 配置图表动态绑定

NopReport支持导出Excel的时候生成与数据关联的图表。具体做法同样是在备注文本中增加扩展信息。

右键点击图表,选择"编辑可选文字",输入以下配置:

图表配置界面

1销售数据柱状图
2----
3----
4seriesDataCellRefExpr=xptRt.buildCellRef('Sheet1!B3', seriesModel.index,0,1,3)
5seriesTestExpr=seriesModel.index < 2
6seriesNameExpr=xptRt.ds('ds1').group('product')[seriesModel.index].key+'Series'
7

上述配置效果:

  • 动态产生单元格引用表达式,比如生成 Sheet1!B3:D3
  • 仅生成 index 为 0、1 的两个系列
  • 图表名称使用动态计算得到的字符串

3. Java代码调用

1public class TestReportChart extends BaseTestCase {
2    @Test
3    public void testBarChart() {
4        IReportEngine reportEngine = newReportEngine();
5        ExcelWorkbook workbook = reportEngine.getXptModel("/nop/report/demo/test-bar-chart.xpt.xlsx");
6
7        ITemplateOutput output = reportEngine.getRendererForXptModel(workbook, "xlsx");
8        IEvalScope scope = XLang.newEvalScope();
9        output.generateToFile(getTargetFile("result-bar-chart.xlsx"),scope);
10    }
11}
12

可以通过scope向报表引擎传递变量,也可以在报表模板的【展开前】配置中通过XScript语言来定义数据集。

report-data-set.png

展开单元格配置参数说明:

  • expandType:展开方向(r=right向右,l=left向左,d=down向下,u=up向上)
  • expandExpr:展开表达式,返回一个集合,当前单元格按此集合展开
  • field:展开字段名,按指定字段对数据集进行分组展开
  • ds:数据源名称
  • expandInplaceCount:原地展开的数量限制
  • expandMinCount:最少展开元素数量
  • expandMaxCount:最多展开元素数量
  • rowParent/colParent:设置行/列父格

图表配置参数说明:

可在“----”之后配置以下常用表达式(更多项见 schema:/nop/schema/excel/chart.xdef 的 ):

  • chartTestExpr: (chartModel) => boolean
    • 决定是否生成整个图表
  • chartTitleCellRefExpr: (chartModel) => string
  • chartTitleExpr: (chartModel) => string
    • 标题可用单元格引用或直接文本(二选一)。若 cellRefExpr 返回非空,则优先按单元格;否则尝试 titleExpr 文本
  • seriesTestExpr: (seriesModel, chartModel) => boolean
    • 决定某个系列是否保留(返回 true 保留)
  • seriesNameCellRefExpr | seriesNameExpr: (seriesModel, chartModel) => string
  • seriesDataCellRefExpr | seriesDataExpr: (seriesModel, chartModel) => string/any
  • seriesCatCellRefExpr | seriesCatExpr: (seriesModel, chartModel) => string/any
  • axisDataCellRefExpr: (axisModel, chartModel) => string
  • axisTitleCellRefExpr | axisTitleExpr: (axisModel, chartModel) => string

模板预置原则

一个重要的设计原则是:模板需要预置最多的系列数量。运行时不会创建新的系列,只会基于模板中已有的系列进行过滤和配置。

支持的图表类型

NopReport图表功能支持丰富的图表类型,以下是一些常用图表的示例:

柱状图/条形图

簇状柱形图 堆积柱形图 百分比堆积柱形图

折线图/面积图

折线图转存失败,建议直接上传图片文件 带数据标记的折线图 面积图 堆积面积图

饼图/环形图

饼图 环形图

其他图表

雷达图 散点图 填充雷达图


Nop入门:使用Excel模板生成包含图表的报表》 是转载文章,点击查看原文


相关推荐


什么?还不知道git cherry pick?
少年姜太公2025/12/21

前言 上周四在公司开发代码时,一下没注意从测试分支dev上拉了代码并进行开发,最后要上线的时候才猛然发现分支拉错了,一看gitLab上改了几十个文件,再一查发现自己拉代码拉错了😭😭😭,本来都准备下班了,结果硬是新建了一个分支,把四五个文件近1000行代码一点一点cv到新分支上,结果搞完一查才发现git有个cherry pick的命令可以直接搞完,希望jym看完这篇文章以后不要像我一样做这种一点一点cv的蠢事了😭😭😭 什么是cherry pick cherry pick顾名思义,就是樱


【鸿蒙开发案例篇】拒绝裸奔!鸿蒙6实现PDF动态加密
威哥爱编程2025/12/13

兄弟们抄起键盘!今天V哥要带大家用鸿蒙6.0的pdfService玩转PDF动态加密,让敏感文档在战场上穿隐身衣。以下基于HarmonyOS 6.0(API 21)的ArkTS实战,全程高能代码爆破,专治数据泄露不服!💣 联系V哥获取 鸿蒙学习资料 🔑 第一弹:动态加密核心战备(理论基础) 作战目标:运行时根据设备状态动态加载/更新PDF加密密钥技术依据: pdfService支持通过setEncryptConfig()对文档进行AES-256加密 加密状态可通过getSecurityH


TRAE SOLO 驱动:重构AI模拟面试产品的复盘
HiStewie2025/12/4

面试是一项技能,而任何技能的进阶都离不开“高频练习”与“即时反馈”这两个核心要素。 传统的面试准备往往陷入两个极端:要么对着镜子自言自语,缺乏客观的第三方视角;要么花重金找导师模拟,成本高昂且难以常态化。技术存在的意义,就是用低边际成本解决高频痛点。 但这其实并不是我第一次尝试解决这个问题。在此之前,我曾开发过一个初版工具:(QuizPort1.0 让每篇好文都有测验陪跑) 当时的思路很线性:抓取技术文章 →\rightarrow→ AI 提炼知识点 →\rightarrow→ 生成文字面试题


HarmonyOS一杯冰美式的时间 -- @Env
猫猫头啊2026/1/8

一、前言 该系列依旧会带着大家,了解,开阔一些不怎么热门的API,也可能是偷偷被更新的API,也可以是好玩的,藏在官方文档的边边角角~当然也会有一些API,之前是我们辛辛苦苦的手撸代码,现在有一个API能帮我们快速实现的,希望大家能找宝藏。 如果您有任何疑问、对文章写的不满意、发现错误或者有更好的方法,欢迎在评论、私信或邮件中提出,非常感谢您的支持。🙏 二、@Env的诞生背景 OK,步入正题把,在多设备开发的场景中,我们经常需要根据不同的设备环境(比如窗口大小、横竖屏等)来调整UI布局。以前我


Django 踩坑记:OceanBase 4012 Timeout 两条红线,语句超时 vs 事务超时一次讲透
哈里谢顿2026/1/16

一、4012 是谁抛的? Django 本身没有 4012 错误码,它是 OceanBase 的“杀手”信号: 当前 SQL 或 当前事务累计执行时间 ≥ 系统阈值,直接返回 4012。 二、两条红线长啥样? 变量名默认阈值计时对象触发后果ob_query_timeout10 000 000 µs = 10 s单条 SQL 执行时长这条语句被杀,事务可继续ob_trx_timeout100 000 000 µs = 100 s事务 begin→


VS code 类产物中 win11 终端字体内容和颜色 加粗不匹配问题
小兵张健2026/1/24

我尝试了各种方式,换字体,改配置,结果还是乱的,有人知道怎么搞吗?跪求,Mac好像天然就没问题,急急急大佬们

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客