我有一个扩展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();
}
}
答案 0 :(得分:0)
我发现了如何做到这一点。 AbstractJasperReportsSingleFormatView
继承了允许指定/覆盖默认setHeaders(Properties headers)
标头的方法HttpServletResponse
。 API
在我的课堂上,在我调用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);