18 nov 2015

Lendo/Criando planilhas excel em Java com a biblioteca Apache POI

O que é Apache POI?
Apache POI é uma biblioteca para manipular os arquivos do Microsoft Office.

Neste post iremos abordar sobre como exportar e ler planilhas em excel utilizando Java.

Em primeiro lugar temos que importar a biblioteca da Apache POI.
No projeto que criei utilizei o Maven para controlar as dependências, então adicionei a seguinte dependência no meu arquivo pom.xml:

dependencia-poi

Agora mãos na massa, criei uma classe de produtos para simularmos uma exportação de uma lista deles:

1
public class Product {

private Long id;

private String name;

private Double price;

public Product(){}

public Product(Long id, String name, Double price){
this.id = id;
this.name = name;
this.price = price;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Double getPrice() {
return price;
}

public void setPrice(Double price) {
this.price = price;
}
}

1 – Criando a planilha

Nesse exemplo criarei 3 tipos de estilos de células diferente, um para o header com o título de cada coluna, um para o campo de texto com o nome dos produtos e um com a formatação do preço de cada produto

Para cada tipo de dado (texto, número, data), o tratamento e formatação para escrever nas células é específico

Segue o código:

1
2
3
4
5
6
7
8
9
10
11
/**
* Export Excel!
*
*/
public class ExportExcel
{
public static void main( String[] args )
{
// Criando o arquivo e uma planilha chamada "Product"
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Product");

// Definindo alguns padroes de layout
sheet.setDefaultColumnWidth(15);
sheet.setDefaultRowHeight((short)400);

//Carregando os produtos
List products = getProducts();

int rownum = 0;
int cellnum = 0;
Cell cell;
Row row;

//Configurando estilos de células (Cores, alinhamento, formatação, etc..)
HSSFDataFormat numberFormat = workbook.createDataFormat();

CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
headerStyle.setAlignment(CellStyle.ALIGN_CENTER);
headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

CellStyle textStyle = workbook.createCellStyle();
textStyle.setAlignment(CellStyle.ALIGN_CENTER);
textStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

CellStyle numberStyle = workbook.createCellStyle();
numberStyle.setDataFormat(numberFormat.getFormat(“#,##0.00”));
numberStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

// Configurando Header
row = sheet.createRow(rownum++);
cell = row.createCell(cellnum++);
cell.setCellStyle(headerStyle);
cell.setCellValue(“Code”);

cell = row.createCell(cellnum++);
cell.setCellStyle(headerStyle);
cell.setCellValue(“Name”);

cell = row.createCell(cellnum++);
cell.setCellStyle(headerStyle);
cell.setCellValue(“Price”);

// Adicionando os dados dos produtos na planilha
for (Product product : products) {
row = sheet.createRow(rownum++);
cellnum = 0;

cell = row.createCell(cellnum++);
cell.setCellStyle(textStyle);
cell.setCellValue(product.getId());

cell = row.createCell(cellnum++);
cell.setCellStyle(textStyle);
cell.setCellValue(product.getName());

cell = row.createCell(cellnum++);
cell.setCellStyle(numberStyle);
cell.setCellValue(product.getPrice());
}

try {

//Escrevendo o arquivo em disco
FileOutputStream out = new FileOutputStream(new File(“/tmp/products.xls”));
workbook.write(out);
out.close();
workbook.close();
System.out.println(“Success!!”);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

1
2
3
//Simulando uma listagem de produtos
private static List getProducts(){
List products = new ArrayList();

products.add(new Product(1l, “Produto 1”, 200.5d));
products.add(new Product(2l, “Produto 2”, 1050.5d));
products.add(new Product(3l, “Produto 3”, 50d));
products.add(new Product(4l, “Produto 4”, 200d));
products.add(new Product(5l, “Produto 5”, 450d));
products.add(new Product(6l, “Produto 6”, 150.5d));
products.add(new Product(7l, “Produto 7”, 300.99d));
products.add(new Product(8l, “Produto 8”, 1000d));
products.add(new Product(9l, “Produto 9”, 350d));
products.add(new Product(10l, “Produto 10”, 200d));

return products;
}

Segue a planilha gerada:

planilha_excel

2 – Lendo a planilha

Para a leitura da planilha, cada tipo de dado (texto, número, data), o tratamento também é distinto, para isso é preciso saber exatamente qual o tipo que foi escrito em cada célula da planilha.

Neste exemplo vamos ler a planilha que criamos no exemplo anterior, segue o código:

1
public class ReadExcel {

public static void main(String[] args) throws IOException {
String filePath = “/tmp/products.xls”;
try{
// Abrindo o arquivo e recuperando a planilha
FileInputStream file = new FileInputStream(new File(filePath));
HSSFWorkbook workbook = new HSSFWorkbook(file);
HSSFSheet sheet = workbook.getSheetAt(0);

List products = new ArrayList();

Iterator rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();

// Descantando a primeira linha com o header
if(row.getRowNum() == 0){
continue;
}

Iterator cellIterator = row.cellIterator();
Product product = new Product();
products.add(product);
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getColumnIndex()) {
case 0:
product.setId(((Double)cell.getNumericCellValue()).longValue());
break;
case 1:
product.setName(cell.getStringCellValue());
break;
case 2:
product.setPrice(cell.getNumericCellValue());
break;
}
}
}

for (Product product : products) {

System.out.println(product.getId() + ” – ” + product.getName() + ” – ” + product.getPrice());

}

file.close();
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

}

Saída do console:

output_poi

Espero que o post tenha sido útil e que tenham gostado!
Qualquer dúvida ou se precisarem de maiores explicações, comentem!

 

CTA-ebook-transformação-digital

Marcos Vinícius Fernandes
About Marcos Vinícius Fernandes

Desenvolvedor de software na redspark

Comments

  • Júnior
    dezembro 30, 2016 Responder

    Parabéns muito bom o post. Como faria para depois de criar já abrir a planilha?i

Leave a Comment