Criação de arquivo xlsx em Java

Desenvolvi um sistema que faz uma consulta no banco através de um parâmetro e retorna as informações em uma tabela. Agora preciso que essa tabela seja criada em um arquivo xlsx para dar a opção ao usuário de fazer download da tabela em excel. O código de criação do excel está abaixo, ele cria o arquivo normalmente, porém quando chamo o método pela Servlet, não funciona.

É muito ruim ler código em uma imagem.
Posta o código no fórum, seleciona ele e clica no botão </>

package br.com.cbc.dao;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


import br.com.cbc.beans.ArmasGuia;
import br.com.cbc.bo.ArmasGuiaBO;
import jxl.format.CellFormat;
import jxl.write.Label;

public class Planilha {
	
	@SuppressWarnings("resource")
	public List<ArmasGuia> expExcel(String nrArma)throws NullPointerException {
		
		
		List<ArmasGuia> lista = new ArrayList<>();
		
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet firstSheet = workbook.createSheet("Armas");
		FileOutputStream fos = null;
		
		
		
		GregorianCalendar calendar = new GregorianCalendar();   
        SimpleDateFormat formatador = new SimpleDateFormat("dd' de 'MMMMM' de 'yyyy");     
        System.out.println(formatador.format(calendar.getTime()));
		
		try {
			fos = new FileOutputStream(new File("Armas - " +formatador.format(calendar.getTime()) + ".xls"));
			
			ArmasGuiaBO bo = new ArmasGuiaBO();
			List<ArmasGuia> lista1 = bo.Listagem2(nrArma);
			
			
			
			
			int i = 0;
			
			for(ArmasGuia a : lista1) {
				HSSFRow row = firstSheet.createRow(i);
				
				row.createCell(0).setCellValue(a.getDsEmpresa());
				row.createCell(1).setCellValue(a.getNtFiscal());
				row.createCell(2).setCellValue(a.getCdItem());
				row.createCell(3).setCellValue(a.getDsItem());
				row.createCell(4).setCellValue(a.getPrefixo());
				row.createCell(5).setCellValue(a.getNrArma());
				row.createCell(6).setCellValue(a.getNrQtde());
				row.createCell(7).setCellValue(a.getDsMarca());
				row.createCell(8).setCellValue(a.getDsModelo());
				row.createCell(9).setCellValue(a.getDsEspecie());
				row.createCell(10).setCellValue(a.getCalibre());
				row.createCell(11).setCellValue(a.getNrDoc());
				row.createCell(12).setCellValue(a.getDtFat());
				row.createCell(13).setCellValue(a.getNmCliente());
				row.createCell(14).setCellValue(a.getNmAbrev());
				row.createCell(15).setCellValue(a.getDsCidade());
				row.createCell(16).setCellValue(a.getDsUf());
				
				i++;
			}
			
			workbook.write(fos);
			
			
			System.out.println("Planilha escrita com sucesso");  
			
			
		}catch (Exception e) {
			e.printStackTrace();
			System.out.println("Erro ao exportar arquivo");
		}finally {
			try {
				fos.flush();
				fos.close();
				
			}catch (Exception e){
				e.printStackTrace();
			}
		}
	
		
		return lista;
	}
		

}

Posta o código do seu Servlet, fazendo o favor…
Curiosidade, você trabalha na CBC?
É que eu sou CAC. :smiley:

Sim!

package br.com.cbc.bo;

import java.util.List;

import br.com.cbc.arquivos.Teste;
import br.com.cbc.beans.ArmasGuia;
import br.com.cbc.dao.ArmasGuiaDAO;
import br.com.cbc.dao.Planilha;


public class ArmasGuiaBO {
	
private ArmasGuiaDAO dao = null;
private Planilha pl = null;
private Teste t = null;
	
	public List<ArmasGuia> Listagem(String nmCliente)throws Exception{
		dao = new ArmasGuiaDAO();
		return dao.ListarPorNome(nmCliente);
	}
	
	public List<ArmasGuia> Listagem2(String nrArma)throws Exception{
		dao = new ArmasGuiaDAO();
		return dao.ListarPorNumero(nrArma);
	}
	
	
	public List<ArmasGuia> exportar(String nrArma)throws Exception{
		pl = new Planilha();
		return pl.expExcel(nrArma);
	}

	
	public List<ArmasGuia> criar(String nrArma)throws Exception{
		t = new Teste();
		return t.criarPlanilha(nrArma);
	}

}

Esse é o bo

package br.com.cbc.controller;



import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.cbc.arquivos.Gravar;
import br.com.cbc.bo.ArmasGuiaBO;
import br.com.cbc.bo.VendasArmasColetesBO;



/**
 * Servlet implementation class VendasControl
 */
@WebServlet("/Vendas")
public class VendasControl extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public VendasControl() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		
		
		try {
			
			if(request.getParameter("opt").equals("1")) {
				
			
				if(request.getParameter("nmNr").matches("[0-9]+")) {
				
				request.setAttribute("listaArmas", new ArmasGuiaBO().Listagem2(request.getParameter("nmNr")));
				RequestDispatcher rd = request.getRequestDispatcher("tabelaArmas.jsp");
				rd.forward(request, response);
				
				
				request.setAttribute("Armas", new ArmasGuiaBO().exportar(request.getParameter("nmNr")));
				

				
			
			}else {
				request.setAttribute("listaArmas", new ArmasGuiaBO().Listagem(request.getParameter("nmNr")));
				RequestDispatcher rd = request.getRequestDispatcher("tabelaArmas.jsp");
				rd.forward(request, response);
				
			}
				
			}else if(request.getParameter("opt").equals("2")) {
				
				if(request.getParameter("nmNr").matches("[0-9]+")) {
					
					request.setAttribute("listaVendas", new VendasArmasColetesBO().Listagem2(request.getParameter("nmNr")));
					RequestDispatcher rd = request.getRequestDispatcher("tabelaVendas.jsp");
					rd.forward(request, response);
			
					
					
				
				}else {
					request.setAttribute("listaVendas", new VendasArmasColetesBO().Listagem(request.getParameter("nmNr")));
					RequestDispatcher rd = request.getRequestDispatcher("tabelaVendas.jsp");
					rd.forward(request, response);
					
				}
				
				
			}	
			}catch(Exception e) {
			e.printStackTrace();
		}
		

		
		
			 }
	
	
	
		
	
			
		}

E a servlet

Pela servlet, ele me da a mensagem de planilha criada com sucesso mas não cria.

Faz essa alteração na classe Planilha para ver onde o arquivo está sendo gerado:

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import br.com.cbc.beans.ArmasGuia;
import br.com.cbc.bo.ArmasGuiaBO;
import jxl.format.CellFormat;
import jxl.write.Label;

public class Planilha {

    @SuppressWarnings("resource")
    public List<ArmasGuia> expExcel(String nrArma) throws NullPointerException {

        List<ArmasGuia> lista = new ArrayList<>();

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet firstSheet = workbook.createSheet("Armas");
        FileOutputStream fos = null;

        GregorianCalendar calendar = new GregorianCalendar();
        SimpleDateFormat formatador = new SimpleDateFormat("dd' de 'MMMMM' de 'yyyy");
        System.out.println(formatador.format(calendar.getTime()));

        File file = new File("Armas - " + formatador.format(calendar.getTime()) + ".xls");
        try {
            fos = new FileOutputStream(file);

            ArmasGuiaBO bo = new ArmasGuiaBO();
            List<ArmasGuia> lista1 = bo.Listagem2(nrArma);

            int i = 0;

            for (ArmasGuia a : lista1) {
                HSSFRow row = firstSheet.createRow(i);

                row.createCell(0).setCellValue(a.getDsEmpresa());
                row.createCell(1).setCellValue(a.getNtFiscal());
                row.createCell(2).setCellValue(a.getCdItem());
                row.createCell(3).setCellValue(a.getDsItem());
                row.createCell(4).setCellValue(a.getPrefixo());
                row.createCell(5).setCellValue(a.getNrArma());
                row.createCell(6).setCellValue(a.getNrQtde());
                row.createCell(7).setCellValue(a.getDsMarca());
                row.createCell(8).setCellValue(a.getDsModelo());
                row.createCell(9).setCellValue(a.getDsEspecie());
                row.createCell(10).setCellValue(a.getCalibre());
                row.createCell(11).setCellValue(a.getNrDoc());
                row.createCell(12).setCellValue(a.getDtFat());
                row.createCell(13).setCellValue(a.getNmCliente());
                row.createCell(14).setCellValue(a.getNmAbrev());
                row.createCell(15).setCellValue(a.getDsCidade());
                row.createCell(16).setCellValue(a.getDsUf());

                i++;
            }

            workbook.write(fos);

            System.out.println("Planilha escrita com sucesso em \"" + file.getAbsolutePath() + "\"");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Erro ao exportar arquivo");
        } finally {
            try {
                fos.flush();
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return lista;
    }
}

Dá erro no file

package br.com.cbc.arquivos;


import br.com.cbc.beans.ArmasGuia;
import br.com.cbc.bo.ArmasGuiaBO;


public class Gravar {
	
	


	public static void main(String[] args) throws Exception{   
		
	
		ArmasGuiaBO bo = new ArmasGuiaBO();
		
		bo.exportar("25009");
		
        
            
           // System.out.println("Planilha escrita com sucesso");   
        
}

}

Executando o método, ele cria dentro do projeto, na pasta Web Content
Pela Servlet não aparece lá

Que erro?

Por isso que postei aquele código imprimindo o absolute path do arquivo.
Justamente para descobrirmos onde ele está gravando.

file cannot be resolved.

Tentei trocar o file pelo fos e deu: The method getAbsolutePath() is undefined for the type FileOutputStream

É que você não copiou conforme o fonte que eu postei.
Quem tem o método getAbsolutePath() é a classe File, eu só joguei para uma variável o File que você passa para o FileOutputStream.

Ahh entendi, fiz a modificação

Planilha escrita com sucesso em “C:\Users\esvieira\Downloads\eclipse-jee-oxygen-R-win32-x86_64\eclipse\Armas - 30 de Outubro de 2017.xls”

Ta gravando nesse caminho
Vou tentar colocar esse caminho no código de fazer o download pra ver se funciona

Quando você instancia seu File, deveria informar o diretório do arquivo.
Se você não informa ele assume o diretório retornado por System.getProperty("user.dir").

Agora preciso através de um botão fazer o download do arquivo gerado, tenho o seguinte código.

package br.com.cbc.controller;


import java.io.File;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;


import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



/**
 * Servlet implementation class ExportaExcel
 */
@WebServlet("/exporta")
public class ExportaExcel extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExportaExcel() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		
		GregorianCalendar calendar = new GregorianCalendar();
		SimpleDateFormat formatador = new SimpleDateFormat(
				"dd' de 'MMMMM' de 'yyyy");
		System.out.println(formatador.format(calendar.getTime()));
		
		
		  
		File dir = new File("Armas.xls");
		File arq = new File(dir, "Armas - "
				+ formatador.format(calendar.getTime()) + ".xls");
		
		
    	ServletOutputStream out = resp.getOutputStream(); 		                	
        resp.reset();
        resp.setHeader("Content-Disposition", "attachment;filename=" + arq.getName());
        resp.setContentType("application/vnd.ms-excel");

       
       
        out.flush(); 
        out.close();
        

		
	}}

Porém ele faz o download em branco

Consegui! Muito obrigada!