2014-12-01 5 views
0

У меня есть следующий контроллер для экспорта отчета как pdf, xls, csv. Код для этого приводится нижеЭкспорт JasperReport в pdf не работает

@Controller 
@RequestMapping(value = ServicePath.COMMON_PREFIX + "/test-report") 
public class ReportController 
{ 

@Autowired 
private UserService userService; 

public static JasperDesign jasperDesign; 
public static JasperPrint jasperPrint; 
public static JasperReport jasperReport; 
public static String reportTemplateUrl = "/lms-internet/src/main/webapp/report.jrxml"; 

@RequestMapping(method = RequestMethod.GET , value = "/pdf") 
public void generatePdf() 
{ 
    try{ 
    List<User> usersList = userService.findAll(); 

    JRDataSource JRdataSource = new JRBeanCollectionDataSource(usersList); 

    InputStream resourceAsStream = Thread.currentThread().getContextClassLoader() 
      .getResourceAsStream(reportTemplateUrl); 
    //get report file and then load into jasperDesign 
    jasperDesign = JRXmlLoader.load(resourceAsStream); 
    //compile the jasperDesign 
    jasperReport = JasperCompileManager.compileReport(jasperDesign); 

    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    OutputStream outputfile = new FileOutputStream(new File("c:/temp/person.xls")); 

    HashMap params = new HashMap(); 

    //fill the ready report with data and parameter 
    jasperPrint = JasperFillManager.fillReport(jasperReport, params, JRdataSource); 

    //coding for Excel 
    JRXlsExporter exporterXls = new JRXlsExporter(); 
    exporterXls.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); 
    exporterXls.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output); 
    exporterXls.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); 
    exporterXls.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); 
    exporterXls.exportReport(); 
    outputfile.write(output.toByteArray()); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

Когда я запустить его, я получаю следующее исключение:

net.sf.jasperreports.engine.JRException: java.net.MalformedURLException 

Может кто-то пожалуйста, скажите мне, что я сделал не так и как это исправить. А также скажите, где добавить файл jrxml.

+0

Вы пробовали абсолютный путь для .jrxml-файла? – user1791574

ответ

0

Это похоже на проект springboot; попробуйте перевести report.jrxml в src/main/resources и:

InputStream resourceAsStream = this.getClass().getResourceAsStream(reportTemplateUrl); 
+0

Я все еще получаю ту же ошибку. :( –

+0

Извините, я забыл, вы также должны изменить URL-адрес на «/report.jrxml» – qesuto

+0

Я тоже это пробовал. На этот раз ошибки больше нет, но ничего не происходит, файл не загружается. –

0

Вот как я это делаю. Упование это помогает

@RequestMapping(value = "/ProduceMyReportPDF", method = RequestMethod.GET, params = { "P1" }) 
public FileSystemResource AnalisiIncassiGS(
     @RequestParam(value = "P1") String p1, 
     HttpServletResponse response) { 

    try { 
     // START of block "using jasper library": try this if you want to produce a PDF using jasper library 
     String reportname = "c:\\TEMPLATE\\myreport.jasper"; 
     JasperReport jasperReport = (JasperReport) JRLoader.loadObject(new File(reportname)); 
     MyData d = new MyData(); // used to store parameters and datasource 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, d.getParametersHashMap(), d.getDataSource); 
     JasperExportManager.exportReportToPdfFile(jasperPrint, "c:\\outputpath\\p4.pdf"); 
     // END of block "using jasper library" 

     // START of block "using jasper server": ALTERNATIVELY try this if you want to produce a PDF using jasper server installed somewhere 
     String sJASPERSERVER_URL = "http://192.168.1.1:8080/jasperserver"; 
     String sPathToYourReport = "Path/to/your/report/myreport"; 
     String j_username = "jasperadmin"; 
     String j_password = "yourpassword"; 
     URL website = new URL(sJASPERSERVER_URL+sPathToYourReport + ".pdf"+ "?PARAM1="+ p1 +"&j_username="+j_username+"&j_password="+j_password ); 

     ReadableByteChannel rbc = Channels.newChannel(website.openStream()); 
     FileOutputStream fos = new FileOutputStream("c:\\outputpath\\p4.pdf"); 
     fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
     // END of block "using jasper server" 

     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition", "attachment; filename=p4.pdf"); 

     return new FileSystemResource("c:\\outputpath\\p4.pdf"); 

    } catch (Exception e) { 
     e.printStackTrace(); 

     return null; 
    } 
} 
Смежные вопросы