【问题标题】:Generating the report in word format using jasper使用 jasper 生成 word 格式的报告
【发布时间】:2012-06-07 07:30:42
【问题描述】:

我正在使用 jasper-reports 4.5.0、spring 3.0.5RELEASE 集成来生成报告。直到现在我以 html、csv、pdf 格式生成报告。但我的客户也想要 word 格式的报告(.doc 格式) .如何生成这种 .doc 格式的报告。

【问题讨论】:

  • 你可以尝试使用JRDocxExporterJRRtfExporter
  • 谢谢亚历克斯。 org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView 像这样我们有什么类可以查看.doc格式的报告
  • @Alex 如果您想根据您的评论发布答案,请继续,我将删除我的答案。

标签: java spring jasper-reports


【解决方案1】:

对于未来的读者,不推荐使用 setParameter,您应该像这样使用导出器:

JasperReports 6.1.0

import java.io.File;

//import net.sf.jasperreports.engine.export.JRRtfExporter;
//import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleWriterExporterOutput;

File sourceFile = new File("*.jasper");

JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile);

File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".docx|.rtf");

//JRDocxExporter exporter = new JRDocxExporter();
//JRRtfExporter exporter = new JRRtfExporter();

exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(destFile));

exporter.exportReport();

【讨论】:

    【解决方案2】:

    只是根据Alex的建议提供一个示例代码:

    要使用 JRRtfExporter:

    protected byte[] exportReportToRtf(JasperPrint jasperPrint) throws JRException{
       JRRtfExporter exporter = new JRRtfExporter();
       ByteArrayOutputStream baos = new ByteArrayOutputStream();    
       exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
       exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
       exporter.exportReport(); 
       return baos.toByteArray();
    }
    

    类似于我们JRDocxExporter:

    protected byte[] exportReportToRtf(JasperPrint jasperPrint) throws JRException{
       JRDocxExporter exporter = new JRDocxExporter();
       ByteArrayOutputStream baos = new ByteArrayOutputStream();    
       exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
       exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
       exporter.exportReport(); 
       return baos.toByteArray();
    }
    

    根据评论编辑:

    Here 是 Sprig Fraework 提供的 JaperReport 视图列表。

    他们似乎没有专门针对 doc 格式的文件。您可能会通过扩展AbstractJasperReportsSingleFormatView 编写自己的代码。看来您只需要实现createExporter() 方法。

    protected JRExporter createExporter(){
         return new JRDocxExporter();
    }
    

    【讨论】:

    【解决方案3】:

    基于JRDocxExporter,可以扩展AbstractJasperReportsSingleFormatView

    public class CustomJasperWordReportsSingleFormatView extends AbstractJasperReportsSingleFormatView {
    
    @Override
    protected void renderReport(JasperPrint populatedReport, Map<String, Object> model, HttpServletResponse response) throws Exception {
         super.renderReport(populatedReport, model, response);
    }
    
    @Override
    protected JRExporter createExporter() {
        return new JRDocxExporter();
    }
    
    @Override
    protected boolean useWriter() {
        // TODO Auto-generated method stub
        return false;
    }
    

    }

    并在您的@Controller 中使用HttpServletResponseWrapper 包装响应以获取碧玉报告生成的字节数组:

    public byte[] getByteArrayWordReport(String jasperViewName, ModelMap model, HttpServletResponse httpServletResponse,HttpServletRequest httpServletRequest) throws Exception{
    
    View view=xmlViewResolver.resolveViewName(jasperViewName, null);
    if(view==null){
         log.error("Report not found:"+jasperViewName);
    }
    final ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        HttpServletResponseWrapper httpServletResponseWrapper=new HttpServletResponseWrapper(httpServletResponse){
               @Override
               public PrintWriter getWriter() throws IOException {
                      return new PrintWriter(byteArrayOutputStream);
               }
               public ServletOutputStream getOutputStream() throws IOException {
                      return new ServletOutputStream() {
                             @Override
                             public void write(int b) throws IOException {
                                   byteArrayOutputStream.write(b);                 
                             }
                      };
               }
            @Override
            public void addCookie(Cookie cookie) {
            }
            @Override
            public void addDateHeader(String name, long date) {
            }
            @Override
            public void setHeader(String name, String value) {
            }
            @Override
            public void addHeader(String name, String value) {
            }
            @Override
            public void setIntHeader(String name, int value) {
            }
            @Override
            public void addIntHeader(String name, int value) {
            }
            @Override
            public void setContentLength(int len) {
            }
            @Override
            public void setContentType(String type) {
            }
        };
        view.render(model, httpServletRequest, httpServletResponseWrapper);
        return byteArrayOutputStream.toByteArray();
    }
    

    之后你就有了代表 Word 文档的字节数组。

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多