报表 = 多样的格式 + 动态的数据
一、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.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.1 介绍:
可以简化POI的代码量,但不能替代POI。
曾今在项目中用过EasyPOI,需求是把销售台账导出到excel(根据日期区间)。
淄博项目Git地址
-
EasyPOI的案例导出有bug,未找到问题所在。
数据库的photo字段不能为staticuser_photos11.jpg
3.2 应用场景
数据导出
数据导入
详细数据模板导出
百度前端团队开发的基于JS的组件,底层依赖轻量级的矢量图形库ZRender,可高度个性化定制。目前捐给了Apache。
案例的Git地址
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)