天天看點

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"這句話.你要的補橫線的效果也出來了,并且可以恰恰補到報表底部你想到達的任何位置.

繼續閱讀