java调用水晶报表时,横线和文字错位之解决办法尝试

我在开发水晶报表的过程中,发现文字和线条经常错位.万分苦恼.
问题是这样的:有一些老式的报表,文字有下划线,但不能用设置字体为下划线字体的方式解决,因为如果该字段为空的话,用下划线字体,则该处空白.而实际要求却是此处不管字段是否为空,线条是必须有的.
于是只能用画出线条的方式解决这个问题.
这实在是个烦琐的过程.因为要把每一根线条和文字恰到好处的配合,是非常困难的.并且我发现:即使你费了千辛万苦,在编辑器中预览报表,线条和字配合的很好的话,
如果在页面上显示,就是很乱的(常常是线条和文字重合,打印出来也有重合的现象).
非常的苦恼.我采用的报表编辑器是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调用水晶报表而苦恼的兄弟有帮助.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值