简体   繁体   English

使用jasper以Word格式生成报告

[英]Generating the report in word format using jasper

我正在使用jasper-reports 4.5.0,spring 3.0.5RELEASE集成来生成报告。到目前为止,我以html,csv,pdf格式生成。但是我的客户也希望以Word格式(.doc格式)生成报告。我以这种.doc格式生成报告。

For future readers setParameter is deprecated and you should use exporters like this: 对于以后的读者,不建议使用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();

Just to provide an example code based on Alex's suggestion: 仅提供一个基于Alex的建议的示例代码:

To use JRRtfExporter: 要使用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();
}

Similarly to us JRDocxExporter: 与我们的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();
}

Edit based on comment: 根据评论进行编辑:

Here is the list of the JaperReport Views that the Sprig Fraework provides. 是Sprig Fraework提供的JaperReport视图的列表。

They do not seem to have one specifically for the doc format. 他们似乎没有专门针对doc格式的文件。 You will probably have write your own by extending AbstractJasperReportsSingleFormatView . 您可能会通过扩展AbstractJasperReportsSingleFormatView来编写自己的代码。 It seems you would only need to implement the createExporter() method. 看来您只需要实现createExporter()方法。

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

Based on JRDocxExporter, you can extend AbstractJasperReportsSingleFormatView : 基于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;
}

} }

and in your @Controller you wrap the response with HttpServletResponseWrapper to get the byte array generated by the jasper report: 然后在您的@Controller ,使用HttpServletResponseWrapper包装响应,以获取由jasper报告生成的字节数组:

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();
}

After that you have the byte array representing the Word Document. 之后,您将得到代表Word文档的字节数组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM