将web页面上显示的报表导出到excel文件里是一种很常见的需求。润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便。然而,当数据量较大的情况下,excel本身的支持最多65535行数据的问题便凸显出来。下面就给出大数据量导出到excel的解决方案。
首先,对于数据超过了65535行的问题,很自然的就会想到将整个数据分块,利用excel的多sheet页的功能,将超出65535行后的数据写入到下一个sheet页中,即通过多sheet页的方式,突破了最高65535行数据的限定。
具体做法就是,单独做一个链接,使用JSP导出,在JSP上通过程序判断报表行数,超过65535行后分SHEET写入。这样这个问题就得以解决了。
更进一步地说,在这种大数据量的报表生成和导出中,要占用大量的内存,尤其是在使用TOMCAT的情况下,JVM最高只能支持到2G内存,则会发生内存溢出的情况。此时的内存开销主要是两部分,一部分是该报表生成时的开销,另一部分是该报表生成后写入一个EXCEL时的开销。由于JVM的GC机制是不能强制回收的,因此,对于此种情形,我们给出一个变通的解决方案。
首先,将该报表设置起始行和结束行参数,在API生成报表的过程中,分步计算报表,比如一张20万行数据的报表,在生成过程中,可通过起始行和结束行分4-5次进行。这样,就降低了报表生成时的内存占用,在后面报表生成的过程中,如果发现内存不够,即可自动启动JVM的GC机制,回收前面报表的缓存。
导出EXCEL的过程,放在每段生成报表之后立即进行,改多个SHEET页为多个EXCEL,即在分步生成报表的同时分步生成EXCEL,则通过POI包生成EXCEL的内存消耗也得以降低。通过多次生成,同样可以在后面EXCEL生成所需要的内存不足时,有效回收前面生成EXCEL时占用的内存。
再使用文件操作,对每个客户端的导出请求在服务器端根据SESSIONID和登陆时间生成唯一的临时目录,用来放置所生成的多个EXCEL,然后调用系统控制台,打包多个EXCEL为RAR或者JAR方式,最终反馈给用户一个RAR包或者JAR包,响应客户请求后,再次调用控制台删除该临时目录。
使用这种方法,首先是通过分段运算和生成,有效降低了报表从生成结果到生成EXCEL的内存开销。其次是通过使用压缩包,响应给用户的生成文件体积大大缩小,降低了多用户并发访问时服务器下载文件的负担,有效减少多个用户导出下载时服务器端的流量,从而达到进一步减轻服务器负载的效果。
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<jsp:directive.page import="com.baidu.pe.dbdmarket.bean.ext.AnalysisBean"/>
<%
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
response.setContentType("text/html; charset=GBK");
response.setContentType("Content-type:application/vnd.ms-excel");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition","inline; filename=DBDMarket.xls");
%>
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<style>
body,td{mso-number-format:"\@";}
.desc{
white-space:normal;mso-ignore:colspan;width:30pt;height:14.25pt;
mso-style-parent:style0;
mso-number-format:"\@";
background:#99CCFF;
mso-pattern:auto none;mso-ignore:colspan;
}
</style>
</head>
<body>
<table border=1>
<%
AnalysisBean analysisBean = null;
if(request.getSession().getAttribute("ANALYSISBEAN") != null ){
analysisBean = (AnalysisBean)request.getSession().getAttribute("ANALYSISBEAN");
out.print(analysisBean.toTableString());
}
%>
</table>
</body>
</html>
分享到:
相关推荐
本篇文章主要探讨了在使用JSP导出Excel时可能会遇到的一般性问题及其解决方案。 一、导出Excel的基本流程 1. 数据准备:首先,你需要从数据库或其他数据源获取要导出的数据,将其组织成二维数组或集合。 2. 创建...
总之,JSP导出Excel和Word是常见的功能需求,通过Apache POI库可以轻松实现。正确设置响应头和使用流处理可以确保文件能被正确下载,同时根据实际需求调整数据处理和样式设置,能够创建符合业务需求的导出文件。
一、JSP导出Excel 1. **准备库**:在JSP中导出Excel,通常会用到Apache POI库。这是一个用于读写Microsoft Office格式文件的Java库,包括Excel。首先,需要将POI库添加到项目依赖中。 2. **创建Excel工作簿**:...
#### 结合JSP导出Excel 在Web应用中,通常会结合JSP页面来动态生成Excel文件并提供下载。这涉及到设置正确的HTTP响应头,以便浏览器识别文件类型和进行下载。例如,在JSP中可以这样设置: ```jsp *,javax.servlet....
"jsp导出excel"就是这样一个功能,它涉及到的技术主要包括JSP、Servlet、Apache POI库以及HTTP响应头的设置。 首先,要理解JSP如何导出Excel,我们需要知道Servlet在其中的作用。Servlet是Java Web应用程序的一部分...
### JSP导出Excel并支持分Sheet导出的方法详解 #### 概述 在Web开发领域,特别是使用Java Server Pages (JSP)进行后端处理的应用程序中,经常需要将数据库中的数据导出到Excel文件中供用户下载或进一步处理。这种...
标题中的“JSP导出Excel.docx”表明我们要讨论的主题是使用Java服务器页面(JSP)来生成Excel文件。描述部分未提供具体内容,但我们可以基于标题和标签来深入讲解。 在Java开发中,导出Excel文件是常见的需求,通常...
关于jsp导出excel用javascript实现
在JSP页面导出Excel时,我们会用到POI库来创建和操作Excel工作簿、工作表和单元格。首先,确保项目中已经引入了Apache POI的相关依赖。 2. **服务器端代码** 在后端Java代码中,你需要创建一个Servlet或者...
在IT行业中,尤其是在...总结来说,JSP导出Excel并保持数字格式的关键在于创建和应用自定义的单元格样式,避免Excel自动转换为科学计数法。通过Apache POI库,我们可以灵活地控制Excel文件的生成,满足各种格式需求。
在IT行业中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而“jsp 导出excel”这个主题则是关于如何使用JSP来生成并导出数据到Excel文件中的过程。这种功能通常在企业级应用中非常常见,比如报表生成、...
在JSP中导出Excel文件是一项常见的...总之,JSP导出Excel文件涉及的主要技术点有:JExcelAPI的使用、HTTP响应头的设置、以及样式和数据的组织。通过这些技术,你可以方便地在Web应用中为用户提供Excel文件的下载服务。
【标题】:“ireport利用jsp导出excel&pdf;报表源代码” 【描述】:“本人验证过的jsp代码,ireport导出pdf excel报表” 在Java Web开发中,生成各种类型的报表是常见的需求,例如用于数据分析、业务统计或者数据...
JSP导出Excel表格实例知识分享: JSP(Java Server Pages)是一种基于Java技术用于开发动态网页的服务器端技术,它的主要作用是在HTML网页中嵌入Java代码。使用JSP导出Excel表格,可以让用户将网页中的表格数据转换...
**二、导出Excel到JSP** 1. **创建Excel文件**:在服务器端,使用Apache POI创建一个新的工作簿对象,然后添加工作表。根据需要设置标题行和其他格式。 2. **填充数据**:从数据库或其他数据源获取数据,使用POI ...
本人试过了可以用,做jsp程序导出excel功能的可以参考下,下载后按照模版进行修改