Java 使用jasper以word格式生成报告

Java 使用jasper以word格式生成报告,java,spring,jasper-reports,Java,Spring,Jasper Reports,我正在使用jasper reports 4.5.0、spring 3.0.5 Release integration生成报告。到目前为止,我是以html、csv、pdf格式生成的。但我的客户也希望以word格式(.doc格式)生成报告。我如何才能以这种.doc格式生成报告。仅提供一个基于Alex建议的示例代码: 要使用JRRtfExporter,请执行以下操作: protected byte[] exportReportToRtf(JasperPrint jasperPrint) throws

我正在使用jasper reports 4.5.0、spring 3.0.5 Release integration生成报告。到目前为止,我是以html、csv、pdf格式生成的。但我的客户也希望以word格式(.doc格式)生成报告。我如何才能以这种.doc格式生成报告。

仅提供一个基于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();
}
根据评论进行编辑:

是Sprig Fraework提供的JaperReport视图列表

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

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

基于JRDocxExporter,您可以扩展:


之后,您就有了表示Word文档的字节数组。

对于将来的读者,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();

你可以试着使用并感谢你,亚历克斯。org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView像这样我们有没有在.doc中查看报告的类format@Alex如果您想根据您的评论发布答案,请继续,我将删除我的答案。您好,感谢您的解决方案。但在我的情况下,我不能这样使用。因为我的流程与此完全相同。我正在将视图类配置为各自的视图名称。类似于此,rtf或doc format有任何预定义的视图类。setParameter不推荐使用,请查看
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();
}
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();