我有一个Jasper报告,它检索包含带键值对的XML数据的CLOB字段,我写了一个读取CLOB的类,解析XML并返回包含键值对的MAP。有没有办法在iReport中解析地图并能够将Jasper函数应用于它(例如str(...)
)?
为了澄清事情,密钥是附加到报告的资源文件的密钥,这就是我需要str
函数的原因。
我尝试将其作为单个字符串而不是地图返回,包含$R{KEY}
或str(KEY)
,但没有运气,它们都被解析为字符串。
任何想法或解决方法?
编辑1: 检索到的地图大小未知,它可能包含一个键值条目或十个键值条目,具体取决于数据库中存储的内容。此外,密钥很重要,我需要它们在资源文件中的值。见下面的样本:
资源文件:
key1 = Brand
key2 = Price
key3 = Location
...
从数据库中检索第1行的地图是:
key1: BMW
key2: 20000
key3: Germany
从数据库中检索第2行的地图是:
key1: Audi
key2: 30000
报告中所需字段的输出应为:
row 1:
Brand BMW
Price 20000
Location Germany
row2:
Brand Audi
Price 30000
编辑2:
我能够做一些我想要的东西,但在我看来,以一种令人讨厌的方式,我做的是我写了一个类来获取CLOB并返回一个带键值对的地图,我做了以下内容jrxml:
- 包含此地图的变量MAP
,其表达式为path.to.class.getMap($F{CLOB_DATA})
- 一个变量KEY_IT
,它包含一个用于键$V{MAP}.entrySet().iterator()
的迭代器
- 变量VAL_IT
,它包含一个用于值$V{MAP}.entrySet().iterator()
现在,我可以使用这样的迭代器:
row 1, cell 1:
$V{KEY_IT}.hasNext() ? str((String)((Map.Entry)$V{KEY_IT}.next()).getKey()) : ""
row 2, cell 1:
$V{KEY_IT}.hasNext() ? str((String)((Map.Entry)$V{KEY_IT}.next()).getKey()) : ""
.
.
.
row 1, cell 2:
$V{VAL_IT}.hasNext() ? (String)((Map.Entry)$V{VAL_IT}.next()).getValue() : ""
row 2, cell 2:
$V{VAL_IT}.hasNext() ? (String)((Map.Entry)$V{VAL_IT}.next()).getValue() : ""
.
.
.
但是,我不得不在彼此之下放置这么多单元格,包含相同的表达式,所以这是最糟糕的部分,如果我有一个条目或20个条目,报告将是相同的高度,同样,有一个最大值对于条目,因为我必须将它们专门放在文本字段中并给它们表达,是否有更好的方法来做到这一点?