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