自定义报表工具的一些实践
需求背景:
需要做一款类似excel的在线报表工具,可以支持引用其他单元格的数据进行加减乘除,也可以跨报表取数,同时可以嵌套取数。
实现基础:
使用工具:com.googlecode.aviator.AviatorEvaluator做表达式计算,将所有单元格的公式,转化为字符串,通过 AviatorEvaluator.execute 方法计算出结果,作为输出插入到数据库
实现逻辑:
1、设计模板
首先需要做一个了类似excel的表格,进行模板设置,默认只有一个单元格,可以添加行、添加列。
选中单元格,可以设置单元格的类型:
文本输入框、数字输入框、当前报表公式计算、跨报表公式计算、文本、下拉选项、其他接口自定义的数据字典下拉框。
扩展一下,可以设置单元格验证。
模板数据每个单元格是一条数据存入数据库,如果模板有1000个单元格,100行,10列,那这个模板就是1000条数据。
如果选择当前报表公式计算,或者跨报表公式计算,可以使用前端页面,进行简单的公式编辑,如下图
公式的格式是个数组,作为json字符串存到数据库,每次计算根据公式进行具体的计算
[{"text":"1","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"+","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"2","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"-","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"3","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"*","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"4","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"/","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"5","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"-","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"(","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"6","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":"*","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"7","type":"text","timeScope":"","param":"","custom1":"{}"},{"text":")","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"+","type":"operation","timeScope":"","param":"","custom1":"{}"},{"text":"FN_AVG","type":"FUNCTION","timeScope":"","param":[{"text":"12","type":"text","timeScope":"","param":[],"custom1":"{}"},{"text":"45","type":"text","timeScope":"","param":[],"custom1":"{}"},{"text":"98","type":"text","timeScope":"","param":[],"custom1":"{}"}]}
]
2、计算逻辑
1)根据模板Id,通过type查询出所有需要计算的单元格,如果是输入框类型的则不需要计算
2)取出所有的单元格的数据,存入hashmap,设置isNew:false
3)遍历单元格,根据公式进行计算,公式中取值可能是单元格数据,也可能是正常的数字,单元格数据有可能是另外一个公式,因此就是一个递归的过程,公式中每个参数,都是先找到最底层,进行计算,计算之后,将hashmap中的isNew改为true,下次再用到此参数的时候,不需要重新计算
4)所有的都计算之后,将新的数据存入数据库
优势:
实现相对简单,不需要动态设置数据库表字段,将公式以数据的形式存入数据库,修改公式之后,实时生效
劣势:
完全依赖com.googlecode.aviator.AviatorEvaluator,数据量太大的情况下,计算量很大,如果一个报表100行,10列,就需要计算1000次,比较好的方式是将所有的模板,可能用到的数据都查询到内存里,再内存中进行计算,如果每个格子都进行数据库io,效率会降低1000倍以上(实测,踩过坑),目前虽然会占用一部分内存,但是保证项目可以正常运行
最后:
如果有需要的,可以私信了解具体解决方案。
自定义报表工具的一些实践相关推荐
- 《DevOps实战:VMware管理员运维方法、工具及最佳实践》——2.3 配置管理
本节书摘来自华章计算机<DevOps实战:VMware管理员运维方法.工具及最佳实践>一书中的第2章,第2.3节,作者:小特雷弗 A. 罗伯茨(Trevor A. Roberts Jr.) ...
- 梦想成真…教学–专业的Java开发人员:工具和最佳实践
我总是喜欢分享知识. 我写博客的原因之一是分享我在软件工程师方面的知识. 创立并运行(与几个朋友一起)第一个 早在2003年, 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会, ...
- 代码静态检查工具PC-Lint运用实践
代码静态检查工具PC-Lint运用实践 如何提交zero bug的产品,如何尽早发现bug,是软件开发工程师和测试工程师都需要思考的问题.我认为高质量的代码是关键,具体实施保障办法有:框架约束,代码评 ...
- Filter-policy工具理论与实践
文章目录 Filter-policy工具理论与实践 作用 对RIP发送的路由做过滤 示例1 对RIP发送的路由做过滤 示例2 对RIP接收到路由做过滤 对OSPF接收到路由做过滤 示例1 对OSPF接 ...
- 《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述
本节书摘来自华章计算机<编译与反编译技术实战>一书中的第1章,第1.1节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...
- UML造型——使用EA时序图工具的开发实践和经验
Enterprise Architect(下面简称EA)是一款基于OMG UML的可视化模型与设计工具.提供了对软件系统的设计和构建.业务流程建模和基于领域建模的支持,被企业和组织不仅应用于对系统的建 ...
- Java应用性能调优工具介绍及实践
一.背景 (1).随着微服务架构的逐渐推广,一个大型的单个应用程序被拆分为数个微服务系统,这为研发人员的本地调试跟踪带来困难 (2).在微服务架构中,由于业务的复杂性,常常一个业务流程涉及好数个微服务 ...
- Nebula Graph性能测试工具——Nebula Bench实践
简介 Nebula Bench 是一款利用 LDBC 数据集对 Nebula Graph 进行性能测试的工具.本文是通过Nebula Bench进行性能测试的实践总结. 版本 CentOS 7.9 N ...
- 如何利用研发管理工具 更好实践IPD流程
IPD流程管理起源于美国,经由IBM公司实践推广后,1999年,任正非将其带入华为公司,通过"不换思想就换人"的强硬推广,让华为迅速实现了内部流程管控.研发管理.市场运营等一系列的 ...
最新文章
- Ubuntu20.04 安装qq和微信
- deepin如何布署python_【玩转deepin】简单三步,教你在deepin15.11上安装Python3.7.4
- bootstrap 一排5个_Bootstrap5 列(Columns)
- java并发队列_Java并发教程–阻塞队列
- 各种图片格式的生成工具(HTML、URL、BBCode、Markdown、Link)
- c++规定浮点数输出格式
- 模拟电子技术基础(第四版)教材 电子版
- python调用access数据库_Python访问Access数据库
- Redis集群原理详解
- java之StringBuilder和关于数组怎么扩容
- Salesforce中reRender和rendered控件的使用
- API的防篡改和防重放机制
- linux 显示bin 文件格式,bin文件扩展名,bin文件怎么打开?
- Js 提交 form 表单
- PHM2010刀具磨损数据集分享
- 4.花瓣特效----js+旋转+位移+随机颜色+随机位置
- 默认的 Windows 2000 服务
- 13.3断流_BUG全军覆没!苹果iOS13.3正式推送:4G断流、后台闪退统统解决
- 从 RDO到 ADO 的移植 (转)
- 理解回溯算法——回溯算法的初学者指南