Uma biblioteca Java moderna e intuitiva para importar e exportar arquivos Excel usando a biblioteca Fast Excel com uma interface Fluent API.
- ✅ Fluent API: Interface intuitiva e encadeável
- ✅ Fast Excel: Biblioteca de alto desempenho para processamento de Excel
- ✅ Múltiplos formatos de saída: Arrays, Mapas, Objetos Java
- ✅ Mapeamento automático: Reflexão para mapear dados para objetos
- ✅ Configuração flexível: Personalização completa do comportamento
- ✅ Filtros e transformações: Processamento de dados durante importação/exportação
- ✅ Suporte a múltiplas planilhas: Importação e exportação de várias abas
- ✅ Tratamento de erros: Exceções personalizadas e informativas
- Java 11+
- Fast Excel 0.19.0
- Jackson 2.15.2
- Apache Commons Lang 3.12.0
- Apache Commons IO 2.11.0
Baixe o projeto, e reutilize o pacote.
// Criar dados
List<Map<String, Object>> dados = Arrays.asList(
Map.of("Nome", "João Silva", "Idade", 30, "Cidade", "São Paulo"),
Map.of("Nome", "Maria Santos", "Idade", 25, "Cidade", "Rio de Janeiro")
);
// Exportar para Excel
ExcelFluentAPI api = ExcelFluentAPI.create();
File arquivo = api.exportTo(dados)
.withHeaders("Nome", "Idade", "Cidade")
.toSheet("Pessoas")
.toFile("pessoas.xlsx")
.export();// Importar dados do Excel
List<Map<String, String>> dados = api.importFrom("pessoas.xlsx")
.fromSheet("Pessoas")
.hasHeader(true)
.asMaps();
// Processar dados
dados.forEach(row -> {
System.out.println("Nome: " + row.get("Nome") + ", Idade: " + row.get("Idade"));
});A API permite configuração personalizada para diferentes cenários:
// Configuração padrão
ExcelConfig config = ExcelConfig.create();
// Configuração otimizada para importação
ExcelConfig configImport = ExcelConfig.forImport()
.skipEmptyRows(true)
.skipHeaderRow(false)
.validateData(true);
// Configuração otimizada para exportação
ExcelConfig configExport = ExcelConfig.forExport()
.createHeaderRow(true)
.autoResizeColumns(true)
.withDateFormat("dd/MM/yyyy");
// Criar API com configuração
ExcelFluentAPI api = ExcelFluentAPI.create(config);List<Map<String, Object>> dados = // seus dados aqui
File arquivo = api.exportTo(dados)
.withHeaders("Coluna1", "Coluna2", "Coluna3")
.toSheet("MinhaPlanilha")
.toFile("arquivo.xlsx")
.export();List<Produto> produtos = // lista de produtos
File arquivo = api.exportTo(produtos, produto -> Map.of(
"Nome", produto.getNome(),
"Preço", produto.getPreco(),
"Preço com Imposto", produto.getPreco() * 1.1
))
.withHeaders("Nome", "Preço", "Preço com Imposto")
.toFile("produtos.xlsx")
.export();try (FileOutputStream fos = new FileOutputStream("arquivo.xlsx")) {
api.exportTo(dados)
.withHeaders("Coluna1", "Coluna2")
.toStream(fos)
.export();
}List<String[]> linhas = api.importFrom("arquivo.xlsx")
.fromSheet("Planilha1")
.startingFromRow(2) // começar da linha 2
.endingAtRow(100) // parar na linha 100
.hasHeader(true)
.asStringArrays();List<Map<String, String>> dados = api.importFrom("arquivo.xlsx")
.fromSheet("Planilha1")
.hasHeader(true)
.asMaps();// Usando reflexão automática
List<Funcionario> funcionarios = api.importFrom("funcionarios.xlsx")
.fromSheet("Funcionarios")
.hasHeader(true)
.asObjects(Funcionario.class);
// Usando mapper personalizado
List<Funcionario> funcionarios = api.importFrom("funcionarios.xlsx")
.fromSheet("Funcionarios")
.hasHeader(true)
.asObjects(rowData -> {
Funcionario f = new Funcionario();
f.setNome(rowData.get("Nome"));
f.setIdade(Integer.parseInt(rowData.get("Idade")));
return f;
});List<String[]> dados = api.importFrom("arquivo.xlsx")
.filterRows(row -> {
// Manter apenas linhas onde a primeira coluna não está vazia
return row[0] != null && !row[0].trim().isEmpty() ? row : null;
})
.asStringArrays();List<String[]> dados = api.importFrom("arquivo.xlsx")
.transformCells(value -> {
// Converter para maiúsculas
return value != null ? value.toUpperCase() : value;
})
.asStringArrays();public class Funcionario {
private String nome;
private int idade;
private String cargo;
private double salario;
// Construtores, getters e setters
}public class Produto {
private String nome;
private double preco;
private String categoria;
// Construtores, getters e setters
}List<File> arquivos = Arrays.asList(
new File("arquivo1.xlsx"),
new File("arquivo2.xlsx"),
new File("arquivo3.xlsx")
);
List<Funcionario> todosFuncionarios = new ArrayList<>();
for (File arquivo : arquivos) {
List<Funcionario> funcionarios = api.importFrom(arquivo)
.fromSheet("Funcionarios")
.hasHeader(true)
.asObjects(Funcionario.class);
todosFuncionarios.addAll(funcionarios);
}
// Exportar todos os funcionários consolidados
api.exportTo(todosFuncionarios)
.withHeaders("Nome", "Idade", "Cargo", "Salario")
.toFile("funcionarios_consolidados.xlsx")
.export();List<Funcionario> funcionarios = api.importFrom("funcionarios.xlsx")
.fromSheet("Funcionarios")
.hasHeader(true)
.asObjects(Funcionario.class)
.stream()
.filter(f -> f.getIdade() >= 18 && f.getIdade() <= 65)
.filter(f -> f.getSalario() > 0)
.collect(Collectors.toList());ExcelConfig config = ExcelConfig.forExport()
.withDateFormat("dd/MM/yyyy")
.withNumberFormat("#,##0.00")
.autoResizeColumns(true);
ExcelFluentAPI api = ExcelFluentAPI.create(config);
api.exportTo(dados)
.withHeaders("Data", "Valor", "Descrição")
.toSheet("Relatório")
.toFile("relatorio_formatado.xlsx")
.export();A API lança ExcelProcessingException para erros específicos:
try {
List<Funcionario> funcionarios = api.importFrom("arquivo.xlsx")
.fromSheet("Funcionarios")
.asObjects(Funcionario.class);
} catch (ExcelProcessingException e) {
System.err.println("Erro ao processar arquivo Excel: " + e.getMessage());
e.printStackTrace();
}- Fast Excel: Biblioteca de alto desempenho para processamento de arquivos grandes
- Streaming: Processamento eficiente de memória para arquivos grandes
- Configuração otimizada: Configurações pré-definidas para diferentes cenários
- Suporte apenas para arquivos Excel (.xlsx)
- Mapeamento por reflexão requer construtores padrão
- Algumas funcionalidades avançadas do Excel não são suportadas
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
Para suporte e dúvidas, abra uma issue no repositório do projeto.