SpreadJS V19.2 新特性揭秘:报表生成进度可见
报表工作表(ReportSheet)把模板切换到预览、或生成分页预览的那一刻,并不总是一瞬间的事。模板稍复杂些、数据量稍大些,屏幕就会停在一片待生成的空白上。使用者无从判断眼前这状态是在正常推进,还是已经卡住——界面没有给出任何信号,能做的只有等。报表的生成是分几个阶段进行的,中途会有不小的间隔;可这些阶段过去是"闷声"完成的,外界既看不到它走到哪一步,也没有办法在它运行的中途让浏览器画点提示出来。
V19.2 为这件事补了两样东西:一个把生成进度逐步说出来的事件,和一组让界面得以在等待中"喘口气"的异步接口。报表从模板到成稿的过程,从此可以被看见。
报表过三关
从模板文件到一张铺满数据的报表,生成要经过三个彼此分开的工序。先是分析模板——把模板里的版式与绑定关系读出来,弄清楚报表该长成什么样;随后装载数据——按模板设定的数据源与关系把各处的数据取齐;最后生成报表——把取到的数据按版式逐处填进界面,铺成使用者看到的那张成品。
三个阶段在时序上先后相接,每个阶段都有明确的起点与终点。V19.2 新增的报表生成阶段变更事件,便在这六个时刻分别触发:进入分析模板、离开分析模板、进入装载数据、离开装载数据、进入生成报表、离开生成报表。监听这个事件的一方,随时都知道生成走到了第几步。三个阶段的耗时占比并不固定:数据量大、取数链路远时,"装载数据"往往最费时;模板复杂、层次深时,"分析模板"与"生成报表"会拖得更长。提示在哪一阶段停留得久,读者和制作者心里大致就有数,慢下来时也容易判断是数据侧的事还是版式侧的事。

只报信,不掌舵
这个事件有一个被刻意守住的边界:它只向外界报告生成到了哪一步,不能反过来影响生成本身。事件没有取消生成的入口,也拿不到让某一阶段跳过的权限——阶段该走还是走,只是旁人现在看得见它走了。这是一条清晰的设计意图:报表生成是产品内部既定的一套流程,对外开一扇观察窗,而不是把流程的开关交给外部逻辑去拨弄。想用事件在某个阶段插入自己的处理、改变生成结果的应用,会在这里发现边界——事件不是为这类用途准备的。
事件的触发也不挑入口。同步还是异步的调用,都会逐阶段把事件发出来,所以它不止服务于"显示提示"这一种用途:把各阶段的起止报进日志、归集统计,报表生成的性能状况便有了长期可观测的依据。提示是给终端用户看的,事件则是给系统自身留的记录。
那这个"只报信"的事件有什么用?最直接的用途是等待体验。三个阶段的起点,各能对应一句"正在做什么"的提示;生成报表阶段走到终点时,把提示收掉。使用者在等待中看到的,从一片沉寂的空白,变成"正在分析模板"“正在装载数据”"正在生成报表"这样逐步推进的文字,至少能判断事情仍在进行,而不是无望地守着屏幕。
报信之后,还得让浏览器画出来
提示的文字要真正显示到屏幕上,还隔着一道现实的门槛。报表切换渲染模式时,原有的接口是同步执行的——一整段生成逻辑在浏览器的一帧里一口气跑完,期间即便事件处理器改动了界面提示的文字,浏览器也没有机会把它绘制出来;等一切结束、浏览器终于刷新屏幕时,生成早已完成。事件报了信,界面却来不及呈现,等于白报。
V19.2 因此新增了一批异步接口,与原有的同步接口一一对应:异步切换渲染模式、异步重新生成报表、异步刷新、异步装载模板。它们把生成过程里的各个步骤用间隔拆开,在阶段与阶段之间给浏览器留出重绘的时间。这样,事件处理器写下的提示文字,才真的出现在使用者的屏幕上——先显示"正在分析模板",随后显示"正在装载数据",再显示"正在生成报表",而不是空转一圈后直接跳到成品。异步接口在执行完毕后返回完成信号,调用方可以在它之后接着做下一件事。为换这几帧喘息,异步形态的生成在墙钟时间上可能比一次性同步执行略长——它在中途让出了若干次绘制时机。对模板大、页数多的长报表,这几帧的让位,换来的是界面不再冻结、提示逐段可读,多数情况下是划算的。

一对接口,四个入口
异步不是取代同步,而是与之并存。涉及渲染模式与数据装载的四个入口,都各有一对同步与异步的形态:切换渲染模式、重新生成报表、刷新、装载模板,同步与异步成对提供,使用者按自己的取舍选用。偏好简单直接、接受整段生成一气呵成,就走同步;在意等待期间的界面反馈、需要提示能及时画出来,就走异步。而在预览与分页预览这两种会真正触发报表生成的模式下,上述入口无论同步异步,都会触发阶段变更事件;设计模式下不生成报表,也就没有阶段可言。同一张报表在预览与分页预览之间切换,也会各自走一遍生成、各触发一轮阶段事件——两种预览的产出不同,铺成过程同样可分阶段观察。
两类接口的取舍,其实各有所图。异步给了界面喘息,也让生成时序变得可感知、可编排;同步则保留了原有调用方式的直白。产品没有在两者间替使用者做决定,而是让同一套能力以两种节奏同时可用。
报表生成的等待,从一段无从揣测的静默,变成一趟有路标的过程。使用者守在屏幕前时,至少能看见它正在越过哪一关。报表本身的生成没有变快,但等待这件事,第一次有了被看见的路径。对许多把报表做进业务系统里的集成者来说,把一句"正在生成,请稍候"换成逐步推进的状态,正是给终端用户的一份踏实的交代。
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐




所有评论(0)