1.ReportUtils.java通用类
2.用Servlet导出生成文件
3.web.xml中的Servlet配置
4.调用
5.直接生成文件
- /**
- * 使用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);//不显示px
- exporter.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);//不显示px
- exporter.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");
- }
- }