扩展AbstractJasperReportsSingleFormatView时生成的报告的文件名

时间:2011-12-05 19:12:01

标签: spring jasper-reports

我有一个扩展AbstractJasperReportsSingleFormatView的类,以Excel格式生成JasperReport。当然,当我执行报告并显示保存文件对话框时,报告将以通用名称保存。在这种情况下,“asociadoReporteGeneral”(无扩展名)。

我想指定一个更有意义的文件名,例如“asociadoReporteGeneral_20111205_130255.xls”。如何设置下载文件的文件名?

我尝试使用JRExporterParameter.OUTPUT_FILE_NAME参数,但这不起作用。还尝试在响应中设置Content-Disposition标头,但Spring也添加了一个,这会创建一个损坏的数据响应。

有什么想法吗?希望你能帮帮我。

public abstract class ReportRunnerImpl<T extends Identifiable<PK>, PK extends Serializable>
        extends AbstractJasperReportsSingleFormatView implements Serializable {

    /**
     * Requerido para serialización.
     */
    private static final long serialVersionUID = -585914283692895504L;

    private static final Logger log = Logger.getLogger(ReportRunnerImpl.class);

    private ReportRequest reportRequest = new ReportRequest();

    private ReportExportFormat reportExportFormat;

    protected static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition";

    public final static String REPORT_DATA_KEY = "report.dataKey";

    public final static String REPORT_ERROR_KEY = "report.error";

    public final static String REPORT_ERROR_DEFAULT_MESSAGE = "An error occured rendering your report.";

    public final static String REPORT_ERROR_MESSAGE_ID = "reportErrorMessage";

    public final static String REPORTE_TITULO = "reporte.titulo";

    @Autowired
    private transient MessageUtil messageUtil;

    @Override
    protected JRExporter createExporter() {
        JRExporter jrExporter;
        switch (reportExportFormat) {
        case HTML:
            jrExporter = new JRHtmlExporter();
            break;
        case PDF:
            jrExporter = new JRPdfExporter();
            break;
        case EXCEL:
            jrExporter = new JRXlsExporter();
            break;
        case WORD:
            jrExporter = new JRDocxExporter();
            break;

        default:
            throw new AssertionError("Unknown report export format: "
                    + reportExportFormat);
        }
        String nombreArchivo = getNombreArchivo();
        jrExporter.setParameter(JRExporterParameter.OUTPUT_FILE, nombreArchivo);
        jrExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
                nombreArchivo);
        return jrExporter;
    }

    @Override
    public String getContentType() {
        return reportExportFormat.getContentType();
    }

    public Collection<ReportExportFormat> getDownloadedReportExportFormats() {
        return ReportExportFormat.getDownloadedFormats();
    }

    /**
     * Obtiene la extensión del archivo del reporte que se va a descargar.
     * 
     * @return the extension archivo
     */
    protected String getExtensionArchivo() {
        String extension = null;
        switch (getReportExportFormat()) {
        case EXCEL:
            extension = ".xls";
            break;
        case HTML:
            extension = ".html";
            break;
        case PDF:
            extension = ".pdf";
            break;
        case WORD:
            extension = ".doc";
            break;
        }
        extension = StringUtils.trimToEmpty(extension);
        return extension;
    }

    /**
     * @return the messageUtil
     */
    public MessageUtil getMessageUtil() {
        return messageUtil;
    }

    /**
     * Obtiene el nombre del archivo con el que se desea descargar el reporte.
     * No debe incluir la exstensión. La extensión se registra de acuerdo al
     * tipo de exporter seleccionado para el reporte.
     * 
     * @return the nombreArchivo
     */
    public String getNombreArchivo() {
        ResourcesUtil resourceUtil = ResourcesUtil.getInstance();
        String fechaArchivo = DateTimeUtils.getFechaArchivo();
        String key = getPropiedadNombreArchivo();
        Object[] args = new Object[] { fechaArchivo };
        String nombreArchivo = resourceUtil.getProperty(key, args);
        String extension = getExtensionArchivo();
        StringBuilder sb = new StringBuilder();
        sb.append(nombreArchivo);
        sb.append(extension);
        nombreArchivo = sb.toString();
        return nombreArchivo;
    }

    /**
     * Obtiene la llave de la propiedad del nombre del archivo del reporte que
     * se está generando.
     * 
     * @return the propiedad nombre archivo
     */
    public abstract String getPropiedadNombreArchivo();

    public ReportExportFormat getReportExportFormat() {
        return reportExportFormat;
    }

    public Collection<ReportExportFormat> getReportExportFormats() {
        return ReportExportFormat.getFormats();
    }

    /**
     * @return the reportRequest
     */
    public ReportRequest getReportRequest() {
        return reportRequest;
    }

    public abstract ReportSource<T, PK> getReportSource();

    public String runReport(ReportRequest reportRequest,
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) {
        setUrl(reportRequest.getReportUrl());
        setReportExportFormat(getReportExportFormat());
        initApplicationContext();

        try {
            setupResponseHeaders(httpServletResponse);
            render(reportRequest.getReportParameters(), httpServletRequest,
                    httpServletResponse);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return null;
        }
        return "success";
    }

    public String runReport(RequestContext context) {

        String result = runReport(getReportRequest(),
                (HttpServletRequest) context.getExternalContext()
                        .getNativeRequest(), (HttpServletResponse) context
                        .getExternalContext().getNativeResponse());

        if (generatesDownloadContent()) {
            context.getExternalContext().recordResponseComplete();
        }
        return result;

    }

    /**
     * @param messageUtil
     *            the messageUtil to set
     */
    public void setMessageUtil(MessageUtil messageUtil) {
        this.messageUtil = messageUtil;
    }

    public void setReportExportFormat(ReportExportFormat reportExportFormat) {
        this.reportExportFormat = reportExportFormat;
    }

    /**
     * @param reportRequest
     *            the reportRequest to set
     */
    public void setReportRequest(ReportRequest reportRequest) {
        this.reportRequest = reportRequest;
    }

    /**
     * Estable los encabezados de la respuesta del servlet de acuerdo al tipo de
     * archivo que se está descargado.
     * 
     * @param httpServletResponse
     */
    private void setupResponseHeaders(HttpServletResponse httpServletResponse) {
        /* Content-Disposition */
        String nombreArchivo = getNombreArchivo();
        String extension = getExtensionArchivo();
        StringBuilder sb = new StringBuilder();
        sb.append("inline; filename=");
        sb.append(nombreArchivo);
        sb.append(extension);
        String contentDispositionValue = sb.toString();
        /*
         * httpServletResponse.setHeader(HEADER_CONTENT_DISPOSITION,
         * contentDispositionValue);
         */
    }

    @Override
    protected boolean useWriter() {
        return !reportExportFormat.isDownloaded();
    }
}

1 个答案:

答案 0 :(得分:0)

我发现了如何做到这一点。 AbstractJasperReportsSingleFormatView继承了允许指定/覆盖默认setHeaders(Properties headers)标头的方法HttpServletResponseAPI

在我的课堂上,在我调用render方法之前,我做了这个:

        Properties headers = new Properties();
        /* Content-Disposition */
        String nombreArchivo = getNombreArchivo();
        StringBuilder sb = new StringBuilder();
        sb.append("inline; filename=");
        sb.append(nombreArchivo);
        String contentDispositionValue = sb.toString();
        headers.put(HEADER_CONTENT_DISPOSITION, contentDispositionValue);

        setHeaders(headers);