欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Birt自定义中文文件名

程序员文章站 2024-02-29 22:35:10
...

最近有需求是导出时就将名称设置好,用户不想再去编辑一次,嫌麻烦!!!然后就有了篇文字。。。

通过查看其它资料发现,是要进行重写getFilename方法,通过DEBUG找到了实现的一个大致路线。
Birt自定义中文文件名
在浏览器中检查元素会发现,有元素包裹了一些信息(具体头内容信息查看:https://blog.csdn.net/weixin_43453386/article/details/83792682),其中有一个为filename,这个就是我们要处理的参数。

在我使用的Birt4.6.0版本中,通过DEBUG了解了大致调用路线。有个类名为EngineFragment的类,在EngineFragment的doPreService方法中设置filename。Birt自定义中文文件名
在工具类ParameterAccessor中:
Birt自定义中文文件名
Birt自定义中文文件名
Birt自定义中文文件名
IFilenameGenerator这个类在ParameterAccessor中的initParameters方法进行了初始化:
Birt自定义中文文件名
先通过getInitParameter方法获取web.xml中获得BIRT_FILENAME_GENERATOR_CLASS属性,判断xml中是否有配置然后对
exportFilenameGenerator实例化。
大致调用路线知道了,就开始修改。

birt 修改导出的文件名实现方法:
一、在web.xml中追加配置的 BIRT_FILENAME_GENERATOR_CLASS

<context-param>  
    <param-name>BIRT_FILENAME_GENERATOR_CLASS</param-name>  
    <param-value>  
        prd.birt.report.filename.TimestampFilenameGenerator   
    </param-value>  
</context-param> 

二、实现IFilenameGenerator 接口

public class CustomExportGenerator implements IFilenameGenerator {
    @Override
    public String getFilename( String baseName, String fileExtension, String outputType, Map options) {
    	String exportName = null;
    	Object obj = options.get(IFilenameGenerator.OPTIONS_HTTP_REQUEST);
        if(obj !=null && obj instanceof RequestFacade){
            RequestFacade request = (RequestFacade)obj;
            // preview?&__report=Test.rptdesign&__filename=测试
            //__filename可以自己定义不强求为这个名称,与路径名称一致即可
            exportName = ParameterAccessor.getParameter(request,"__filename");
        }
        return exportName + "." + fileExtension;
    }
}

getParameter为工具类ParameterAccessor中提供的方法
Birt自定义中文文件名
因为我们要的是中文文件名称,所以再修改下:

  exportName = java.net.URLEncoder.encode(exportName, "UTF-8");//return前添加这行就可以了
  return exportName + "." + fileExtension;

这样导出或下载文件就为自定义名称了。