- Adicionar Dependências do Projeto
Inclua a biblioetca EasyExcel no seu arquivo de configuração de dependências para manipulação de planilhas Excel.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.1</version>
</dependency>
- Definir Classe de Entidade para Exportação
Crie uma classe de modelo que represente os dados a serem exportados, utilizando anotações para configurar colunas e campos ignorados.
@Data
public class DadosExportacao {
@ExcelIgnore
@ExcelProperty("Código Interno")
private String codigoInterno;
@ExcelProperty("Nome do Usuário")
private String nomeCompleto;
@ExcelProperty("Identificador Único")
private String identificador;
}
- Implementação no Controlador
No controlador Spring, adicione um método para iniciar a exportação, delegando a lógica ao serviço e retornando uma resposta de sucesso.
@ApiOperation(value = "Exportar dados de usuários")
@PostMapping("/exportarDados")
public ResponseEntity<String> iniciarExportacao(@RequestBody @Validated FiltroDados filtro) {
servicoDados.processarExportacao(filtro);
return ResponseEntity.ok("Exportação iniciada com sucesso");
}
- Lógica de Serviço e Utilitário de Download
No serviço, consulte os dados, converta-os para a entidade de exportação e utilize um método auxiliar para escrever a planilha no fluxo de resposta HTTP.
public void processarExportacao(FiltroDados filtro) {
List<Registro> registros = repositorio.consultarPorCriterio(filtro.getCriterio());
List<DadosExportacao> listaExportacao = new ArrayList<>();
for (Registro reg : registros) {
DadosExportacao item = new DadosExportacao();
item.setNomeCompleto(reg.getNome());
item.setIdentificador(reg.getId());
listaExportacao.add(item);
}
gerarArquivoExcel(DadosExportacao.class, listaExportacao, "relatorio_usuarios");
}
private <T> void gerarArquivoExcel(Class<T> tipoEntidade, List<?> dados, String nomeArquivo) {
HttpServletResponse respostaHttp = obterRespostaAtual();
try {
respostaHttp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
respostaHttp.setCharacterEncoding("UTF-8");
String nomeCodificado = URLEncoder.encode(nomeArquivo, "UTF-8").replace("+", "%20");
respostaHttp.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + nomeCodificado + ".xlsx");
EasyExcel.write(respostaHttp.getOutputStream(), tipoEntidade).sheet("Dados").doWrite(dados);
} catch (IOException e) {
throw new OperacaoException("Erro ao gerar arquivo Excel", e);
}
}
private HttpServletResponse obterRespostaAtual() {
RequestAttributes atributos = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes atributosRequisicao = (ServletRequestAttributes) atributos;
return atributosRequisicao.getResponse();
}
- Entegração com o Frontend
No código JavaScript, realize uma requisição POST ao endpoint de exportação, tratnado a resposta como um blob para download no navegador.
async function exportarDados(criterios) {
try {
const resposta = await fetch('/api/exportarDados', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(criterios),
responseType: 'blob'
});
if (!resposta.ok) {
throw new Error('Falha na solicitação');
}
const blob = await resposta.blob();
const urlObjeto = URL.createObjectURL(blob);
const linkTemporario = document.createElement('a');
linkTemporario.href = urlObjeto;
linkTemporario.download = 'exportacao.xlsx';
document.body.appendChild(linkTemporario);
linkTemporario.click();
document.body.removeChild(linkTemporario);
URL.revokeObjectURL(urlObjeto);
} catch (erro) {
console.error('Erro durante a exportação:', erro);
alert('Falha ao exportar dados');
}
}