`

Struts2中实现JasperReport打印通用模块设计(兼容多种浏览器)

    博客分类:
  • java
阅读更多

/**
 * 报表Applet打印和pdf、xls导出
 *
 * @author liulin
 * @date 2010-3
 * **/
abstract public class ReportAction extends BaseAction {
    private static String basepath = "/WEB-INF/report/";// 报表存放地址
    private static String jrepath = "../applet/jre-6u21-windows-i586.exe";//jre-6u19-windows-i586.exe";// jre下载本地路径#Version=6,0,1,9
    public String reportname;// 无后缀的jrxml报表模板名字
    public String exportname;// 导出pdf、xls的文件名字
    public List reportList;// 数据明细集合
    public Map reportParams;// 报表参数

    /** 报表填充数据 **/
    abstract public List getReportList();

    public void setReportList(List reportList) {
        this.reportList = reportList;
    }

    public Map getReportParams() {
        return reportParams;
    }

    public void setReportParams(Map reportParams) {
        this.reportParams = reportParams;
    }

    public String getReportname() {
        return reportname;
    }

    public void setReportname(String reportname) {
        this.reportname = reportname;
    }

    public String getExportname() {
        return exportname;
    }

    public void setExportname(String exportname) {
        this.exportname = exportname;
    }

    public String getBasepath() {
        return basepath;
    }

    public void setBasepath(String basepath) {
        this.basepath = basepath;
    }

    public String getJrepath() {
        return jrepath;
    }

    public void setJrepath(String jrepath) {
        this.jrepath = jrepath;
    }

    /** applet打印预览,兼容ie、火狐等大多数浏览器 **/
    public String print() {
        Enumeration en = this.getRequest().getParameterNames();
        boolean isIE = isIE();
        String appleturl;
        String param = "";
        for (; en.hasMoreElements();) {
            String k = (String) en.nextElement();
            String v = this.getRequest().getParameter(k);
            if (v != null)
                param += k + "=" + v.trim() + "&";
            else
                param += k + "=&";
        }
        if(param.lastIndexOf("&")==param.length()-1)
            param=param.substring(0,param.length()-1);
        appleturl = this.getRequest().getRequestURI().replace("_print.action",
                "_APPLET.action")
                + "?" + param;

        String html = "<html><head><title></title>\n"
                + "<style type=\"text/css\">body {margin:0px 2px;padding:0px;}</style>\n"
                + "</head><body>\n";
        html+="<!--[if !IE]> Firefox and others will use outer object -->" +
                "<object classid=\"java:EmbeddedViewerApplet\" type=\"application/x-java-applet\" WIDTH=\"100%\" HEIGHT=\"100%\" >" +
                "<PARAM NAME=\"REPORT_URL\" " + " VALUE=\"" + appleturl + "\">" +
                "<PARAM NAME=\"CODEBASE\" VALUE=\"../applet\">" +
                "<param name=\"archive\" value=\"jasperreports-applet-3.7.1.jar,commons-logging.jar,commons-collections.jar\" />" +
                "<!--<![endif]-->" +
                "<!-- MSIE (Microsoft Internet Explorer) will use inner object -->" +
                "<object classid=\"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93\"" +
                " codebase=\""+jrepath+"\" WIDTH=\"100%\" HEIGHT=\"100%\" >" +
                "<PARAM NAME=\"CODEBASE\" VALUE=\"../applet\">" +
                "<param name=\"code\" value=\"EmbeddedViewerApplet.class\" />" +
                "<param name=\"archive\" value=\"jasperreports-applet-3.7.1.jar,commons-logging.jar,commons-collections.jar\" />" +
                "<PARAM NAME=\"REPORT_URL\" " + " VALUE=\"" + appleturl + "\">" +
                "<strong>这个浏览器没有安装 Java Plug-in.<br />" +
                "<a href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\">从最官方下载最新 Java Plug-in.</a></strong><br/>" +
                "<a href=\""+jrepath+"\">从本地下载   Java Plug-in</a><br/>" +
                "<a href=\"../applet/JavaRuntimeEnvironment.reg\">如果安装插件失败,手动修改注册列表来实现(注意:修改JavaRuntimeEnvironment.reg文件中的C:\\\\Program Files\\\\Java\\\\jre6\\\\为你系统jre安装目录;修改1.6.0_21为你当前安装版本)</a>" +
                "</object>" +
                "<!--[if !IE]> close outer object -->" +
                "</object>" +
                "<!--<![endif]-->";
        html += "</body></html>";
        this.renderHtml(html);
        return NONE;
    }

    /** 是否IE **/
    public boolean isIE() {
        HttpServletRequest request = this.getRequest();
        String agent = request.getHeader("USER-AGENT");
        boolean isIE = false;
        if (null != agent && -1 != agent.indexOf("MSIE"))
            isIE = true;
        return isIE;
    }

    /**
     * 根据浏览器类型导出文件中文名称,支持浏览器IE、Firefox、Safari
     *
     * @throws UnsupportedEncodingException
     **/
    public String getFileNameCode(String fileName)
            throws UnsupportedEncodingException {
        HttpServletRequest request = this.getRequest();
        String agent = request.getHeader("USER-AGENT");
        if (null != agent && -1 != agent.indexOf("MSIE")) {
            fileName = java.net.URLEncoder.encode(fileName, "UTF-8").replace(
                    "+", " ");
        } else if (null != agent && -1 != agent.indexOf("Firefox")) {
            fileName = new String(fileName.getBytes("UTF-8"), "iso8859-1");
        } else if (null != agent && -1 != agent.indexOf("Safari")) {
            fileName = java.net.URLEncoder.encode(fileName, "UTF-8").replace(
                    "+", " ");
        } else {
        }
        return fileName;
    }

    /** 导出xls文件 **/
    public String XLS() throws Exception {
        HttpServletResponse response = this.getResponse();
        String sourceFile = ServletActionContext.getServletContext()
                .getRealPath(basepath + reportname + ".jrxml");
        File parent = new File(sourceFile).getParentFile();
        JRXlsExporter exporter = new JRXlsExporter();
        JasperPrint jasperPrint = null;
        try {
            JasperCompileManager.compileReportToFile(sourceFile, new File(
                    parent, reportname + ".jasper").getAbsolutePath());
            JasperReport jasperReport = (JasperReport) JRLoader
                    .loadObject(sourceFile.replace(".jrxml", ".jasper"));
            List list = this.getReportList();
            jasperPrint = JasperFillManager.fillReport(jasperReport,
                    this.reportParams, new JRBeanCollectionDataSource(list));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != jasperPrint) {
            byte[] bytes;
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            exporter
                    .setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bo);
            exporter.exportReport();
            bytes = bo.toByteArray();
            if (bytes != null && bytes.length > 0) {
                response.reset();
                response.setContentType("application/xls");
                exportname = exportname + "__"
                        + this.getCurrentTime(new Date(), "yyyy年MM月dd日")
                        + ".xls";
                response.addHeader("Content-Disposition",
                        "attachment; filename=\"" + getFileNameCode(exportname)
                                + "\"");
                response.setContentLength(bytes.length);
                ServletOutputStream sos = response.getOutputStream();
                sos.write(bytes, 0, bytes.length);
                sos.flush();
                sos.close();
            }
        }
        return NONE;
    }

    /** 导出pdf文件 **/
    public String PDF() throws Exception {

        HttpServletResponse response = this.getResponse();

        String sourceFile = ServletActionContext.getServletContext()
                .getRealPath(basepath + reportname + ".jrxml");
        File parent = new File(sourceFile).getParentFile();
        JRPdfExporter exporter = new JRPdfExporter();
        JasperPrint jasperPrint = null;
        try {
            JasperCompileManager.compileReportToFile(sourceFile, new File(
                    parent, reportname + ".jasper").getAbsolutePath());
            JasperReport jasperReport = (JasperReport) JRLoader
                    .loadObject(sourceFile.replace(".jrxml", ".jasper"));
            List list = this.getReportList();
            jasperPrint = JasperFillManager.fillReport(jasperReport,
                    this.reportParams, new JRBeanCollectionDataSource(list));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != jasperPrint) {
            byte[] bytes;

            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            exporter
                    .setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bo);
            exporter.exportReport();
            bytes = bo.toByteArray();
            if (bytes != null && bytes.length > 0) {
                response.reset();
                response.setContentType("application/pdf");
                exportname = exportname + "__"
                        + this.getCurrentTime(new Date(), "yyyy年MM月dd日")
                        + ".pdf";
                response.addHeader("Content-Disposition",
                        "attachment; filename=\"" + getFileNameCode(exportname)
                                + "\"");
                response.setContentLength(bytes.length);
                ServletOutputStream sos = response.getOutputStream();
                sos.write(bytes, 0, bytes.length);
                sos.flush();
                sos.close();
            }
        }
        return NONE;
    }

    /**
     * applet输出
     *
     * **/
    public String APPLET() {
        File reportFile = new File(ServletActionContext.getRequest()
                .getRealPath(basepath + reportname + ".jasper"));
        String sourceFile = ServletActionContext.getServletContext()
                .getRealPath(basepath + reportname + ".jrxml");
        File parent = new File(sourceFile).getParentFile();
        JasperPrint jasperPrint = null;
        try {
            JasperCompileManager.compileReportToFile(sourceFile, new File(
                    parent, reportname + ".jasper").getAbsolutePath());
            JasperReport jasperReport = (JasperReport) JRLoader
                    .loadObject(reportFile);
            List list = this.getReportList();
            jasperPrint = JasperFillManager.fillReport(jasperReport,
                    this.reportParams, new JRBeanCollectionDataSource(list));
        } catch (Exception e) {
            System.out.println("打印出错了:"+e.getMessage());
            e.printStackTrace();
        }
        if (null != jasperPrint) {
            HttpServletResponse response = this.getResponse();// ServletActionContext.getResponse();
           
            response.setContentType("application/octet-stream");
            ServletOutputStream ouputStream;
            try {
                ouputStream = response.getOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
                oos.writeObject(jasperPrint);
                oos.flush();
                oos.close();
                ouputStream.flush();
                ouputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return NONE;
    }

}

1
1
分享到:
评论

相关推荐

    Struts2+JasperReport报表应用

    Struts2和JasperReport的整合是Web应用程序中创建动态报表的一种常见方法。JasperReport是一个功能强大的开源报表引擎,允许开发人员通过iReports这样的设计工具以可视化的形式创建复杂的报表模板。Struts2,作为一...

    struts2整合jasperreport

    在本文中,我们将深入探讨如何整合Struts2框架与JasperReport3来创建动态报表,并利用iReport工具进行报表设计。Struts2是一个流行的Java Web应用程序框架,它提供了MVC(模型-视图-控制器)架构,而JasperReport则...

    Struts2与Jasperreport报表结合

    Struts2和JasperReport是两个在Java Web开发中广泛使用的框架。Struts2作为MVC(模型-视图-控制器)架构的一部分,主要用于处理HTTP请求并管理应用程序流程,而JasperReport则是一个强大的报告生成工具,能够创建...

    struts2+Ireport+Jasperreport实现报表导出

    Struts2、iReport与JasperReport是Java开发中用于构建高效、动态Web应用程序和报表生成的工具。在这个项目中,这些技术结合在一起,提供了一种强大的报表导出解决方案。以下是对这些关键技术及其在项目中的应用的...

    struts2 jasperreport

    struts2 jasperreport

    整合Struts2.1+jasperreport

    Struts2.1和JasperReport的整合是Java Web开发中的一个重要话题,它涉及到Web应用程序的MVC(模型-视图-控制器)架构和数据报告的生成。Struts2.1是一个强大的MVC框架,而JasperReport则是一个用于创建复杂报表的...

    Struts2_JasperReport整合的例子

    Struts2和JasperReport是Java开发中两个重要的框架,它们在企业级应用开发中扮演着关键角色。Struts2是一个强大的MVC框架,用于构建动态、数据驱动的Web应用程序,而JasperReport则是一个开源的报表工具,可以生成...

    Struts2 + JasperReport应用一:导PDF,Excel,HTML显示

    Struts2和JasperReport是两个在Java Web开发中广泛使用的框架。Struts2作为MVC(模型-视图-控制器)架构的一部分,主要用于处理HTTP请求和管理应用程序流程,而JasperReport则是一个强大的报告生成工具,能够创建...

    jasperReport+struts2+jatoolsPrinter打印

    标题“jasperReport+struts2+jatoolsPrinter打印”涉及的是一个集成开发场景,主要集中在Java企业级应用中的报表生成和打印功能。jasperReport是一个强大的开源报表工具,能够帮助开发者创建复杂的报告设计;Struts2...

    Struts2与jasperReport简单示例

    将Struts2与JasperReport结合,可以实现Web应用中的动态报表生成和展示。 首先,我们需要理解Struts2的核心概念。Struts2框架基于拦截器模型,通过Action类处理用户请求,Action与视图(JSP)之间的交互由结果类型...

    maven struts2 jasperreport ireport亲测通过整合多家资源

    这个过程中,开发者需要理解Maven的依赖管理和生命周期,熟悉Struts2的配置和拦截器机制,掌握JasperReport的报表设计以及数据绑定,同时还需要有一定的前端知识来展示报表。通过整合这些工具,可以构建出一个强大的...

    Struts2集成jasperreport3.7.1所需的Jar包

    在Struts2中集成JasperReport,可以方便地在Web应用中添加报告功能。 在Struts2中集成JasperReport 3.7.1,你需要一些关键的库文件,这些文件已经在你提供的压缩包中。以下是每个文件及其在集成过程中的作用: 1. ...

    struts2利用jasperreport导出excel

    在这个主题中,我们将深入探讨如何在Struts2中集成JasperReport来导出Excel。 首先,我们需要理解Struts2的工作原理。Struts2框架基于拦截器模型,通过Action类处理用户请求,并返回结果到视图层。为了实现导出...

    struts2+jasperReport+ireport做报表总结

    Struts2、JasperReport 和 iReport 是开发Web报表应用中的常用技术栈。本文主要针对使用Struts2框架结合JasperReport5.0与iReport5.0进行报表开发时可能遇到的问题进行总结。 1. **报表预览问题**: - 数据源为空...

    整合Struts2+JasperReport Web报表应用示例

    Struts2 和 JasperReport 的整合是为了解决在 Web 应用中生成复杂报表的需求。JasperReport 是一个强大的开源报表引擎,它允许开发者通过设计模板来生成各种类型的报表,如 PDF、HTML、Excel 等。而 Struts2 是一个...

    Struts2整合JasperReport所需要的jar包

    将这两者整合,可以让Struts2应用程序轻松地实现动态报告的生成与展示。 在整合Struts2和JasperReport时,我们需要一些特定的jar包来确保两者能正确通信和协同工作。这些jar包通常包含了Struts2的核心组件、...

    struts2+ireport+jasperreport报表设计简单示例

    使用ireport和struts2进行报表设计的简单示例,生成普通报表和饼图、柱状图。java工程的lib里包含丰富的jar包,且很多都是从各个网站下载的最新版本,文件夹内还包含一些ireport和jasperreport文档,适合刚入门学习...

    jasperreport 生成pdf实现下载与打印

    标题中的“jasperreport生成pdf实现下载与打印”是指使用JasperReports库来创建PDF报告,并提供下载和打印功能。JasperReports是一个开源的Java报表工具,它允许开发者设计、生成和导出各种类型的报表,包括PDF、...

Global site tag (gtag.js) - Google Analytics