我正在生成一个报告,其中包含7列,其中最后6列应列出最后6个月。因此,截至撰写本文时,它应该是:
NAME -> September -> August -> July -> June -> May -> April
是列标题。我试图避免必须将它们作为参数传递,并且我试图让Jasper Reports在运行时弄清楚它。我可以使用文本字段表达式轻松获得第一个月。它看起来像:
new java.text.SimpleDateFormat("MMMMM").format(new Date())
问题出在其他月份。我最初尝试过
new java.text.SimpleDateFormat("MMMMM").format(java.util.Calendar.getInstance().add(Calendar.MONTH, new Integer("-1)).getTime())
这不起作用,因为Calendar.add
未返回Calendar
实例。然后我尝试使用变量,然后使用变量组合,这些变量也不起作用。
如何使Jasper Reports以编程方式确定报告中的列名?
答案 0 :(得分:1)
我认为解决此问题的最佳方法是使用Commons Lang。该软件包提供了实用程序来进行这样的计算非常简单。通过添加一个额外的jar,您可以使用这样的表达式:
DateUtils.addMonths(new Date(),-1)
我发现比首先创建一个帮助器Calendar类然后使用三元运算符但忽略其结果更容易维护。
$P{cal}.add(Calendar.MONTH, -1)
? null : $P{cal}.getTime()
如果您需要概括解决方案,那么从SQL查询获取日期比获取日历要容易得多。因此,您可以快速更改为“DateUtils.addMonths($ F {MyDate}, - 1)”。初始化日历以匹配查询返回的日期并不是那么简单。但是,当然不必添加一个.jar文件有一定的好处。因此,有时候三元运算符技术是完成任务的最快方法。
几年前我写过关于使用Commons Lang方法的文章:http://mdahlman.wordpress.com/2009/09/09/jasperreports-first-dates/
答案 1 :(得分:1)
我还需要上个月的某种格式。我最后结合了另外两个答案:
new java.text.SimpleDateFormat("yyyyMM").format(
org.apache.commons.lang3.time.DateUtils.addMonths(
new java.util.Date(),
-6
)
)
这样我就不需要添加其他参数了。添加Commons Lang
jar对我来说不是问题,因为JasperServer 5.5带有开箱即用的3.0版本。
我希望这可以帮助那些在这个网页上st someone的人,就像我一样。
答案 2 :(得分:0)
我找到了一个非常巧妙的工作解决方案(不,我没想出来)。我发现它here。它的要点是创建一个名为call的参数,默认值为:
Calendar.getInstance()
并取消选中“用作提示”选项。然后在文本字段表达式中执行:
new java.text.SimpleDateFormat("MMMMM").format(
(
$P{cal}.add(Calendar.MONTH, -1)
? null : $P{cal}.getTime()
)
)
它会设置日历实例的默认值,然后执行add方法,该方法将解析为false,然后它将返回getTime()方法的结果,该方法按照我想要的格式进行格式化。 / p>