关于使用JAVA导出列表为Excel

Secret 发布于 2013/03/06 09:27
阅读 2K+
收藏 0

   最近有这样的需求,客户需要把报表,列表等导出成Excel, 目前来说是使用纯JAVA编写,使用的是JXL。 据客户反应,如果大数据量需要等待较长时间。      这个时候客户并不知道到底需要多长时间。 所以呢,现在有要求导出的时候需要遮盖层(这个倒是简单),同时必须提示 导出剩余时间。。。 这就让我摸不着头脑。

 

请各位兄弟帮帮忙。最近太累了,连续忙了几个晚上。脑子一片混乱。

加载中
0
b_lee
b_lee

jxl 好像是把所有的数据都先加载到内存的. 大数据量的时候这个比较恐怖.

曾经做过一项目导出的时候导出成逗号分隔符文件,强制以xls结尾, 但打开的时候office会弹出警告

winters
winters
jxl确实是先把已有数据加载到内存,然后再在后面追加的。这一点很讨厌。
0
Ryan-瑞恩
Ryan-瑞恩
使用POI。
0
崔钢
崔钢
多线程
0
風一樣的男子
風一樣的男子

如果量少,而且格式不是很复杂,就用最简单的方式

http://xiegengcai.iteye.com/blog/718254

0
溟溟
溟溟
多大的数据量啊
0
winters
winters

我做过一次jxl导出excel的压力测试。基本思路是分批读取数据库数据,按行数拆分excel。测试过200w行数据,jvm分了2g内存,每次从数据库读2w行数据,每个excel最多存6w行,超出之后就按文件名_0.xls,文件名_1.xls拆分。跑起来之后200w行数据12分钟导完,内存占用最高时大约1g,平均大约0.5~0.6g。我们的客户接受了这个结果。

导出剩余时间么……我们这边是设置了定时任务,半夜的时候运行。所以没考虑过这个

0
喜之郎
喜之郎

时间有两部分,第一部分是处理时间,时间主要花在这上面,可以通过定时向服务器发ajax请求获取处理进度,服务器可单独开启一线程处理此进度请求的响应。第二部分传输时间,一般浏览器上会自带进度条显示,可以不管。

0
喜之郎
喜之郎

服务器端action


/**
	 * @Description: 导出联系人Excel
	 * @param 
	 * @return void
	 * @throws Exception
	 */
	public void exportExcel() throws Exception{
		try{
			session.put("exportOver", "exportOver");//是否已经导完。
			//导出逻辑
			//...
		} catch (Exception e) {
			logger.error("导出通讯录联系人Excel时出错,错误信息:"+e.getMessage());
			e.printStackTrace();
		}finally{
			session.remove("exportOver");
		}
	}
	
	/**
	 * @Description: 判断是否excel是否已经导出完毕。
	 * @param 
	 * @return void
	 * @throws Exception
	 */
	public void isOverExportExcel() throws Exception{
		Map<String, String> result = new HashMap<String, String>();
		try {
			if(session.containsKey("exportOver")){
				result.put("status", "true");
			}else{
				result.put("status", "false");
			}
			JSONArray json = JSONArray.fromObject(result);
			PrintWriter printWriter = response.getWriter();
			logger.debug("json.toString()="+json.toString());
			printWriter.write(json.toString());
			printWriter.flush();
			printWriter.close();
		} catch (Exception e) {
			logger.error("查询导出excel是否完成时出错,错误信息:"+e.getMessage());
			e.printStackTrace();
		}
	}

客户端HTML:


<div style="display:none">
            <form action="Contact/contactPerson-exportExcel" method="post" name="exportExcelForm" id="exportExcelForm">
            </form>
        </div>

javascript:

function isOverExportExcel(){
	$("#exportExcelForm").submit();
	$('body').mask("加载中...");
	var interval=window.setInterval(function(){
		$.ajax({
			type : "post",
			url : "SMSSend/sms-isOverExportExcel",
	        success : function(data){
				if(data[0].status=="true"){
					
				}else{
					$('body').unmask();
					window.clearInterval(interval);
				}
	        },
	        error : function(xhr){
	            alert('操作失败');
	        },
	        dataType : 'json'
	    });
	},1000);
}

0
Secret
Secret

引用来自“喜之郎”的答案

服务器端action


/**
	 * @Description: 导出联系人Excel
	 * @param 
	 * @return void
	 * @throws Exception
	 */
	public void exportExcel() throws Exception{
		try{
			session.put("exportOver", "exportOver");//是否已经导完。
			//导出逻辑
			//...
		} catch (Exception e) {
			logger.error("导出通讯录联系人Excel时出错,错误信息:"+e.getMessage());
			e.printStackTrace();
		}finally{
			session.remove("exportOver");
		}
	}
	
	/**
	 * @Description: 判断是否excel是否已经导出完毕。
	 * @param 
	 * @return void
	 * @throws Exception
	 */
	public void isOverExportExcel() throws Exception{
		Map<String, String> result = new HashMap<String, String>();
		try {
			if(session.containsKey("exportOver")){
				result.put("status", "true");
			}else{
				result.put("status", "false");
			}
			JSONArray json = JSONArray.fromObject(result);
			PrintWriter printWriter = response.getWriter();
			logger.debug("json.toString()="+json.toString());
			printWriter.write(json.toString());
			printWriter.flush();
			printWriter.close();
		} catch (Exception e) {
			logger.error("查询导出excel是否完成时出错,错误信息:"+e.getMessage());
			e.printStackTrace();
		}
	}

客户端HTML:


<div style="display:none">
            <form action="Contact/contactPerson-exportExcel" method="post" name="exportExcelForm" id="exportExcelForm">
            </form>
        </div>

javascript:

function isOverExportExcel(){
	$("#exportExcelForm").submit();
	$('body').mask("加载中...");
	var interval=window.setInterval(function(){
		$.ajax({
			type : "post",
			url : "SMSSend/sms-isOverExportExcel",
	        success : function(data){
				if(data[0].status=="true"){
					
				}else{
					$('body').unmask();
					window.clearInterval(interval);
				}
	        },
	        error : function(xhr){
	            alert('操作失败');
	        },
	        dataType : 'json'
	    });
	},1000);
}

这个貌似行,之前使用SPRING  mvc的时候,也是通过流,返回json 。有时间试一试。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部