[RESOLVIDO] vRaptor - Gerar planilha com vRaptor

7 respostas
tefo

Eai galera!

Eu tenho uma servlet e preciso que ela tenha injeção de dependências,
pq ela vai receber um id e quero que ela faça a consulta..
eu tentei mas o eclipse acusava erro no código..

eh possível fazer isso, ou estou viajando?

public class GeradorDePlanilha extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 4488067535475167468L;
	HSSFWorkbook wb; 
    HSSFSheet sheet; 
    HSSFRow row; 
    HSSFCell cell; 
 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GeradorDePlanilha() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        try { 
        	//obter os valores pelo request
        	String idCenario = request.getParameter("cenario");
        	String operacao = request.getParameter("operacao");
        	if(idCenario != null && operacao != null){
	        	Long id = Long.parseLong(idCenario);
	        	//consultar no banco
	        	//??????????????????????????????
	        	
	        	System.out.println("GERADOR DE PLANILHA SERVLET");
	            OutputStream out = response.getOutputStream(); 
	            gerarArquivoExcel(); 
	            // escreve planilha como resposta 
	            response.setContentType("application/vnd.ms-excel"); 
	            response.setHeader("Content-Disposition", "attachment; filename=Minha_Planilha.xls"); 
	            wb.write(out); 
	            out.flush(); 
	            out.close(); 
        	}else{
        		System.out.println("Parametro(s) nulo(s)! cenario: "+idCenario+" - operacao: "+operacao);
        	}
        } catch (Exception e) { 
            throw new ServletException("Erro ao gerar o arquivo do Excel. ", e); 
        }  
 
	}

7 Respostas

Lucas_Cavalcanti

vc não está usando o VRaptor, eh isso?

vc pode usar o Guice ou o spring na mão pra fazer essa injeção… ou dar new nos objetos mesmo, mas usando a mesma idéia de receber no construtor…

algum motivo pra não usar vraptor ao invés dessa servlet?

tefo

nao, eu estou usando vRaptor…

estou usando a servlet para que o sistema gere uma planilha excel e o usuário possa baixa-la…
mas eu soh sei fazer isso usando uma servlet…

da pra fazer isso sem servlet no vRaptor?

Lucas_Cavalcanti

tem um jeito bem fácil de fazer isso com o VRaptor:
http://vraptor.caelum.com.br/pt/docs/download-e-upload/

public Download geraExcel() {
     InputStream arquivo = //gera o arquivo
     return new InputStreamDownload(arquivo, "Minha_Planilha.xls", "application/vnd.ms-excel");

     // ou 
     File arquivo = //gera o arquivo
     return new FileDownload(arquivo, "Minha_Planilha.xls", "application/vnd.ms-excel");
     
}
tefo

Ok Lucas, se fosse um File ou um InputStream funcionaria..

mas no meu caso, a planilha eh gerada em um FileOutputStream..
HSSFWorkbook wb; 
    HSSFSheet sheet; 
    HSSFRow row; 
    HSSFCell cell;

@Restrito
	@Get("/geraPlanilhaDebitos")
	public Download geraExcel() {  
		
		
		// create a new file 
		FileOutputStream out = new FileOutputStream("Minha_Planilha.xls");
		
		// create a new workbook 
		wb = new HSSFWorkbook(); 
		
		// criar uma planilha 
		sheet = wb.createSheet("Minha Planilha"); 
		
		// Criar uma linhas e duas colunas 
		int linha = 0; 
		int coluna = 0; 
		row = sheet.createRow(linha); 
		
		// Coluna um 
		cell = row.createCell(coluna); 
		cell.setCellValue("Coluna Teste1"); 
		coluna++; 
		
		// Coluna dois 
		cell = row.createCell(coluna++); 
		cell.setCellValue(123.98); 
		
		// coluna um 
		cell = row.createCell(coluna); 
		cell.setCellValue("Coluna Teste2"); 
		cell.setCellStyle(getEstiloUm());// Aplicando etilo na coluna 
		sheet.setColumnWidth(coluna, 4000);// Largura da coluna 
		coluna++; 
		
		// coluna dois 
		cell = row.createCell(coluna++); 
		cell.setCellValue(123.98); 
		cell.setCellStyle(getEstiloDois());// Aplicando etilo na coluna 
		sheet.autoSizeColumn(coluna);//Ajustar largura automaticamente
		
		// escreve planilha no arquivo         
		wb.write(out); 
		out.close();
		
	    return new FileDownload(out, "application/vnd.ms-excel", "Minha_Planilha.xls");  
	}
claro que ai ta dando erro no construtor FileDownload porque o arquivo que ele ta pedindo eh um File e nao um FileOutputStream..

Algum conselho pra me dar nesse caso?

Lucas_Cavalcanti

o gerador de excel provavelmente recebe um OutputStream, então vc pode trocar o FileOutputStream por:

ByteArrayOutputStream out = new ByteArrayOutputStream();
//...

wb.write(out);
out.close();

return new ByteArrayDownload(out.getBytes(), "application/vnd.ms-excel", "Minha_Planilha.xls");
tefo

Funcionou Lucas!!

brigadao ai!!!

soh tive que mudar o .getBytes() porque esse metodo nao existe em ByteArrayOutputStream, entao substitui por .toByteArray() =D

Lucas_Cavalcanti

sabe como é a preguiça de procurar o metodo certo no google :wink:

Criado 25 de outubro de 2012
Ultima resposta 26 de out. de 2012
Respostas 7
Participantes 2