JSP 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을 내보내는 과정은 각 단락에서 보고서를 생성한 후에 바로 진행한다. 여러 개의 시트 페이지를 여러 개의 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>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.