问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

求一款简单适用的基于Web应用的报表开发工具

发布网友 发布时间:2022-04-28 13:54

我来回答

4个回答

懂视网 时间:2022-05-12 07:43

背景

最近在一个 SCADA 项目中遇到了在 Web 页面中展示设备报表的需求。一个完整的报表,一般包含了筛选操作区、表格、Chart、展板等多种元素,而其中的数据表格是最常用的控件。在以往的工业项目中,所有的表格看起来千篇一律,就是通过数字和简单的背景颜色变化来展示相关信息。但是现在通过各种移动 App 和 Web 应用的熏陶,人们的审美和要求都在不断提高,尤其是在 Web 项目中,还采用老式的数字表格确实也有点落伍了。

如何选择一个合适的 HTML 前端表格控件?此处可以省略一万字。哈哈。jQuery、Angular、React 等阵营中的控件库中都有不少成熟案例,但是这些基于 DOM 的控件也有不足,一个是效率问题:如果在数据量很大表格的中采用自定义的单元格控件,对浏览器的负担实在太重,尤其是移动端。另一个问题是开发效率,上述的控件库中各自的封装程度、接口形式都有所不同,但整体上还是要求开发者对 CSS、JS 都有较深的了解。还有控件的复用、嵌入、发布、移植,也都是问题。

基于上面的考虑,最后采用了基于 Canvas 的 HT。通过 HT 表格控件的自定义渲染接口,以及 Web Worker 的多线程数据模拟,实现的表格控件效果如下:

1374.png

开始

首先我们要做的就是结合业务逻辑,对表格中不同列的数据,进行不同的渲染。例如设备历史信息中的运行时间、停机时间等,比较适合用饼图来汇总展示,用户就可以很直观的从列表上对比出设备的历史状况。 我们来看看这一步是怎样实现的。

HT 有自己的 DataModel 数据模型,省略了我们对数据状态管理、时间派发、ui刷新的开发工作。DataModel 容器中的子元素 Data,即是 HT 中最基础的数据结构,可以映射到不同的ui控件上。在画布上,Data 可以展示成矢量、图片或者文字等,在树形控件上,Data 展示为树的一个节点。在表格当中每个 Data 对应着表格中的一行 Row。 也就是表格控件自身包含一个 DataModel,在绘制时,将这个 Model 中的每个 Data 都绘制成一行。 不同的列,展示的是该 Data 中的不同属性。例如我们可以把设备的停机时间,保存到 Data 的 stopping 属性。 在配置表格的列 Column 信息时,我们可以指定该列的表头描述“停机时间”,其数据单元格对应 Data 的 Stopping 属性,以及自定义绘制格式:

{
 name: 'stopping', //对应的data属性
 accessType: 'attr',
 align: 'center', 
 color: '#E2E2E2', //文字颜色
 displayName: '停机', //表头描述
 drawCell: pageTable.getDrawLegend('stopping','#E2E2E2')
},

自定义渲染

在单元格的基本显示格式中,已经默认提供了文本、数组、颜色等类型,可以自动的对数据格式化,并展示为文字或背景颜色等,但是还未满足我们的个性需求,因此就要将 Column 中的 drawCell 重载为自定义的渲染函数。 drawCell 的参数:function (g, data, selected, column, x, y, w, h, view),其中 g 是 Canvas 的环境信息,data 是该行的数据体,我们根据这些信息,再利用 HTML5 原生的 Canvas API 就可以画出想要的效果。

懒得亲自直接用 HTML5 的原生接口? HT 提供了对 Canvas API 的封装接口,包括各种矢量类型以及一些简单的 Chart。利用该功能,可以轻松组合出复杂的效果,具体介绍可以参考我们的矢量手册

先创建一个对象,该 image 矢量对象负责包含对组合矢量的描述信息,然后将该 image 对象以及 drawCell 的上下文信息,作为参数传入 ht.Default.drawStretchImage 函数,即可实现自定义绘制。

//drawCellfunction (g, data, selected, column, x, y, w, h, tableView) { 
var value = data.a(attr); var image = {
 width: 60,
 height: 30,
 comps: [
  {
  type: 'rect',
  rect: [11,11,8,8],
  borderWidth: 1,
  borderColor: '#34495E',
  background: legendColor,
  depth: 3
  },
  {
  type: 'text',
  text: value,
  rect:[30, 0, 30, 30],
  align: 'left',
  color: '#eee',
  font: 'bold 12px Arial'
  }
 ]};
 ht.Default.drawStretchImage(g, image, 'centerUniform', x, y, w, h);
}

因为有多个 Legend 图例显示的列,所以我们可以简单包装一下,用了一个 getDrawLegend 函数,参数是该列图例的颜色及 Data 属性名称,返回值是 drawCell 函数。

getDrawLegend: function(attr,legendColor){return drawCell}

至此,我们就完成了启停时间这几列的自定义绘制:

1375.png

“统计”列的饼图,实际上更简单。还是利用 HT 的矢量接口,把上述几项时间数据传入饼图矢量结构即可。

var values = [
 data.a('running'), 
 data.a('stopping'), 
 data.a('overhauling')
];var image = {
 width: 200,
 height: 200,
 comps: [
 {
  type: 'pieChart',
  rect: [20,20, 150, 150],
  hollow: false,
  label: false,
  labelColor: 'white',
  shadow: true,
  shadowColor: 'rgba(0, 0, 0, 0.8)',
  values: values,
  startAngle: Math.PI,
  colors: pieColors
 }
 ]
};

其他列的渲染过程大同小异。在“风速”列中,我们可以根据风速大小计算一个颜色透明值,来实现同一色系的映射变换,比原来那种非红即绿的报警表,看起来更舒服一些。在“可用率”列,用 Rect 的不同长度变化,来模拟进度条的效果。在功率曲线中稍微有点不同,因为想实现曲线覆盖区域的颜色渐变,在 HT 的 lineChart 中没有找到相关接口,所以直接采用了 Canvas 绘制。

1376.png

为了运行效率考虑,在表格的单元格中绘制 Chart,应该追求简洁大方,一目了然。这几个 Legend 图例小矩形,其实是应该画在表头的。我为了偷懒,就画在了单元格,导致画面显得有点乱。

Web Worker

众所周知,浏览器的 JS 环境是基于单进程的,在页面元素较多,而且有很大运算需求的情况下,会导致无法兼顾渲染任务和计算任务,造成页面卡顿或失去响应。在这种情况,可以考虑使用 Web Worker 的多线程,来分担一些计算任务。

Web Worker 是 HTML5 的多线程 API,和我们原来传统概念中的多线程开发有所不同。Web Worker 的线程之间,没有内存共享的概念,所有信息交互都采用 Message 的异步传递。这样多线程之间无法访问对方的上下文,也无法访问对方的成员变量及函数,也不存在互斥锁等概念。在消息中传递的数据,也是通过值传递,而不是地址传递。

在 Demo 中,我们利用 Web Worker 作为模拟后端,产生虚拟数据。并采用前端分页的方式,从 worker 获取当前页显示条目的相关数据。 在主线程中,创建 Web Worker注册消息监听函数。

worker = new Worker("worker.js"); 
worker.addEventListener('message', function(e) { 
 //收到worker的消息后,刷新表格
 pageTable.update(e.data);
});

pageTable.request = function(){ //向worker发送分页数据请求
 worker.postMessage({
 pageIndex: pageTable.getPageIndex(),
 pageRowSize: pageTable.getPageRowSize() 
 });   
}; 
pageTable.request();

本处的new Worker创建,对于主线程来说是异步的,等加载完 worker.js,并完成初始化后,该 worker 才是真正可用状态。我们不需要考虑 worker 的可用状态,可以在创建语句后直接发送消息。在完成初始化之前向其发送的请求,都会自动保存在主线程的临时消息队列中,等 worker 创建完成,这些信息会转移到 worker 的正式消息队列。

在 worker 中,创造虚拟随机数据,监听主线程消息,并返回其指定的数据。

self.addEventListener('message', function(e) { 
var pageInfo = getPageInfo(e.data.pageIndex, e.data.pageRowSize); 
 self.postMessage(pageInfo);
}, false);

由于前面提到的无法内存共享,Web Worker 无法操作 Dom,也不适用于与主线程进行大数据量频繁的交互。那么在生产环境中,Web Worker 能发挥什么作用?在我们这种应用场景,Web Worker 适合在后台进行数据清洗,可以对从后端取到的设备历史数据进行插值计算、格式转换等操作,再配合上 HT 的前端分页,就能实现大量数据的无压力展示。

分页

传统上有后端分页和前端分页,我们可以根据实际项目的数据量、网速、数据库等因素综合考虑。

采用后端分页的话,可以简化前端架构。缺点是换页时会有延迟,用户体验不好。而且在高并发的情况下,频繁的历史数据查询会对后端数据库造成很大压力。

采用前端分页,需要担心的是数据量。整表的数据量太大,会造成第一次获取时的加载太慢,前端资源占用过多。

在本项目中,得益于给力的 GOLDEN 实时数据库,我们可以放心的采用前端分页。历史数据插值、统计等操作可以在数据库层完成,传递到前端的是初步精简后的数据。在数千台设备的历史查询中,得到的数据量完全可以一次发送,再由前端分页展示。

在某些应用场景,我们会在表格中显示一些实时数据,这些数据是必须是动态获取的。类似在 Demo 中的趋势刷新效果,我们可以在创建表格时批量获取所有历史数据,然后再动态向数据库获取当前页所需的实时数据。如果网速实在不理想,也可以先只获取第一页的历史数据,随后在后台线程慢慢接收完整数据。

这样的架构实现了海量数据的快速加载,换页操作毫无延迟,当前页面元素实时动态刷新的最终效果。

还有一些传统客户,喜欢在一张完整的大表上进行数据筛选、排序等操作。

我们可以把 Demo 中的数据总量改成一万条,单页数量也是一万条,进行测试:

1377.png

出乎意料的是,HT 面对上万数据量的复杂表格,轻松经受住了考验。页面的滚动、点击等交互毫无影响,动态刷新没有延迟,表格加载、排序等操作时,会有小的卡顿,在可接受的程度之内。当然也跟客户端的机器配置有关。可以想象,几万个 Chart的展示以及动态刷新,对于基于dom的控件几乎是件无法完成的任务。关于 HT 的其他矢量和控件,同样有高性能特性:

后记

如前文所述,我们基于 HT 的表格实现了海量数据的可定制展现,并取得了令人满意的效果。以下是一些还可以改进的地方。

在 Demo 中,通过对 HT 表格控件的 drawCell 进行重载,实现了自定义渲染,然后把这些 drawCell 放到了 PageTable 的原型函数中,以供 Column 调用。实际上,更好的办法应该是把这些常见的 Chart、图例封装到 Column 的基本类型中,那样在配置表格 Column 列时,可以指定 type 为 pieChart 或 lineChart 即可,不需再自行绘制相关矢量。

对于这些表格中的 Chart,也可以增加一些交互接口,例如可以增加单元格 Tooltip 的自定义渲染功能,在鼠标停留时浮出一个信息量更大的 Chart,可以对指定设备进行更深入的了解。
界面美观优化。对 HT 的控件进行颜色定制,可以通过相关接口进行配置:

var tableHeader = pageTable.getTablePane().getTableHeader(); 
tableHeader.getView().style.backgroundColor = 'rgba(51,51,51,1)'; 
tableHeader.setColumnLineColor('#777');var tableView = pageTable.getTablePane().getTableView();   
tableView.setSelectBackground('#3D5D73');
tableView.setRowLineColor('#222941');
tableView.setColumnLineVisible(false);  
tableView.setRowHeight(30);

今后也可以对htconfig进行全局配置,在单独文件中进行样式的整体管理,实现外观样式与功能的分离,有助于工程管理。

热心网友 时间:2022-05-12 04:51

用的最溜的一款报表开发工具就是FineReport,FineReport是纯java报表开发工具,零代码概念,开发也简单,基本功能如下(官网上找到的说明,居然完全符合楼主的要求,连功能说明都一样,我也是醉了):

FineReport是基于J2EE和WEB纯Java编写的综合报表解决方案,特有的EXCEL+绑定数据列的报表设计方式,支持多源分片,行列对称,能够轻松处理复杂的报表展现样式,全面支持主流的B/S架构以及传统的C/S架构,部署方式简单而灵活,完美解决中国式报表难题。

FineReport支持跨数据库数据表取数,用户可以简单应用多业务系统数据,集中数据于一张报表,让更多数据应用于经营分析和业务管控中。通过FineReport数据决策系统,用户可以搭建报表平台和报表中心,实现报表的统一访问和管理,实现财务、销售、客户、库存等各种业务主题分析、数据填报等。

部分功能点如下:

1、简单高效的报表设计器

2、强大的数据展示(报表)功能

3、零客户端填报的表单

4、多级数据上报

5、基于浏览器的零客户报表打印

6、异构数据源的表关联

7、高性能报表服务器

8、形象美观的web图表展现

9、24小时报表表单调度

10、即席报表

11、参数传递和报表管理

12、权限控制和安全管理

13、报表展示平台(BS报表平台)

14、部署和二次开发

15、决策平台-数据决策系统

热心网友 时间:2022-05-12 06:09

性价比极高的润乾报表关注下。

热心网友 时间:2022-05-12 07:44

一款优秀的Web报表工具——ActiveReportsJS能做到这些:

    提供跨平台报表设计器

    全面支持 Node.js、Angular、React、Vue 等前端开发框架

    内嵌表格、矩表、图表、目录等多种报表组件,可快速创建中国式报表、Word类报表、DashBoard、交互式报表等。

    提供多数据源整合

    支持纯前端打印/导出格式

    提供200余张优质报表模板免费使用

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具,采用拖拽式设计模式,不需任何服务器和组件支持,即可在 Mac、Linux 和 Windows 操作系统中,设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯前端报表展示、多数据源绑定、前端打印导出等功能,灵活丰富的 API 可为您带来无与伦比的报表开发体验。

ActiveReportsJS 作为 .NET报表控件 ActiveReports 在 Web 平台的扩展,不但继承了其强大的报表设计能力和高效的报表开发引擎,还提供了全新的跨平台报表设计器和纯前端报表查看器,全面支持 Node.js、Angular、React、Vue 等前端开发框架。

求一款简单适用的基于Web应用的报表开发工具

用的最溜的一款报表开发工具就是FineReport,FineReport是纯java报表开发工具,零代码概念,开发也简单,基本功能如下(官网上找到的说明,居然完全符合楼主的要求,连功能说明都一样,我也是醉了):FineReport是基于J2EE和WEB纯Java编写的综合报表解决方案,特有的EXCEL+绑定数据列的报表设计方式,支持多源分片...

类似echarts的报表工具有哪些

1. FineReport 是一款基于Java的企业级Web报表工具,它集数据展示和数据录入于一体。以其“专业、简捷、灵活”的特点和无代码理念,用户可以通过简单的拖拽操作设计出复杂的报表,快速构建数据决策分析系统。报表设计过程简单高效,且学习成本低。其类似Excel的界面使用户无需额外的学习成本,实现零编码开发,...

报表工具有哪些_报表工具

2. BIRT报表:BIRT是一个基于Eclipse的开源报表系统,主要应用于基于Java和J2EE的Web应用程序中。3. ireport:它是最流行且常用的开源报表工具之一,常与BIRT一起使用。4. .NET报表控件:这是一款专为.NET平台设计的报表控件,能够满足HTML5、WinForm、ASP.NET、ASP.NET MVC、WPF等多种平台下的报表设...

求推荐现在有什么好用的web报表工具

思迈特软件Smartbi是一款基于轻量级Web报表工具,采用拖拽式设计模式,不需任何服务器和组件支持,即可在 Mac、Linux 和 Windows 操作系统中,设计多种类型的报表。思迈特软件Smartbi在Web平台的扩展,不但继承了其强大的报表设计能力和高效的报表开发引擎,还提供了全新的跨平台报表设计器和纯前端报表查看器,...

birt报表简介

BIRT,全称为 Business Intelligence and Reporting Tools,是一款专为Web应用程序设计的开源报表系统,其开发基础是Eclipse,特别强调了Java和J2EE技术的运用。BIRT的核心结构包含两个关键部分:一是基于Eclipse的报表设计工具,它允许用户直观地创建和定制报表;二是运行时组件,这部分部署在应用服务器上,为...

好用的11款开源报表工具推荐

1. JasperReports - 作为Java开发人员的首选,支持嵌入web和移动应用,提供PDF、HTML等多格式输出,且其商业智能平台可通过开源软件管理。2. BIRT - 基于Eclipse的开源报表系统,易扩展,支持多维数据表,自带报表设计器和主流应用服务器集成。3. Pentaho Reporting - 集成多种工具,处理多种格式报表,注重...

报表工具有哪些_报表工具

BIRT是Eclipse-based开源报表系统,主要基于Java和J2EE的Web应用程序中。3、最流行和最常用的开源报告工具通常与ireport一起使用。4、是一款专注于.NET平台的报表控件,全面满足HTML5/WinForm/ASP.NET/ASP.NETMVC/WPF等平台下报表设计和报表开发工作需求。选择报表工具我建议可以使用思迈特软件Smartbi的产品。

web报表工具有什么好推荐?(开源的以及收费的)

报表工具的选择,不论是开源还是付费,都需根据实际需求和预算来定。在众多选择中,润乾报表因其出色的性能和经济实惠的价格,成为了许多行业软件开发商的首选。润乾报表的易用性和高效性在业内有口皆碑,它不仅能够快速生成报表,还提供了一系列强大的功能,如数据准备、基础报表和商业智能分析,满足了不...

报表工具有哪些?

1. FineReport是一款综合性报表工具,具备数据展示、查询和录入等功能,适用于BS架构软件系统的开发。2. MAXReports(数巨报表)是易于使用且强大的专业报表开发和数据分析工具,支持Web应用,并解决了B/S架构软件中的报表制作与输出问题。3. 杰表是一个易于上手且功能强大的报表开发环境,专为中国式报表...

报表开发工具有哪些

FineReport:FineReport是一款集数据展示(报表)、数据查询(参数)和数据录入(填报)功能于一身,用来辅助开发基于BS软件系统的工具软件。数巨报表:MAXReports是一套功能强大且简单易用的专业报表开发工具与数据分析工具。数巨报表支持Web方式下的应用,并成功地解 决了B/S架构软件中报表制作、预览、打印及导出...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
梦见误食了有毒的瓜子的预兆 ...请问有谁知道是怎么回事?有时候上下楼梯或是正常走路会忽然下跪。友... 剑网三刷鹊翎的时候小怪掉落的东西看不见,地上也不发光。等好久了... 360浏览器点链接或者搜索就显示个空白页、 九年级政治题:图片:一个人往菜里放有毒物质,一只手给予处理,反映了什 ... 梦见别人吃了有毒的青菜死了 eg是什么意思网络语eg是什么意思 石墨烯简写 ...我从EBP系统导出的数据逗号和点号颠倒了,怎样在excel中修改... 宁夏医科大学是公办还是民办大学? 有好用,开源的 Web 表单设计器吗 tl431为什么与PC817配合 TL431内部元件:运算放大器、电晶体、参考电压源的作用 3842充电器中TL431与PC817是怎么稳压的? 开关电源的TL431和光耦那部分的限流电阻怎样选择,能举个例子吗 大家来详细讲讲这图的原理 尤其是反馈部分TL431.光耦是怎么工作的 用光耦和tl431实现反馈的正激电源 开关电源里面TL431具体是怎么工作的呀? 我见到一些开关电源用光耦和TL431的结构,是恒压的吧? 开关电源电路中反馈电路的作用?光耦817C的工作原理??? TL431如何控制光电耦合器P817 用光耦和tl431反馈的开关电源,为什么它自己能知道有负载插上还是没负载插上,谢谢 光耦817C的接法和431配合的工作原理? TL431 光耦稳定输出电压分析 tl431与光耦用在一起用什么用吗,不用可以吗? 开关电源中,TL431是的输出是什么?它具体是怎么工作的?比如如何结合PC817光耦工作? 为什么开关电源中光耦要配合稳压管或者tl431使用,为什么不能单独用光耦,谢谢 开关电源中,当输出增大时tl431和光耦怎么工作的 谁能给我分析一下 开关电源在输出电压变小的情况下,tl431和光耦是怎么配合工作的呢? 湖南IT学校排名 国内有没有类似Wufoo的在线表单设计工具? 有基于Java的好用的Web快速开发平台吗?网上找了一些不太好用。最好能... 如何让程序员更容易的开发Web界面 protable怎么画表单 Haiey冰箱BCD-268冷藏室结冰如何解决 海尔冰箱bcd-228wbcs za冷藏室老是结冰是什么原因?结了好厚,自己化不掉。有什么办法能帮帮我吗,谢谢了 海尔BCD_258WBCS TX三门冰箱冷藏室经常流水,中间室结冰怎么回事? 为什么冰箱会结霜?结霜后又该怎样去霜? 如何解除vivo手机的家长使用权限? 海尔冰箱BCD-268WBCS的简介 我刚刚用360一键root了,现在怎么解除限权(我手机是vivov3maxa)现在都不 海尔Bcd–268WBCS冷冻温度为什么闪不停,而且温度高? 海尔冰箱BCD-268wbcs冷藏箱顶部有不少水珠,(冷藏,冷冻室)门边胶条有发霉痕迹 海尔冰箱bcd-268wbcs不致冷 vivo手机怎么取消已root权限? 海尔冰箱bcd268wbcs冷冻显示ed 海尔冰箱BCD-268WBCS的新三门时代 vivox30怎样解除限制 海尔三门无霜冰箱268WBCS这款冰箱怎么样?真的可以无霜吗? vivo手机y33通讯录被限权要怎么设置
  • 焦点

最新推荐

猜你喜欢

热门推荐