需求背景:

需要做一款类似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倍以上(实测,踩过坑),目前虽然会占用一部分内存,但是保证项目可以正常运行

最后:

如果有需要的,可以私信了解具体解决方案。

自定义报表工具的一些实践相关推荐

  1. 《DevOps实战:VMware管理员运维方法、工具及最佳实践》——2.3 配置管理

    本节书摘来自华章计算机<DevOps实战:VMware管理员运维方法.工具及最佳实践>一书中的第2章,第2.3节,作者:小特雷弗 A. 罗伯茨(Trevor A. Roberts Jr.) ...

  2. 梦想成真…教学–专业的Java开发人员:工具和最佳实践

    我总是喜欢分享知识. 我写博客的原因之一是分享我在软件工程师方面的知识. 创立并运行(与几个朋友一起)第一个 早在2003年, 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会, ...

  3. 代码静态检查工具PC-Lint运用实践

    代码静态检查工具PC-Lint运用实践 如何提交zero bug的产品,如何尽早发现bug,是软件开发工程师和测试工程师都需要思考的问题.我认为高质量的代码是关键,具体实施保障办法有:框架约束,代码评 ...

  4. Filter-policy工具理论与实践

    文章目录 Filter-policy工具理论与实践 作用 对RIP发送的路由做过滤 示例1 对RIP发送的路由做过滤 示例2 对RIP接收到路由做过滤 对OSPF接收到路由做过滤 示例1 对OSPF接 ...

  5. 《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

    本节书摘来自华章计算机<编译与反编译技术实战>一书中的第1章,第1.1节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...

  6. UML造型——使用EA时序图工具的开发实践和经验

    Enterprise Architect(下面简称EA)是一款基于OMG UML的可视化模型与设计工具.提供了对软件系统的设计和构建.业务流程建模和基于领域建模的支持,被企业和组织不仅应用于对系统的建 ...

  7. Java应用性能调优工具介绍及实践

    一.背景 (1).随着微服务架构的逐渐推广,一个大型的单个应用程序被拆分为数个微服务系统,这为研发人员的本地调试跟踪带来困难 (2).在微服务架构中,由于业务的复杂性,常常一个业务流程涉及好数个微服务 ...

  8. Nebula Graph性能测试工具——Nebula Bench实践

    简介 Nebula Bench 是一款利用 LDBC 数据集对 Nebula Graph 进行性能测试的工具.本文是通过Nebula Bench进行性能测试的实践总结. 版本 CentOS 7.9 N ...

  9. 如何利用研发管理工具 更好实践IPD流程

    IPD流程管理起源于美国,经由IBM公司实践推广后,1999年,任正非将其带入华为公司,通过"不换思想就换人"的强硬推广,让华为迅速实现了内部流程管控.研发管理.市场运营等一系列的 ...

最新文章

  1. Ubuntu20.04 安装qq和微信
  2. deepin如何布署python_【玩转deepin】简单三步,教你在deepin15.11上安装Python3.7.4
  3. bootstrap 一排5个_Bootstrap5 列(Columns)
  4. java并发队列_Java并发教程–阻塞队列
  5. 各种图片格式的生成工具(HTML、URL、BBCode、Markdown、Link)
  6. c++规定浮点数输出格式
  7. 模拟电子技术基础(第四版)教材 电子版
  8. python调用access数据库_Python访问Access数据库
  9. Redis集群原理详解
  10. java之StringBuilder和关于数组怎么扩容
  11. Salesforce中reRender和rendered控件的使用
  12. API的防篡改和防重放机制
  13. linux 显示bin 文件格式,bin文件扩展名,bin文件怎么打开?
  14. Js 提交 form 表单
  15. PHM2010刀具磨损数据集分享
  16. 4.花瓣特效----js+旋转+位移+随机颜色+随机位置
  17. 默认的 Windows 2000 服务
  18. 13.3断流_BUG全军覆没!苹果iOS13.3正式推送:4G断流、后台闪退统统解决
  19. 从 RDO到 ADO 的移植 (转)
  20. 理解回溯算法——回溯算法的初学者指南

热门文章

  1. 收纳箱底部滚轮怎样装_抽屉收纳箱安装方法 抽屉式收纳柜尺寸
  2. NFS(NFS介绍,NFS服务端和客户端配置)
  3. db2数据库 为列加注释
  4. 杭电 HDU 1248 Java寒冰王座
  5. 纯CSS实现目录自动编号
  6. 测试开发真的不难(5)如何让IDEA实时显示内存
  7. 如何选择靠谱的网站建设服务商来建设企业官网?
  8. Python正则表达式(附正则表达式教程、调试工具、可视化工具)
  9. 基于python语言,使用爬虫和深度学习来预测双色球(二、模型训练与测试)
  10. ETERM放大软件 机票实时查询接口 底层开发接口