2012-06-07 3 views
3

Я использую jasper-reports 4.5.0, spring 3.0.5RELEASE для создания отчетов. Теперь я сгенерирован в форматах html, csv, pdf. Но мой клиент хочет, чтобы отчет в (формат .doc). Как я могу сгенерировать отчет в этом формате .doc.Создание отчета в текстовом формате с использованием jasper

+0

Вы можете попробовать использовать [JRDocxExporter] (http://jasperreports.sourceforge.net/api/net/sf/jasperreports /engine/export/ooxml/JRDocxExporter.html) и [JRRtfExporter] (http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/export/JRRtfExporter.html) –

+0

Спасибо, Алекс. org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView, как и у нас есть класс для просмотра отчета в формате .doc – user1434746

+0

@Alex, если вы хотите опубликовать ответ на основе вашего комментария, и я удалю его ответ. –

ответ

3

Просто, чтобы обеспечить пример кода на основе предположения Алекса:

Чтобы использовать 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 - это список просмотра JaperReport что обеспечивает Sprig Fraework.

У них, похоже, нет специально для формата документа. Вероятно, вы, вероятно, напишите свой собственный, расширив AbstractJasperReportsSingleFormatView. Кажется, вам нужно будет только реализовать метод createExporter().

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

Привет, Спасибо за ваше решение. Но в моем случае я не могу так использовать. Потому что мой поток в точности похож на http://chathurangat.blogspot.in/2012/02/jasperreport-with-spring-mvc-fully. html this.I меня настраивает классы представления для соответствующего имени вида. Подобно этому есть предопределенный класс представления для формата rtf или doc. – user1434746

+0

setParameter устарел, посмотрите http://stackoverflow.com/a/30486677/387454 – hering

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 Document.

4

Для будущих читателей 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(); 
Смежные вопросы