Não sei como retornar o relatório para o cliente ao invés de crialo em um diretório
@ControllerpublicclassRelatorioController{@AutowiredprivateHttpServletRequestrequest;@AutowiredprivateTemporaryMachineIdDaotempMachineDao;@RequestMapping(value="/report/relatorio",method=RequestMethod.POST,produces=MediaType.APPLICATION_JSON_VALUE)publicStringform(@RequestParam("id[]")intid[],@RequestParam("dateIni")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateIni,@RequestParam("dateFim")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateFim,@RequestParam("horaInit")StringhoraInit,@RequestParam("minutoInit")StringminutoInit,@RequestParam("horaFim")StringhoraFim,@RequestParam("minutoFim")StringminutoFim)throwsJRException,SQLException,IOException{Calendarcal=Calendar.getInstance();CalendarcalDateIni=Calendar.getInstance();calDateIni.setTime(dateIni);calDateIni.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaInit));calDateIni.set(Calendar.MINUTE,Integer.valueOf(minutoInit));CalendarcalDateFim=Calendar.getInstance();calDateFim.setTime(dateFim);calDateFim.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaFim));calDateFim.set(Calendar.MINUTE,Integer.valueOf(minutoFim));Relatoriorelatorio=newRelatorio();relatorio.setTag((int)cal.getTimeInMillis());relatorio.setMachinesIds(id);relatorio.setDateIni(calDateIni.getTime());relatorio.setDateFim(calDateFim.getTime());System.out.println(relatorio.toString());for(inti=0;i<relatorio.getMachinesIds().length;i++){TemporaryMachineIdtempMachine=newTemporaryMachineId();tempMachine.setMachineId(relatorio.getMachinesIds()[i]);tempMachine.setTag(relatorio.getTag());tempMachineDao.gravar(tempMachine);}//String nome = request.getServletContext().getRealPath("/WEB-INF/jasper/reportMaquinaData");Stringnome="c:/teste/reportMaquinaData";JasperCompileManager.compileReportToFile(nome+".jrxml");Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("dataIni",relatorio.getDateIni());parametros.put("dataFim",relatorio.getDateFim());parametros.put("tagSrc","[telefone removido]");Connectionconn=tempMachineDao.retornaCon();GeradorRelatorioUtilgeradorRelatorio=newGeradorRelatorioUtil(nome+".jasper",parametros,conn);geradorRelatorio.geraPDParaOutputStream(newFileOutputStream(nome+relatorio.getTag()+".pdf"));return"/relatorio/ok";}
seria no return? tentei retornar o proprio arquivo do geradorRelatorio, mudei também o metodo para retornar oque ele tinha exportado e não rolou. só continua criando na pasta
publicbyte[]form(@RequestParam("id[]")intid[],@RequestParam("dateIni")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateIni,@RequestParam("dateFim")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateFim,@RequestParam("horaInit")StringhoraInit,@RequestParam("minutoInit")StringminutoInit,@RequestParam("horaFim")StringhoraFim,@RequestParam("minutoFim")StringminutoFim)throwsJRException,SQLException,IOException{Calendarcal=Calendar.getInstance();CalendarcalDateIni=Calendar.getInstance();calDateIni.setTime(dateIni);calDateIni.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaInit));calDateIni.set(Calendar.MINUTE,Integer.valueOf(minutoInit));CalendarcalDateFim=Calendar.getInstance();calDateFim.setTime(dateFim);calDateFim.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaFim));calDateFim.set(Calendar.MINUTE,Integer.valueOf(minutoFim));Relatoriorelatorio=newRelatorio();relatorio.setTag((int)cal.getTimeInMillis());relatorio.setMachinesIds(id);relatorio.setDateIni(calDateIni.getTime());relatorio.setDateFim(calDateFim.getTime());System.out.println(relatorio.toString());for(inti=0;i<relatorio.getMachinesIds().length;i++){TemporaryMachineIdtempMachine=newTemporaryMachineId();tempMachine.setMachineId(relatorio.getMachinesIds()[i]);tempMachine.setTag(relatorio.getTag());tempMachineDao.gravar(tempMachine);}//String nome = request.getServletContext().getRealPath("/WEB-INF/jasper/reportMaquinaData");Stringnome="c:/teste/reportMaquinaData";JasperCompileManager.compileReportToFile(nome+".jrxml");Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("dataIni",relatorio.getDateIni());parametros.put("dataFim",relatorio.getDateFim());parametros.put("tagSrc","[telefone removido]");Connectionconn=tempMachineDao.retornaCon();GeradorRelatorioUtilgeradorRelatorio=newGeradorRelatorioUtil(nome+".jasper",parametros,conn);returngeradorRelatorio.geraPDParaOutputStream();}
fiz uma alteração mas ainda nao funciona. Acho que dessa vez cheguei mais perto do resultado.
@ControllerpublicclassRelatorioController{@AutowiredprivateHttpServletRequestrequest;@AutowiredprivateTemporaryMachineIdDaotempMachineDao;@ResponseBody@RequestMapping(value="/report/relatorio",method=RequestMethod.POST,produces=MediaType.APPLICATION_JSON_VALUE)publicvoidform(@RequestParam("id[]")intid[],@RequestParam("dateIni")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateIni,@RequestParam("dateFim")@DateTimeFormat(pattern="dd/MM/yyyy")DatedateFim,@RequestParam("horaInit")StringhoraInit,@RequestParam("minutoInit")StringminutoInit,@RequestParam("horaFim")StringhoraFim,@RequestParam("minutoFim")StringminutoFim,HttpServletResponseresponse)throwsJRException,SQLException,IOException{Calendarcal=Calendar.getInstance();CalendarcalDateIni=Calendar.getInstance();calDateIni.setTime(dateIni);calDateIni.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaInit));calDateIni.set(Calendar.MINUTE,Integer.valueOf(minutoInit));CalendarcalDateFim=Calendar.getInstance();calDateFim.setTime(dateFim);calDateFim.set(Calendar.HOUR_OF_DAY,Integer.valueOf(horaFim));calDateFim.set(Calendar.MINUTE,Integer.valueOf(minutoFim));Relatoriorelatorio=newRelatorio();relatorio.setTag((int)cal.getTimeInMillis());relatorio.setMachinesIds(id);relatorio.setDateIni(calDateIni.getTime());relatorio.setDateFim(calDateFim.getTime());System.out.println(relatorio.toString());for(inti=0;i<relatorio.getMachinesIds().length;i++){TemporaryMachineIdtempMachine=newTemporaryMachineId();tempMachine.setMachineId(relatorio.getMachinesIds()[i]);tempMachine.setTag(relatorio.getTag());tempMachineDao.gravar(tempMachine);}//String nome = request.getServletContext().getRealPath("/WEB-INF/jasper/reportMaquinaData");Stringnome="c:/teste/reportMaquinaData";JasperCompileManager.compileReportToFile(nome+".jrxml");Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("dataIni",relatorio.getDateIni());parametros.put("dataFim",relatorio.getDateFim());parametros.put("tagSrc","[telefone removido]");Connectionconn=tempMachineDao.retornaCon();GeradorRelatorioUtilgeradorRelatorio=newGeradorRelatorioUtil(nome+".jasper",parametros,conn);byte[]data=geradorRelatorio.geraPDParaOutputStream();streamReport(response,data,"report.pdf");}protectedvoidstreamReport(HttpServletResponseresponse,byte[]data,Stringname)throwsIOException{response.setContentType("application/pdf");response.setHeader("Content-disposition","attachment; filename="+name);response.setContentLength(data.length);response.getOutputStream().write(data);response.getOutputStream().flush();}}
D
denisspitfire
o botao tem essa seguinte chamada em ajax. nao seis e é este o problema.
$('#criaRelatorio').click(function(){vardataIni=$('#dateIni').val();varobjDateIni=newDate();objDateIni.setYear(dataIni.split("/")[2]);objDateIni.setMonth(dataIni.split("/")[1]);objDateIni.setDate(dataIni.split("/")[0]);vardateFim=$('#dateFim').val();varobjDateFim=newDate();objDateFim.setYear(dateFim.split("/")[2]);objDateFim.setMonth(dateFim.split("/")[1]);objDateFim.setDate(dateFim.split("/")[0]);if(objDateIni.getTime()>objDateFim.getTime()){alert('dataIni menor que data Fim');}if(objDateIni.getTime()==objDateFim.getTime()){varhoraInit=$('#horaInit option:selected').text()+$('#minutoInit option:selected').text();varhoraFim=$('#horaFim option:selected').text()+$('#minutoFim option:selected').text();if(horaInit>horaFim){alert('horaIni maior que horaFim');}}else{varids=[];$(':checkbox:checked').each(function(i){ids[i]=$(this).val();});if(ids==0){alert("selecione alguma maquina");}else{varhoraInit=$('#horaInit option:selected').val();varminutoInit=$('#minutoInit option:selected').val();varhoraFim=$('#horaFim option:selected').val();varminutoFim=$('#minutoFim option:selected').val();vardateFim=$('#dateFim').val();vardateIni=$('#dateIni').val();$.ajax({url:'report/relatorio',method:'POST',data:{id:ids,dateIni:dateIni,dateFim:dateFim,horaInit:horaInit,minutoInit:minutoInit,horaFim:horaFim,minutoFim:minutoFim},success:function(){}});}}
L
Logusmao
Já tentou JasperExportManager.exportReportToPdfFile??
R
robsonapsilva
Boa Tarde
denisspitfire,
Dependendo no nível de compatibilidade que você deseja ter é melhor salvar em arquivo, pois ja vi vários problemas em relação do javascript com safari por exemplo. Salvando o arquivo em disco você retorna uma url de onde ele fica e se tiver uma demanda alta você pode configurar o apache para servir ele.