JasperRepor导出报表通用类
来源:互联网 发布:淘宝主播经济公司 编辑:程序博客网 时间:2024/05/17 23:45
1.ReportUtils.java通用类
/** * 使用jasperReport做报表时的工具支持类.有两个用途,生成jasperPrint对象,和设置导出时的session */public class ReportUtils {private HttpServletRequest request;private HttpServletResponse response;private HttpSession session;public ReportUtils(HttpServletRequest request, HttpServletResponse response) {this.request = request;this.session = request.getSession();this.response = response;}/** * 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 参数说明和动态表头的用法参考上一方法 */public JasperPrint getJasperPrint(String filePath, Map parameter,JRDataSource dataSource) throws JRException {JasperReport jasperReport = null;try {jasperReport = (JasperReport) JRLoader.loadObject(filePath);return JasperFillManager.fillReport(jasperReport, parameter,dataSource);} catch (JRException e) {e.printStackTrace();}return null;}/** * 获得JasperPrint对象;自定义填充报表时的parameter和connection */public JasperPrint getJasperPrint(String filePath, Map parameter,Connection conn) throws JRException {JasperReport jasperReport = null;try {jasperReport = (JasperReport) JRLoader.loadObject(filePath);return JasperFillManager.fillReport(jasperReport, parameter,conn);} catch (JRException e) {e.printStackTrace();}return null;}/** * 通过传入List类型数据源获取JasperPrint实例 */public JasperPrint getPrintWithBeanList(String filePath, Map parameter,List list) throws JRException {JRDataSource dataSource = new JRBeanCollectionDataSource(list);return getJasperPrint(filePath, parameter, dataSource);}/** * 传入类型,获取输出器 * * @param docType * @return */public JRAbstractExporter getJRExporter(DocType docType) {JRAbstractExporter exporter = null;switch (docType) {case PDF:exporter = new JRPdfExporter();break;case HTML:exporter = new JRHtmlExporter();break;case XLS:exporter = new JExcelApiExporter();break;case XML:exporter = new JRXmlExporter();break;case RTF:exporter = new JRRtfExporter();break;case CSV:exporter = new JRCsvExporter();break;case TXT:exporter = new JRTextExporter();break;}return exporter;}/** * 获得相应类型的Content type * @param docType * @return */public String getContentType(DocType docType){String contentType="text/html";switch(docType){case PDF:contentType = "application/pdf";break;case XLS:contentType = "application/vnd.ms-excel";break;case XML:contentType = "text/xml";break;case RTF:contentType = "application/rtf";break;case CSV:contentType = "text/plain";break;}return contentType;}public void setAttrToPage(JasperPrint jasperPrint, String report_fileName,String report_type) {session.setAttribute("REPORT_JASPERPRINT", jasperPrint);session.setAttribute("REPORT_FILENAME", report_fileName);session.setAttribute("REPORT_TYPE", report_type);}/** * 定义了报表输出类型,固定了可输出类型 */public static enum DocType {PDF, HTML, XLS, XML, RTF, CSV, TXT}/** * 编译报表模板文件jrxml,生成jasper二进制文件 * * @param jrxmlPath * @param jrsperPath * @throws JRException */public void complieJrxml(String jrxmlPath, String jasperPath)throws JRException {JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);}/** * 输出html静态页面,必须注入request和response * * @param jasperPath * @param params * @param sourceList * @param imageUrl * 报表文件使用的图片路径,比如 ../servlets/image?image= * @throws JRException * @throws IOException * @throws ServletException */public void servletExportHTML(String jasperPath, Map params,List sourceList, String imageUrl) throws JRException, IOException,ServletException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");JRAbstractExporter exporter = getJRExporter(DocType.HTML);JasperPrint jasperPrint = getPrintWithBeanList(jasperPath, params,sourceList);session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);PrintWriter out = response.getWriter();exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示pxexporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>"); exporter.exportReport();}/** * 输出html静态页面,必须注入request和response * * @param jasperPath * @param params * @param sourceList * @param imageUrl * 报表文件使用的图片路径,比如 ../servlets/image?image= * @throws JRException * @throws IOException * @throws ServletException */public void servletExportHTML(String jasperPath, Map params,Connection conn, String imageUrl) throws JRException, IOException,ServletException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");JRAbstractExporter exporter = getJRExporter(DocType.HTML);JasperPrint jasperPrint = getJasperPrint(jasperPath, params,conn);session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);PrintWriter out = response.getWriter();exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, imageUrl);exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示pxexporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);exporter.exportReport();}/** * 生成不同格式报表文档 * * @param docType * 文档类型 * @param jasperPath */public void servletExportDocument(DocType docType, String jasperPath,Map params, List sourceList, String fileName) throws JRException,IOException, ServletException {if (docType == DocType.HTML) {servletExportHTML(jasperPath, params, sourceList, fileName);return;}JRAbstractExporter exporter = getJRExporter(docType);// 获取后缀String ext = docType.toString().toLowerCase();if (!fileName.toLowerCase().endsWith(ext)) {fileName += "." + ext;}// 判断资源类型if (ext.equals("xls")) {// 要想获得更好的视觉效果,可以添加以下代码 exporter.setParameter( JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); // 删除记录最下面的空行 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);// 删除多余的ColumnHeader exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND , Boolean.FALSE);// 显示边框}response.setContentType(getContentType(docType));response.setHeader("Content-Disposition", "attachment; filename=\""+ URLEncoder.encode(fileName, "UTF-8") + "\"");exporter.setParameter(JRExporterParameter.JASPER_PRINT,getPrintWithBeanList(jasperPath, params, sourceList));OutputStream outStream = null;PrintWriter outWriter = null;if(ext.equals("csv")){//解决中文乱码问题response.setCharacterEncoding("GBK");outWriter = response.getWriter();exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);}else{outStream = response.getOutputStream();exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);if(ext.equals("txt")){exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80)); exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25)); exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");}}try {exporter.exportReport();} catch (JRException e) {throw new ServletException(e);} finally {if (outStream != null) {try {outStream.close();} catch (IOException ex) {}}}}/** * 生成不同格式报表文档 * * @param docType * 文档类型 * @param jasperPath */public void servletExportDocument(DocType docType, String jasperPath,Map params, Connection conn, String fileName) throws JRException,IOException, ServletException {if (docType == DocType.HTML) {servletExportHTML(jasperPath, params, conn, fileName);return;}JRAbstractExporter exporter = getJRExporter(docType);// 获取后缀String ext = docType.toString().toLowerCase();if (!fileName.toLowerCase().endsWith(ext)) {fileName += "." + ext;}// 判断资源类型if (ext.equals("xls")) {// 要想获得更好的视觉效果,可以添加以下代码 exporter.setParameter( JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); // 删除记录最下面的空行 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);// 删除多余的ColumnHeader exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND , Boolean.FALSE);// 显示边框}response.setContentType(getContentType(docType));response.setHeader("Content-Disposition", "attachment; filename=\""+ URLEncoder.encode(fileName, "UTF-8") + "\"");exporter.setParameter(JRExporterParameter.JASPER_PRINT,getJasperPrint(jasperPath, params, conn));OutputStream outStream = null;PrintWriter outWriter = null;if(ext.equals("csv")){//解决中文乱码问题response.setCharacterEncoding("GBK");outWriter = response.getWriter();exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);}else{outStream = response.getOutputStream();exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);if(ext.equals("txt")){exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80)); exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25)); exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");}}try {exporter.exportReport();} catch (JRException e) {throw new ServletException(e);} finally {if (outStream != null) {try {outStream.close();} catch (IOException ex) {}}}}}
2.用Servlet导出生成文件
public class JapserReportServlet extends HttpServlet{private static final long serialVersionUID = 1L;public void init(){}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{String docType = request.getParameter("docType");String jasperFile = request.getParameter("jasperFile");String isBean = request.getParameter("isBean");//数据提供方式String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");//jasper文件放在应用根目录的reports中String jasperPath = request.getSession().getServletContext().getRealPath("/") + "/reports/"+ jasperFile;if(StringUtils.isNotEmpty(jasperPath)){if(StringUtils.isEmpty(fileName)){fileName = "报表";}ReportUtils jasperReport = new ReportUtils(request,response);//传递报表中(SQL)用到的参数值:$P{ProjectName}Map params = new HashMap(); //"Name"是报表中定义过的一个参数名称,其类型为String 型 //params.put("ProjectName", new String("Project1"));try {if(isBean.equals("1")){jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getSourceList(), fileName);}else{jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getConnection(), fileName);}} catch (JRException e) {e.printStackTrace();} catch (ServletException e) {e.printStackTrace();}}else{response.setCharacterEncoding("UTF-8");response.sendError(-1, "出错:jasperPath参数是必须的!");}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ this.doGet(request, response); } public void destroy() { super.destroy(); } public static DocType getEnumDocType(String docType){ DocType type = DocType.HTML; docType = docType.toUpperCase(); if(docType.equals("PDF")){ type = DocType.PDF; }else if(docType.equals("XLS")){ type = DocType.XLS; }else if(docType.equals("XML")){ type = DocType.XML; }else if(docType.equals("RTF")){ type = DocType.RTF; }else if(docType.equals("CSV")){ type = DocType.CSV; }else if(docType.equals("TXT")){ type = DocType.TXT; } return type; } /***数据对象****/ public static List getSourceList(){ List<TUser> sourceList = new ArrayList<TUser>();// 测试数据源for (int i = 0; i < 15; i++) {TUser user = new TUser();user.setId(1000 + i);user.setUsername("user_" + i);user.setPassword("*******");sourceList.add(user);} return sourceList; } /****数据库连接****/public static Connection getConnection() {Connection conn = null;String driver = "com.mysql.jdbc.Driver";String url = "jdbc:mysql://127.0.0.1/springapp?useUnicode=true&characterEncoding=gb2312";try {Class.forName(driver);conn = DriverManager.getConnection(url,"root", "root");return conn;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException ex) {ex.printStackTrace();}return null;}}
3.web.xml中的Servlet配置
<servlet> <servlet-name>JapserReportServlet</servlet-name> <servlet-class> com.logcd.servlet.JapserReportServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>JapserReportServlet</servlet-name> <url-pattern>/reports</url-pattern> </servlet-mapping>
4.调用
function jasperReport(docType){var jasperFile = "Regist_User_Group.jasper";var paramStr = "?docType=" + docType + "&jasperFile="+jasperFile + "&fileName=" +'人员名单列表' + "&isBean=0";var url = getCurrentDirectory() + "/reports" + paramStr;window.open(url);}/***获取当前路径***/function getCurrentDirectory(){var locHref = location.href;var locArray = locHref.split("/"); delete locArray[locArray.length-1]; var dirStr = locArray.join("/"); return dirStr;}
报表类型<select name="reportType" id="reportType"> <option value="html">HTML</option> <option value="pdf">PDF</option> <option value="rtf">RTF</option> <option value="xls">XLS</option> <option value="xml">XML</option> <option value="csv">CSV</option> <option value="txt">TXT</option> </select> <button onclick="jasperReport($('reportType').value);">Reports</button>
5.直接生产文件
public class FirstJasperReports { static String fileName="E:/workspace/js_test/jrxml/HelloWorld.jrxml"; public static void main(String[] args)throws Exception{ long startTime=System.currentTimeMillis(); //将报表的定义文件HelloWorld.jrxml编译成HelloWorld.jasper文件 String jasperFile=JasperCompileManager.compileReportToFile(fileName); //向HelloWorld.jasper文件中填充数据,这一步将生产出HelloWorld .jrprint文件 String jrprintFile=JasperFillManager.fillReportToFile(jasperFile,null,new JREmptyDataSource()); //将.jrprint文件转换成HTML格式 JasperExportManager.exportReportToHtmlFile(jrprintFile); //将.jrprint文件转换成PDF格式 //JasperExportManager.exportReportToPdfFile(jrprintFile); //将.jrprint文件转换成XML格式 JasperExportManager.exportReportToXmlFile(jrprintFile,false); //将.jrprint文件转换成XLS格式(即Excel文件),需要用到POI类库. File sourceFile = new File(jrprintFile); JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile); File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".xls"); JRXlsExporter exporter = new JRXlsExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, destFile.toString()); exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); exporter.exportReport(); long endTime=System.currentTimeMillis(); long time=(endTime-startTime)/1000; System.out.println("success with "+time+" s"); }}
- JasperRepor导出报表通用类
- 报表 导入 导出通用类
- Jasperreport+iReport报表设计(二)通用导出页面
- php导出excel报表类
- JAVA导出Excel通用类
- java导出excel通用类
- 导出报表
- 报表导出
- 报表导出
- 导出报表
- iReport&JasperRepor使用总结
- C#导入导出Excel通用类(SamWang)
- java 导出xls 通用工具类
- C#通用类库--导出数据
- 通用的excel导入导出类
- excel导入导出通用工具类
- HTML报表通用模版
- 发布一个水晶报表的通用类:CrystalHelper
- 记录编程中的英文单词的缩写和全称(持续记录)
- 为应用“瘦身”!给 Android 应用开发者的十个建议
- 异或运算
- 数组冒泡排序
- JS--事件
- JasperRepor导出报表通用类
- java帮助文档
- 新浪微博开放平台PHP 类 WeiboClient 说明
- Lsnrctl status/start 卡住问题及解决办法
- 常量的指针与指针常量
- Oracle报ORA-01722错误的排查经验
- 关于UBUNTU网络若干问题的解决办法
- PKI技术及应用开发指南
- 什么时候用抽象类什么时候用接口 .