文档章节

极速响应Excel数据报表请求的一种方法

FansUnion
 FansUnion
发布于 2015/05/03 01:31
字数 915
阅读 8
收藏 0

摘要

通过缓存和维护Excel Workbook实例,极速响应Excel数据报表请求。

这是一个真实的大数据“云计算”项目中的解决方案,在给定的时间和资源下,只有这种方法是最简单并且是可行的。

XX公司的需求

简单Excel报表:1个sheet。5秒内可以在界面展示。

复杂Excel报表:7个sheet。20秒内可以在界面展示。

并发响应:20个用户

详细介绍

每个sheet中有大量的Excel公式,如 F=E32-[35764%D1]*[DD]/[LD]。

每个单元格的值,需要后台从Mongodb数据库中取出并计算。

Web前端获得后台返回的数据,插入到Excel单元格中,然后Excel自动执行公式,然后将Excel完整地显示到界面中。

时间瓶颈

后台数据获取和数据计算的时间:

1个sheet要3-4s,7个sheet要10到20s。

前台展示剩下的时间:
1个sheet:1到2秒
7个sheet:0到10秒

读取Excel文件需要的时间

1个sheet:1s左右

7个sheet:2s左右

Excel文件构造成POI XSSFWorkbook对象

1个sheet:1s左右

7个sheet:7s左右

最初,我以为是IO有瓶颈,后来发现不是。主要是POI 构造XSSFWorkbook对象,需要花费很长时间。

XSSFWorkbook这可是一个比较大且复杂的数据结构,维护着一个Excel文档的所有信息。

(令人可气的是,测试机Linux服务器性能竟然还不如我的笔记本)

解决方案

考虑到并发请求最多也就是20,而且这只是一个Demo项目,因此“空间换时间”是可行的。

灵感来源:数据库连接池、对象池、缓存等都可以用来提高程序的性能。

最终方案维护一份Workbook资源池。程序启动后,写一个定时器,监控资源池中的对象数量,达到资源下界的时候,就构造一些新的对象放进资源池中。

与数据库连接池等不同的是,Workbook资源池中的每一个XSSFWorkbook对象,只能使用一次。用完后,就必须从资源池中删除。

因为,XSSFWorkbook被使用后,很多状态都变了。

资源池代码结构

public class WorkbookPool {


    private static int complexMinSize = TemplatePropertyReader.COMPLEX_MIN_SIZE;
    // 复杂报表--最大缓存
    private static int complexMaxSize = TemplatePropertyReader.COMPLEX_MAX_SIZE;

    public WorkbookPool() {

    }

    public void init() {

      simpleReportTimer();
      complexReportTimer();
    }


   // 定时器任务---创建报表对象    

    private void simpleReportTimer() {
        log.info("Simple Producter Timer Start...");
        Timer producterTimer = new Timer();
        // 在1秒后执行此任务,每次间隔1秒
        producterTimer.schedule(new SimpleProducterTask(), 1000, 1000);

    }

    private void complexReportTimer() {
        log.info("Complex Producter Timer Start...");
        Timer complexProducterTimer = new Timer();
        // 在1秒后执行此任务,每次间隔1秒
        complexProducterTimer.schedule(new ComplexProducterTask(), 1000, 1000);
    }


// 简单报表--定时器任务
    class SimpleProducterTask extends TimerTask {

        public void run() {

            int simpleSize = simpleVector.size();
            if (simpleSize <= simpleMinSize) {
                int toBuildSize = simpleMaxSize - simpleSize;
                log.info("before : simpleSize=" + simpleSize + ",toBuildSize=" + toBuildSize);
                buildSimple(toBuildSize);
                log.info("after : simpleSize=" + simpleVector.size());
            }

        }
    }

    // 复杂报表--定时器任务
    class ComplexProducterTask extends TimerTask {

        public void run() {
            int complexSize = complexVector.size();
            if (complexSize <= complexMinSize) {
                int toBuildSize = complexMaxSize - complexSize;
                log.info("before: complexSize=" + complexSize + ",toBuildSize=" + toBuildSize);
                buildComplex(toBuildSize);
                log.info("after: complexSize=" + complexVector.size());
            }
        }
    }

}


启示

数据库连接池、对象池、缓存等很多程序设计中的概念,是存在着相似之处的。

学习和借鉴每一个成熟的概念和解决方案,能够产生更多的好方法。

活学活用,灵活解决实际工作中遇到的问题。

拒绝码农,谢绝书呆子。

相关阅读

ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

码农:客户是恶魔

原文参见http://FansUnion.cn/articles/2851 小雷网(FansUnion.cn)

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
JFinal Extensions 1.1 发布,JFinal 扩展

Jfinal-ext是对java极速web框架 jfinal 的一个扩充,主要利用jfinal的plugin机制集成各种第三方框架,像spring一样,简化开发者的学习应用成本,使用时请将jfinal.jar先引入工程。 changelo...

绝望的八皮
2012/10/26
718
12
世界上最好用报表,竟然是它……

作者:陈老师 个人公众号:接地气学堂 陈老师新课:商业分析全攻略 https://edu.hellobi.com/course/308 用数据分析方法解决商业问题,目前已经100+学员加入!5星好评。分析思维双剑合璧,四...

天善智能
06/04
0
0
js如何读取excel文件,绘制echarts图形。

1、场景描述 通常来说,前端要拿到excel数据,都是先上传存储数据库,然后再请求后端接口,获取数据。 但有100个产品经理,就会有101个不同的需求。 本文以自己的vue项目为例。 2、需求描述 ...

SilentLove
2018/12/17
0
0
对象的自治和行为的扩展与适配

在坏的设计中,数据往往是分散的,甚至是杂乱的,这就好像一群失去意识的猛兽,我们无法控制、协调以及管理它们。这种漫无头绪的散乱数据,犹如猛兽的肆意妄为,会给系统带来无尽的灾难。随着...

wayfarer
2011/02/24
0
0
如何做PB级大数据在线分析?看阿里实践

  【IT168 评论】企业数据每年以PB级甚至上百PB爆炸式增长,越来越大的数据量正为扩大分析策略在企业应用软件领域的拓展提供了数据基础,但数据的价值是有时效性的,越早分析越能得到更快的...

it168网站
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
20分钟前
5
0
MySQL的5种时间类型的比较

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00 TIMESTAMP 4 bytes YYYY-MM......

物种起源-达尔文
27分钟前
6
0
云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参...

阿里云官方博客
31分钟前
5
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
35分钟前
5
0
6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下: 根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。 1、地图区域划分(腾讯地图) 1.1、H...

有一个小阿飞
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部