Geração de Excel em Java utilizando Apache POI

Uma dúvida muito frequente dos desenvolvedores JAVA é quanto a geração de arquivos Excel a partir de um código JAVA. A resposta é que existem diversos frameworks que podem ser utilizados para gerar arquivos Excel de dentro de uma aplicação JAVA. Neste post será apresentado o framework Apache POI (Java API for Microsoft Documents).

A missão do projeto Apache POI projeto é criar e manter APIs Java para manipular vários formatos de arquivos baseados no Open Office XML e OLE da Microsoft. Em resumo, você pode ler e escrever arquivos do MS Excel usando Java. Além disso, você pode ler e escrever arquivos de MS Word e MS PowerPoint usando Java. Apache POI é a sua solução Java Excel (Excel 97-2008 para).

Para obter a documentação completa do Apache POI e o download das bibliotecas, você deve entrar no site oficial Apache POI Project. Para fazer o download do jar do POI acesse a página de downloads. Inclua o jar do POI dentro de sua aplicação. Em geral, quando trabalhamos com um Dynamic Web Project, incluímos os jars dentro do diretório WEBCONTENT/WEB-INF/lib. Lembre-se de adicionar a referência do jar no build path do projeto.

O uso é relativamente simples e baseia-se na criação de “sheets” e preenchimento de células da planilha.

Abaixo segue um exemplo de como gerar uma planilha Excel a partir de uma lista de objetos obtida de um banco de dados (comumente chamado de export do banco para Excel).

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;
import java.util.StringTokenizer;

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

import br.com.estec.persistencia.CD;
import br.com.estec.persistencia.dao.CDDAO;

public class CDIO {

public void expExcel(String nomeArquivo) {

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet firstSheet = workbook.createSheet("Aba1");

FileOutputStream fos = null;

try {
fos = new FileOutputStream(new File(nomeArquivo));

// Este trecho obtem uma lista de objetos do tipo CD

// do banco de dados através de um DAO e itera sobre a lista

// criando linhas e colunas em um arquivo Excel com o conteúdo

// dos objetos.

CDDAO dao = new CDDAO();
List<CD> lista = dao.obter();

int i = 0;

for (CD cd : lista) {
HSSFRow row = firstSheet.createRow(i);

row.createCell(0).setCellValue(cd.getId());
row.createCell(1).setCellValue(cd.getNome());
row.createCell(2).setCellValue(cd.getAno());
row.createCell(3).setCellValue(cd.getPreco());
row.createCell(4).setCellValue(cd.getAutor());
row.createCell(5).setCellValue(cd.getMusicas());
row.createCell(6).setCellValue(cd.getGravadora());
row.createCell(7).setCellValue(cd.getFoto());

i++;

} // fim do for

workbook.write(fos);

} catch (Exception e) {
e.printStackTrace();
System.out.println("Erro ao exportar arquivo");
} finally {
try {
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} // fim do metodo exp

}

5 Comments

  • Gabriel Posted 13/03/2013 10:50

    Excelente Giovanni, direto nas explicações, conciso, simples e direto. Seu post me ajudou gerar uma planilha através da aplicação que desenvolvi.

  • Everson Cardoso Posted 27/05/2013 15:26

    fiquei com uma duvida, pra onde o arquivo xls será exportado?

  • Everson Cardoso Posted 27/05/2013 16:18

    so para constar, excelente post e pelo menos pra min foi de enorme ajuda…

    muito obrigado Giovanni

  • Geraldo Neto Posted 28/05/2013 10:54

    Everson, repare que a função cria um “new File(nomeArquivo)” com o parâmetro String nomeArquivo. a classe File do java recebe no construtor uma String que é o nome do arquivo com o seu caminho completo, Ex: new File(“C:arquivo.txt”);
    Com isso então o arquivo será salvo no caminho que vc especificar pela chamada do método expExcel

  • Everson Cardoso Posted 28/05/2013 16:43

    opá, tudo bom Geraldo?!
    eu consegui gerar o arquivo .xls eu estava lendo um artigo no site da apache
    http://poi.apache.org/spreadsheet/converting.html

    bastante intereçante porém não consegui aplicar e eu gostaria de saber se pode me ajudar, se sim ai vai uma parte do meu codigo… seguinte eu tenho uma telinha em jsf onde eu pesquiso meus contatos por dataInici e dataFim e eu quero preencher o arquivo com esses dados, na verdade também ja consigo fazer isso mais eu gostaria de aplicar um template no meu arquivo, ja andei lendo e das formas apresentadas não funcionou.

    como disse se puder ajudar eu agradeço.
    segue codigo:

    ContatoDAO cDAO = new ContatoDAO();

    FileInputStream file = new FileInputStream(new File(“C:/eclipse/workspace/estudos/template.xlsx”));

    Workbook workbook = new HSSFWorkbook(file);
    /* Workbook[] workbooks = new Workbook[]{new HSSFWorkbook(), new XSSFWorkbook()};
    for(int x = 0; x < workbooks.length; x++){
    Workbook workbook = workbooks[x];*/

    Sheet Sheet = workbook.createSheet("planilha.xlsx");

    FileOutputStream fos = null;

    try {
    fos = new FileOutputStream(new File("planilha.xlsx"));

    String dataIni = request.getParameter("dataInicio");
    String dataFim = request.getParameter("dataFim");

    List listaApoio = cDAO.ContatoDias(dataIni, dataFim);

    int i = 1;

    for (Contato co : listaApoio) {
    Row row = Sheet.createRow(i);

    row.createCell(0).setCellValue(co.getNumero());
    row.createCell(1).setCellValue(co.getEndereco());
    row.createCell(2).setCellValue(co.getFone());
    row.createCell(3).setCellValue(co.getCidade());

    i++;
    }

    String fileName = “c:/planilha.xls”;
    if(workbook instanceof XSSFWorkbook){
    fileName = fileName + “x”;
    }

    FileOutputStream output = new FileOutputStream(fileName);
    workbook.write(output);

    workbook.write(fos);

    } catch (Exception e) {
    e.printStackTrace();
    System.out.println(“erro ao exportar o arquivo”);
    }finally{
    try {
    System.out.println(“planilha criada com sucesso….”);
    fos.flush();
    fos.close();
    } catch (Exception e2) {
    e2.printStackTrace();
    }
    }
    }

Add Comment

Your email address will not be published. Required fields are marked *

Phone: (31) 3646-1612
Fax: (31) 3646-1614
Loja 01, Lourdes, Belo Horizonte/MG
Rua Rio de Janeiro, 1278