co.com.realtech.mariner.util.jsf.file.FileDownloader.java Source code

Java tutorial

Introduction

Here is the source code for co.com.realtech.mariner.util.jsf.file.FileDownloader.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.realtech.mariner.util.jsf.file;

import co.com.realtech.mariner.util.excel.ExcelToPdf;
import co.com.realtech.mariner.util.excel.ResultSetToExcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;

/**
 * Clase encargada de exportar un arreglo de datos con sus columnas a formato
 * excel
 *
 * @author fabianagudelo
 */
public class FileDownloader {

    /**
     * Crea el informe seleccionado en formato excel.
     *
     * @param colHeaders
     * @param datos
     * @param nombreHoja
     * @param nombreArchivo
     * @param contexto
     * @param descargar
     * @return 
     * @throws java.lang.Exception
     */
    public File construirExcel(List<String> colHeaders, List<Object> datos, String nombreHoja, String nombreArchivo,
            FacesContext contexto, boolean descargar) throws Exception {
        File tempFile = null;
        try {
            ResultSetToExcel rste = new ResultSetToExcel(nombreHoja);
            tempFile = File.createTempFile("reporteGeneral", ".xlsx");
            OutputStream os = new FileOutputStream(tempFile);
            rste.generate(os, datos, colHeaders);
            if (descargar) {
                InputStream is = new FileInputStream(tempFile);
                byte[] bytes;
                bytes = IOUtils.toByteArray(is);
                descargarArchivo(contexto, bytes, nombreArchivo, "xlsx");
            }
        } catch (Exception e) {
            throw e;
        }
        return tempFile;
    }

    /**
     * Descarga un archivo del excel como PDF
     * @param archivoExcel
     * @param contexto
     * @param columnas
     * @return
     * @throws Exception 
     */
    public File descargarPdfDeExcel(File archivoExcel, FacesContext contexto, int columnas) throws Exception {
        File tempFile = null;
        try {
            tempFile = File.createTempFile("reporteGeneral", ".pdf");
            ExcelToPdf.convert(archivoExcel, tempFile, columnas);
            InputStream is = new FileInputStream(tempFile);
            byte[] bytes;
            bytes = IOUtils.toByteArray(is);
            descargarArchivo(contexto, bytes, "reporteGeneral", "pdf");
        } catch (Exception e) {
            throw e;
        }
        return tempFile;
    }

    /**
     * Descargar excel a travs del FacesContext.
     *
     * @param context
     * @param bytes
     * @param nombreArchivo
     */
    private static void descargarArchivo(FacesContext context, byte[] bytes, String nombreArchivo,
            String extension) {
        ExternalContext externalContext = context.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
        try {
            try (ServletOutputStream servletOutputStream = response.getOutputStream()) {
                response.addHeader("Content-Type", "application/" + extension);
                response.addHeader("Content-Disposition",
                        "attachment; filename=" + nombreArchivo + "." + extension);
                response.setContentLength(bytes.length);
                response.setContentType("application/" + extension);
                servletOutputStream.write(bytes);
                servletOutputStream.flush();
                context.responseComplete();
            }
        } catch (Exception e) {
            System.out.println("Error enviando reporte al cliente, error causado por " + e);
        }
    }

    /**
     * Descargar archivo a travs del FacesContext.
     *
     * @param context
     * @param bytes
     * @param nombreArchivo
     */
    public void descargarArchivoFacesContext(FacesContext context, byte[] bytes, String nombreArchivo) {
        ExternalContext externalContext = context.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
        try {
            if (bytes == null) {
                System.out.println("Bytes nulos en respuesta de PDF");
            } else {
                try (ServletOutputStream servletOutputStream = response.getOutputStream()) {
                    response.addHeader("Content-Type", "application/pdf");
                    response.addHeader("Content-Disposition", "attachment; filename=" + nombreArchivo + ".pdf");
                    response.setContentLength(bytes.length);
                    response.setContentType("application/pdf");
                    servletOutputStream.write(bytes);
                    servletOutputStream.flush();
                    context.responseComplete();
                }
            }
        } catch (Exception e) {
            System.out.println("Error enviando archivo PDF, error causado por " + e);
        }
    }

}