天天看点

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"这句话.你要的补横线的效果也出来了,并且可以恰恰补到报表底部你想到达的任何位置.