Exportação e Download de Arquivos Excel (xlsx) em Aplicações Web

  1. 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>

  1. 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;

}

  1. 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");
}

  1. 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();
}

  1. 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');
    }
}

Tags: easyexcel Spring Boot java javascript xlsx

Publicado em 8-1 01:25