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:
Agora mãos na massa, criei uma classe de produtos para simularmos uma exportação de uma lista deles:
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:
/**
* 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();
}
}
}
//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:
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:
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:
Espero que o post tenha sido útil e que tenham gostado!
Qualquer dúvida ou se precisarem de maiores explicações, comentem!