我在开发水晶报表的过程中,发现文字和线条经常错位.万分苦恼.
问题是这样的:有一些老式的报表,文字有下划线,但不能用设置字体为下划线字体的方式解决,因为如果该字段为空的话,用下划线字体,则该处空白.而实际要求却是此处不管字段是否为空,线条是必须有的.
于是只能用画出线条的方式解决这个问题.
这实在是个烦琐的过程.因为要把每一根线条和文字恰到好处的配合,是非常困难的.并且我发现:即使你费了千辛万苦,在编辑器中预览报表,线条和字配合的很好的话,
如果在页面上显示,就是很乱的(常常是线条和文字重合,打印出来也有重合的现象).
非常的苦恼.我采用的报表编辑器是crystal reporter for weblogic workshop 10.0.0.533.
水晶报表对java的支持的确需要改进许多.
但是,有什么办法来弥补这个水晶报表的bug呢?
经过一翻探索,发现可以用设置下划线字体的方法解决,方案是这样的
1:把要显示的字段赋给公式字段A;
2:如果该字段为空,则公式字段按照指定的长度补空格,这样,下划线在字段为空的情况下也可以出来
3:如果字段字数少于要求的长度,则公式字段A补空格到指定的长度.
4:对一行中有换行的情况需要特殊处理:需要把换行符去掉,并做标记,然后补空格,直到该行填满一整行为止;然后和剩下的字符串相加.
需要注意的是,采用水晶的len函数求得的字符串长度是不正确的,它把英文和数字当作一个长度,汉字也当作一个长度.而实际情况却是汉字占位长是英文和数字的2倍.
所以,我们需要重新写一个求字符串实际长度的函数(用unicode码为127分界全角和半角):
(采用水晶报表basic脚本)
'''''''字符长度函数
Function MYLEN(WORD AS STRING)
DIM TEMP
IF ASCW(WORD)>127 THEN
TEMP=2
ELSE
TEMP=1
END IF
MYLEN=TEMP
End Function
'''''''字符串长度函数
Function MYSTRLEN (STR AS STRING)
DIM I
DIM STRLEN
STRLEN = 0
FOR I=1 TO LEN(STR)
IF(ASCW(MID(STR,I,1))<>13 AND ASCW(MID(STR,I,1))<>10) THEN
STRLEN = STRLEN + MYLEN(MID(STR,I,1))
END IF
NEXT I
MYSTRLEN = STRLEN
End Function
'''''
'自动换行补空函数,对一行中有换行的情况需要特殊处理:需要把换行的地方做标记,然后补空格,直到该行填满一整行为止
'STR-----操作的字符串
'WORDNUM--每行多少字
Function AUTOCHANGELINE (STR AS STRING,WORDNUM AS NUMBER)
DIM TEMPSTR
DIM START '截取字符开始位置
DIM STRLEN '截取的字符长
DIM ADDSPACENUM '补空格数
DIM I
DIM J
START=1
TEMPSTR=""
ADDSPACENUM=0
FOR I =1 TO LEN(STR)
IF ASCW(MID(STR,I,1))=10 THEN
TEMPSTR=TEMPSTR + MID(STR,START,I-START)
IF ASCW(MID(STR,I+1,1))=13 OR ASCW(MID(STR,I+1,1))=10 THEN
I=I+1
ELSE
START=I+1
END IF
'补空格
IF Remainder(MYSTRLEN(TEMPSTR),WORDNUM)<>0 THEN
'ADDSPACENUM = WORDNUM - Remainder(MYSTRLEN(TEMPSTR),WORDNUM)
ADDSPACENUM = 200
FOR J=1 TO ADDSPACENUM
TEMPSTR = TEMPSTR + " "
NEXT J
END IF
TEMPSTR = TEMPSTR+CHR(10)
END IF
NEXT I
'最后一行如果没换行则进行如下处理
IF START<LEN(STR) THEN
TEMPSTR = TEMPSTR + MID(STR,START)
IF Remainder(MYSTRLEN(TEMPSTR),WORDNUM)<>0 THEN
'ADDSPACENUM = WORDNUM - Remainder(MYSTRLEN(TEMPSTR),WORDNUM)
ADDSPACENUM = 200
FOR J=1 TO ADDSPACENUM
TEMPSTR = TEMPSTR + " "
NEXT J
END IF
START = LEN(STR)
END IF
AUTOCHANGELINE = TEMPSTR
End Function
使用的时候,是这样:
比如要显示{LP_XLGZP1.AQCS},可以定义一个公式字段A:
formula = AUTOCHANGELINE({LP_XLGZP1.AQCS},180) '每行不超过180个字符
然后把A拖到报表中,调整宽度到180,效果就出来了
如果该字段没有很多字,而你需要补充横线直到报表底部的话,可以加一个公式字段space:
DIM I
DIM STR
STR=""
FOR I = 101 TO 4000
STR = STR + " "
IF Remainder(I,100)=0 THEN
STR = STR + CHR(10)
END IF
NEXT I
FORMULA = STR
把space放到A的下面,根据实际,适当调整"FOR I = 101 TO 4000"这句话.你要的补横线的效果也出来了,并且可以恰恰补到报表底部你想到达的任何位置.
特此存档,希望对那些用java调用水晶报表而苦恼的兄弟有帮助.