JasperServer
Tomcat的Cannot serialize session attribute XXX for问题
Context.xml中增加<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>用来停止保存Session资源
JasperServer的汉化
复制jasperserver\WEB-INF\bundles\jasperserver_messages.properties为jasperserver_messages_zh.properties修改里面的属性为中文后,用jdk工具native2ascii.exe进行转码
中文问题
导出pdf的时候需要将iTextAisan.jar放在lib文件夹中,然后指定PDF导出的字体
Pdf Font Name : STSong-Light
Pdf Encoding : UniGB-UCS2-H (Chinese Simplified)
导出Excel没有表头
修改WEB-INF/classes/jasperreports.properties文件,增加下面内容:
# keep the first column header on export
net.sf.jasperreports.export.xls.exclude.origin.keep.first.band.1=pageHeader
net.sf.jasperreports.export.xls.exclude.origin.keep.first.band.2=columnHeader
修改导出列表
由于导出CSV文件乱码,想将其从列表中移除,修改WEB-INF/flows/viewReportBeans.xml
编辑exporterConfigMap配置,将CSV配置注释掉就OK。
日期格式化(修改日期格式为yyyy-MM-dd格式)
1.修改jasperserver\WEB-INF\bundles\jasperserver_config.properties,这样InputControl中的日期控件的格式会做相应的更改。
2.修改jasperserver\WEB-INF\applicationContext.xml文件对configurationBean定义的日期格式,这样显示查询结果会做相应的更改
Title的更改
文件位置:jasperserver\WEB-INF\decorators\decorator.jsp,修改页面的Title标签即可
iReport
小数点设置
使用iReport的时候通常要定义变量, 并且经过一系列的计算得到最终的值。但我们需要最终的值只保留两位小数,因此需要对其进行设置。比较简单的是让它返回BigDecimal对象,在Variable Expression中这样设置:(new BigDecimal(计算公式)).setScale(2,BigDecimal.ROUND_HALF_UP)
SubReport
添加Subreport时如果需要依赖输入参数,那么需要在Mainreport中的Subreport属性面板中设置。上传到Jasperserver中主报表访问子报表需要用repo路径,如:
<subreportExpression class="java.lang.String"><![CDATA["repo:subreport"]]></subreportExpression>如果有问题可继续尝试在subreport前增加/
Web端导出Excel
在Web端展示的时候,使用的是struts2-jasperreports-plugin这样的一个插件。然而在Chrome中导出Excel的时候遇到了问题:文件的后缀不是.xls而是.action,这是由于没有对Response设置Header信息的缘故。所以需要在struts2的xml文件中指定这个插件的documentName属性。这样插件会对Response设置Header和documentName指定的文件名,文件名的后缀它会读取format指定的格式,这里是XLS。
Struts2的result信息配置如下:
<result name="exportOrdersXLS" type="jasper"> <param name="location">/jaspers/orders.jasper</param> <param name="connection">connection</param> <param name="reportParameters">reportParameters</param> <param name="exportParameters">exportParameters</param> <param name="format">XLS</param> <param name="documentName">Orders</param> <param name="imageServletUrl"><![CDATA[/image?image=]]></param> </result>
iReport中获取JasperServer登录的用户和权限
In a report define the follwing parameters: <!-- this is passed in automatically by JasperServer --> <parameter name="LoggedInUser" class="com.jaspersoft.jasperserver.api.metadata.user.domain.User"/> <!-- these are dependent parameters --> <parameter name="LoggedInUserRoles" class="java.util.Collection"> <defaultValueExpression><![CDATA[$P{LoggedInUser}.getRoles()]]></defaultValueExpression> </parameter> <parameter name="LoggedInUserRolesAsStrings" class="java.util.Collection"> <defaultValueExpression><![CDATA[convert $P{LoggedInUserRoles} to collection of strings - Gtroovy or Java Expression, or scriptlet method call]]></defaultValueExpression> </parameter> <!-- use JasperReports $X to get the role name values into an IN clause --> <queryString> <![CDATA[select * from blah where $X{IN, role_name, LoggedInUserRolesAsStrings} ]]> </queryString>
国外网站给的解决方案,但是需要用scriptlet增加对权限的解析,如:
public class UserRolesScriptlet extends JRDefaultScriptlet { public String extractAllRoles(User js_user) { StringBuffer roles = new StringBuffer(); Iterator role_iter = js_user.getRoles().iterator(); while (role_iter.hasNext()) { roles.append(((Role) role_iter.next()).getRoleName()+","); } String roles_str = roles.toString(); return roles_str.substring(0,roles_str.length()-1); } }