报表 = 多样的格式 + 动态的数据
一、Java处理Excel
1、JXL
只能处理Excel2003版本以前的
2、POI
- apache的项目;
- 用模板的方式导出Excel,提高处理复杂Excel的效率;
- 自定义导出引擎,在Excel模板标记实体字段,把配置做到Excel中来减少代码的改动;
百万数据的导出
思路:
新版Excel的内部结构是XML,其解析方式有dom4j和sax。百万数据的导出适合用sax的解析方式,边扫描边解析,防止内存的大量消耗。
不能使用模板,不能使用太多样式。
案例:
1、用存储过程向表中插入500万条数据。
#1、创建表
CREATE TABLE `tb_user2` (
`id` bigint(20) NOT NULL COMMENT '用户ID',
`user_name` varchar(100) DEFAULT NULL COMMENT '姓名',
`phone` varchar(15) DEFAULT NULL COMMENT '手机号',
`province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`salary` int(10) DEFAULT NULL,
`hire_date` datetime DEFAULT NULL COMMENT '入职日期',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门编号',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`photo` varchar(200) DEFAULT NULL COMMENT '照片路径',
`address` varchar(300) DEFAULT NULL COMMENT '现在住址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#2、创建存储过程
DELIMITER $$ -- 重新定义“;”分号
DROP PROCEDURE IF EXISTS test_insert $$ -- 如果有test_insert这个存储过程就删除
CREATE PROCEDURE test_insert() -- 创建存储过程
BEGIN
DECLARE n int DEFAULT 1; -- 定义变量n=1
SET AUTOCOMMIT=0; -- 取消自动提交
while n <= 5000000 do
INSERT INTO `tb_user2` VALUES ( n, CONCAT('测试', n), '13800000001', '北京市', '北京市', '11000', '2001-03-01 21:18:29', '1', '1981-03-02 00:00:00', '\\static\\user_photos\\1.jpg', '北京市西城区宣武大街1号院');
SET n=n+1;
END while;
COMMIT;
END $$
#3、开始执行 插入500W数据大概需要200至300秒左右
CALL test_insert();
2、用POI导出Excel。规定每个工作表只存100万条数据,因此需要5个工作表。
百万数据的导入
思路:
用sax的解析方式,否则会堆内存溢出(OutOfMemoryError)。
实现:
实现SheetContentsHandler接口。
3、EasyPOI
3.1 介绍:
可以简化POI的代码量,但不能替代POI。
曾今在项目中用过EasyPOI,需求是把销售台账导出到excel(根据日期区间)。
淄博项目Git地址
-
EasyPOI的案例导出有bug,未找到问题所在。
数据库的photo字段不能为\static\user_photos\11.jpg
3.2 应用场景
数据导出
数据导入
详细数据模板导出
二、图形报表
ECharts
百度前端团队开发的基于JS的组件,底层依赖轻量级的矢量图形库ZRender,可高度个性化定制。目前捐给了Apache。
案例的Git地址