package dsic.report; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.util.Calendar; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.export.JExcelApiExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; import net.sf.jasperreports.engine.util.JRLoader; import dsic.common.ConnectionPool; /** * jasper 리포트를 이용 xls파일을 생성하는 서블릿 * @author 이용환 * @since 2007-07-27 */ public class ReportXlsServlet extends HttpServlet { private static final long serialVersionUID = 7187805648978692761L; public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { long startTime = System.currentTimeMillis(); System.out.println(this.getClass().getName() + " 리포팅 시작......................................................................................."); ServletContext context = this.getServletConfig().getServletContext(); Connection con = null; ConnectionPool pool = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { // jasper로 넘기는 파리미터 Map parameters = new HashMap(); // jrxml 파일 경로 String reportDir = null; // jrxml 파일 이름 String reportFile = null; // 리포트 제목.. 엑셀의 경우 파일명이 된다. String reportTitle = null; //http 파라미터 받아서 jasper report의 파라미터로 셋팅한다. //단, 파라미터 이름이 reportDir인 경우, 실제경로를 구하기 위한 처리를 한다. Enumeration enumParameter = request.getParameterNames(); while(enumParameter.hasMoreElements()){ String paramName = (String)enumParameter.nextElement(); System.out.println(paramName+" : "+request.getParameter(paramName)); if (paramName.equals("reportDir")){ parameters.put(paramName, context.getRealPath("/" + request.getParameter(paramName) + "/")); reportDir = request.getParameter(paramName); }else if(paramName.equals("reportFile")){ parameters.put(paramName, request.getParameter(paramName)); reportFile = request.getParameter(paramName); }else if(paramName.equals("reportTitle")){ parameters.put(paramName, request.getParameter(paramName)); reportTitle = request.getParameter(paramName); }else{ parameters.put(paramName, request.getParameter(paramName)); } } // 디비 연결 pool = ConnectionPool.getInstance(); con = pool.getConnection(); // compile // -------------------------------------------------------------------------------------------------------------------------------------- // 컴파일 결과 파일 File compiledFile = new File(context.getRealPath("/" + reportDir + "/" + reportFile + ".jasper")); System.out.println("compiledFile : " + context.getRealPath("/" + reportDir + "/" + reportFile + ".jasper")); System.out.println("reportFile.exists() : " + compiledFile.exists()); if (!compiledFile.exists()) { JasperCompileManager.compileReportToFile(context.getRealPath("/" + reportDir + "/" + reportFile + ".jrxml")); } JasperReport jasperReport = (JasperReport) JRLoader.loadObject(compiledFile.getPath()); // fill // ------------------------------------------------------------------------------------------------------------------------------------------ JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, con); // XLS // JExcelApiExporter 그래프 나옴.. JRXlsExporter 그래프 안나옴.. JExcelApiExporter exporter = new JExcelApiExporter(); // JRXlsExporter exporter = new JRXlsExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); exporter.exportReport(); // export // -------------------------------------------------------------------------------------------------------------------------------------- byte[] bytes = baos.toByteArray(); if (bytes != null && bytes.length > 0) { response.setContentType("application/vnd.ms-excel"); response.setContentLength(bytes.length); response.setHeader("Content-disposition", "attachment; filename=\"" + new String(reportTitle.getBytes(), "ISO-8859-1") + ".xls\""); ServletOutputStream ouputStream = response.getOutputStream(); try { ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); } finally { if (ouputStream != null) { try { ouputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } // fianlly } // if long endTime = System.currentTimeMillis(); System.out.println("시작시간 : " + formatTime(startTime)); System.out.println("종료시간 : " + formatTime(endTime)); System.out.println("소요시간(초.0f) : " + ( endTime - startTime )/1000.0f +"초"); } catch (Exception e) { e.printStackTrace(); } finally { try { pool.releaseConnection(con); } catch (Exception e) { e.printStackTrace(); } } } public String formatTime(long tempTime) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(tempTime); return (c.get(Calendar.HOUR_OF_DAY) + "시 " + c.get(Calendar.MINUTE) + "분 " + c.get(Calendar.SECOND) + "." + c.get(Calendar.MILLISECOND) + "초"); } }