利用VB實現寬行打印的一個技巧
發表于:2007-07-14來源:作者:點擊數:
標簽:
一、 問題的提出 我在本報曾經發過一篇《利用 VB 設計打印復雜報表》的文章,引起很多同仁的興趣,紛紛來信與我探討這種行之有效的方法。有人提出這樣一個問題:你講的全是針對一行打印一條數據記錄的方法,我有一個表,字段比較少,并且一直用寬行打印紙來
一、 問題的提出 我在本報曾經發過一篇《利用
VB設計打印復雜報表》的文章,引起很多同仁的興趣,紛紛來信與我探討這種行之有效的方法。有人提出這樣一個問題:你講的全是針對一行打印一條數據記錄的方法,我有一個表,字段比較少,并且一直用寬行打印紙來打印,這樣就造成了半邊紙的浪費,有沒有辦法在一行打印兩條記錄以充分利用紙張呢?例如我們要按下面的要求打?。?
姓名 性別 職業 職務
姓名 性別 職業 職務
C(2,1) C(2,2) C(2,3) C(2,4)
C(2,7) C(2,8) C(2,9) C(2,10)
---- 二、 問題分析
---- 從上篇文章陳述的原理來看,就是把數據表的每一條記錄的數據抽取出來形成EXCEL文件,充分利用EXCEL的強大的編輯功能實現報表的設計、打印。由于是每一條記錄占一行,所以利用下面的循環就可以很自然地實現:
For i = 0 To datPrimaryRS.RecordCount - 1
xlSheet.Cells( I+2, 1) =
datPrimaryRS![“字段名”]
……'I+2表示從第二行開始放置記錄
Next I
---- 很顯然用上述方法肯定不能夠實現在一行打印兩條記錄的功能。我們能夠看出在左邊的一排對應的I為 0,2,4,6,8……;在右邊的一排對應的I為:1,3,5,7……。問題似乎很簡單,左排對應的規律應該為:2*I;右邊排對應的規律應該為:(2*I+1)。循環寫成如下的樣子:
For i = 0 To datPrimaryRS.RecordCount - 1
'先打印左排
xlSheet.Cells( 2*I+2, 1) =
datPrimaryRS![“字段名”]
……'I+2表示從第二行開始放置記錄
' 下面打印右排:
xlSheet.Cells((2*I+1)+2, 7) =
datPrimaryRS![“字段名”]
……
Next I
---- 打印結果一看,這種方法是根本行不通的。上面的方法根本沒有考慮行與記錄的對應關系。左右兩條記錄對應同一個行號。
---- 三、問題解決
---- 仔細分析不難發現左排右排的對應關系如下:
左排 0 2 4 6 8
右排 1 3 5 7 9
行號 2+0 2+1 2+2 2+3 2+4
---- 從上表可以看出規律:左排 I/2 對應著行號,右排的行號也應該是I/2。而右邊的記錄號卻是I/2+1的。所以要有一個判斷該記錄號到底是放在左邊還是放在右邊。這時可以利用Mod函數來判斷,程序代碼如下:
For I = 0 To datPrimaryRS.RecordCount - 1
If (i Mod 2) = 0 Then
xlSheet.Cells( 2*I+2, 1) =
datPrimaryRS![“字段名”]
j = i / 2 '取出行號給右排記錄定位
Else
xlSheet.Cells(j+2, 7) =
datPrimaryRS![“字段名”]
End If
Next I
---- 這時就可以按記錄的先后秩序打印出雙排的報表了。
---- 四、 問題總結
---- 利用上述方法實現了雙排打印,又一次證明了這種打印方法的極大的靈活性。
原文轉自:http://www.anti-gravitydesign.com