首先是要搞到viewservert的源码。然后定义自己的文件名称生成类JpmsFilenameGenerator,我是这样写的。
package com.kong.report.web.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequestWrapper;
import org.eclipse.birt.report.utility.filename.IFilenameGenerator;
/**
* @author kong
* @create 2017年9月26日下午5:30:06
*/
public class JpmsFilenameGenerator implements IFilenameGenerator {
public static final String DEFAULT_FILENAME = "BIRTReport"; //$NON-NLS-1$
public JpmsFilenameGenerator(){}
/**
* @see org.eclipse.birt.report.utility.filename.IFilenameGenerator#getExportFilename(String,String,Map)
*/
@SuppressWarnings("rawtypes")
@Override
public String getFilename(String baseName, String extension, String outputType, Map options) {
String exportName = _getExportName(options);
if(exportName !=null && !"null".equalsIgnoreCase(exportName)){
baseName = exportName;
}
return makeFileName(baseName, extension);
}
@SuppressWarnings("rawtypes")
private String _getExportName(Map options) {
String exportName=null;
Object obj = options.get("httpRequest");
if(obj !=null){
HttpServletRequestWrapper request = (HttpServletRequestWrapper)obj;
String time = request.getParameter("time");//报表时间
String reportName = request.getParameter("fileName"); //日报名称
exportName = time + "_" + reportName + "_导出时间";
}
return exportName;
}
/**
* Makes a filename using the target extension from the options.
* @param fileName file name which extension must be replaced
* @return file name with replaced extension
*/
public static String makeFileName( String fileName, String extensionName ) {
String baseName = fileName;
if (baseName == null || baseName.trim().length() <= 0) {
baseName = DEFAULT_FILENAME;
}
baseName +="_" + new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date());//报表导出时间
// append extension name
if (extensionName != null && extensionName.length() > 0) {
baseName += "." + extensionName; //$NON-NLS-1$
}
return baseName;
}
}
网上‘_getExportName’方法的其它写法。
private String _getExportName(Map options) {
String exportName=null;
Object obj = options.get("httpRequest");
if(obj !=null && obj instanceof RequestFacade){
RequestFacade request = (RequestFacade)obj;
exportName = ParameterAccessor.getParameter(request,"__exportName");
}
return exportName;
}
- 然后在web.xml里添加下面的配置:
<context-param>
<param-name>BIRT_FILENAME_GENERATOR_CLASS</param-name>
<param-value>com.jiguang.report.utility.filename.JpmsFilenameGenerator</param-value>
</context-param>
- 最后修改一下FramesetFragment这个类的doPreService方法,有一段设置文件编码的
String filename = ParameterAccessor.getExportFilename(new BirtContext(request, response), format, emitterId);
response.setHeader("Content-Disposition", openType + "; filename=\"" + filename + "\"");
更改为
String filename = ParameterAccessor.getExportFilename( new BirtContext( request, response ), format, emitterId );
String filedisplay = URLEncoder.encode(filename,"utf-8");
filedisplay = filedisplay.replace("+","%20");//将+替换成空格;
response.setHeader( "Content-Disposition", //$NON-NLS-1$
ParameterAccessor.htmlEncode( openType )
+ "; filename=\"" //$NON-NLS-1$
+ ParameterAccessor.htmlEncode( filedisplay )
+ "\"" );
小插曲~
Tomcat中URIEncoding要设置好,要不然就中文乱码。
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
ok,调用的时候通过在调用报表的url上拼接参数 fileName="这是中文报表"就Ok了。
var fileName = '这是中文报表';
var basePath = '<%=basePath%>';
var birtUrl = 'frameset?__report=gate_day_report.rptdesign&__showtitle=false&__toolbar=false&__navigationbar=false&__parameterpage=false';
var jsonUrl = '${param.jsonUrl}'+'gate/day/generateBirt&gateId='+gateId+'&time='+time+'&fileName='+fileName;
var print = '__format='+printType+'&__pageoverflow=0&__asattachment=true&__overwrite=false';
window.location.href = birtUrl + "&JSONURL=" + jsonUrl + "&" + print;
然后就打印出中文文件名文档了。
修改源码后的jar包可以跳转到下面地址下载
https://download.csdn.net/download/wzg921/10405196
推荐个小软件:class文件可以用jd-gui查看,但是没法更改。
如有错误之处,望指正。