Enviar os dados de um relatório gerado em xls com apache poi pra o navegador e o usuário escolher onde salvar

Pessoal boa tarde,
Estou gerando um relatório em xls, até aqui beleza.
O problema que estou gerando na pasta temp, eu preciso enviar para a sessão do navegador e o usuário escolher onde ele vai salvar.
Esse é meu método.

public void gerarExcel() {
String msnErro = validarFiltros();
Date dataInicio = usuarioLogado.getEmpresa().calcularInicioPeriodo(mesSelecionado, anoSelecionado);
Date dataFinal = usuarioLogado.getEmpresa().calcularFinalPeriodo(mesSelecionado, anoSelecionado);
if (msnErro != null) {
addMensagem(FacesMessage.SEVERITY_ERROR, "Extrato Bonco de Horas: ", msnErro);
return;
}
@SuppressWarnings(“resource”)
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(“ExtratoBancoHora”);
CellStyle cellStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
// Definindo alguns padroes de layout
sheet.setDefaultColumnWidth(15);
sheet.setDefaultRowHeight((short) 400);
int rownum = 0;
int cellnum = 0;
Cell cell;
Row row;
// Configurando Header
row = sheet.createRow(rownum++);
cell = row.createCell(cellnum++);
cell.setCellValue(“Data”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Crachá”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Nome”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Departamento”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Histórico de Lançamentos”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Débido”);
cell = row.createCell(cellnum++);
cell.setCellValue(“credito”);
cell = row.createCell(cellnum++);
cell.setCellValue(“Saldo”);
try {
List idsFuncionarios = new ArrayList();
for (Funcionario funcionario : funcionariosSelecionados) {
idsFuncionarios.add(funcionario.getId());
}
List funcionarios = funcionarioServico.obterFuncionariosExtratoBancoHoras(idsFuncionarios,
dataInicio, dataFinal, ativo);

		for (Funcionario funcio : funcionarios) {
			ExtratoBancoHorasVO extrato = new ExtratoBancoHorasVO();
			extrato.setNomeFuncionario(funcio.getNome());
			extrato.setCracha(funcio.getCrachaFormatado());
			extrato.setDepartamento(funcio.getCentroCusto().getNome());
			extrato.setRegistro(funcio.getRegistro());
			Set<PontoDia> pontosDia = funcio.getPontos();
			Float totalHoras = 0f;
			for (PontoDia ponto : pontosDia) {
				if (ponto.getCreditoBancoHora() == null && ponto.getDebitoBancoHora() == null) {
					continue;
				}
				String descricaoEvento = ponto.formatarDescricaoEventosExtratoBH("/");
				Float credito = ponto.getCreditoBancoHora();
				Float debito = ponto.getDebitoBancoHora();
				Float saldo = credito - debito;
				if (saldo == 0) {
					continue;
				}
				String strCredito = formatarParaHora(credito);
				String strDebito = formatarParaHora(debito);
				totalHoras += (saldo == null ? 0f : saldo);
				String StrSaldoTotal = formatarParaHora(totalHoras);

				row = sheet.createRow(rownum++);
				cellnum = 0;
				// Data
				cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy"));
				cell = row.createCell(cellnum++);
				cell.setCellValue(ponto.getDia());
				cell.setCellStyle(cellStyle);
				// Crachá
				cell = row.createCell(cellnum++);
				cell.setCellValue(funcio.getCrachaFormatado());
				// Nome
				cell = row.createCell(cellnum++);
				cell.setCellValue(funcio.getNome());
				// Departamento
				cell = row.createCell(cellnum++);
				cell.setCellValue(funcio.getCentroCusto().getNome());
				// Histórico de Lançamentos
				cell = row.createCell(cellnum++);
				cell.setCellValue(descricaoEvento);
				// Débito
				cell = row.createCell(cellnum++);
				cell.setCellValue(strDebito);
				// Crédito
				cell = row.createCell(cellnum++);
				cell.setCellValue(strCredito);
				// Total mês
				cell = row.createCell(cellnum++);
				cell.setCellValue(StrSaldoTotal);
				
			}
		}			
		 FileOutputStream out = new FileOutputStream(new File("C:\\temp\\extratoBanco.xls")); 
		 workbook.write(out);
		 out.close();			
	} catch (Exception e) {
		logg.error("Erro ao processar os dados", e);
		addMensagem(FacesMessage.SEVERITY_ERROR, "Extrato Bonco de Horas: ", "Erro ao processar os dados.");
	}
}

Está usando algum framework web tipo Spring?

Você pode enviar o arquivo como resposta para o navegador, aí ele vai baixar.

Bom dia!
Eu uso o Spring, você teria algum exemplo?

1 curtida

Obrigado!
Vou testar e te falo.

Pro usuário escolher onde vai salvar vai depender da configuração do navegador.
O Chrome por exemplo, por padrão não pede onde deseja salvar, ele simplesmente baixa na pasta Downloads do usuário logado.

Mas isso pode ser alterado na tela de configuração:

1 curtida