当前位置:编程学习 > VB >>

请问vb打印问题,如何在一页上打印2列甚至更多列.

比如.

学号 姓名    |   学号 姓名

一般在数据报表打印时不是只能有左边的 学号 姓名吗?我现在想要变成 学号 姓名      学号  姓名.
并且数据是左边的数据到底后再转到右边的学号 姓名里来.


谢谢.

--------------------编程问答-------------------- 怎么没人回答,是我没说清楚吗 --------------------编程问答-------------------- 怎么没人回答啊..
晕晕...... --------------------编程问答-------------------- 你自己都没说清楚问题,比如你是借助于VB的报表工具打印,或是printer对象打印,你叫别人怎么回你 --------------------编程问答-------------------- 谢谢回答!!
我想做个报表.
用vb的报表工具来制作.
我要打印的数据是一个表中的 "序号"   "学号"  "姓名" 3个字段.
但是我想在一张A4纸张上并列打印2列.如下:
---------------------------------------------------------(纸张的边界)
序号     学号        姓名              序号      学号         姓名
 1      003031     李1               20     003051       张三
 2     003032     李2              21     003052       张四
 ..    ......     ...             ...      ....      ....
 ..    ......     ...              ...      ....      ....
 ..    ......     ...             ...      ....      ....
 ..    ......     ...             ...      ....      ....
 ..    ......     ...             ...      ....      ....
 ..    ......     ...             ...      ....      ....
19     000000     xxx  
----------------------------------------------------------纸张的边界)
想按照这种排版格式来打印,该怎么实现.谢谢!!
--------------------编程问答-------------------- 用VB的报表工具的话,似乎只有手工配置一个这样格式的记录集,绑定报表 --------------------编程问答-------------------- 第1笔的三个字段    第2笔的三个字段
第3笔的三个字段    第4笔的三个字段
第5笔的三个字段    第6笔的三个字段

打印是1-2笔换行再印3 4 再印5 6 笔

如果像你的1-20 另一组是21-40 这样还是可行, 

我会第1笔的三个字段加上第21笔的三个字段加VbCrLf

但数据库的记录移来移去非常麻烦,而且耗资源与影响速度. (我指的是笔数庞大时)

我利用我的邮编临时写的打印测试, 如图, 如果你要的话便给我邮箱, 你自己再改, 因为要以你的思路来改

当然可行, 可在我的立场来说,呵呵....是有点浪费时间, 除非你是用在商业上搞不定收不到钱,这样子的情况

我就会帮你, 学习的话, 就用我这代码自己去琢磨吧.

效果图:
http://p.blog.csdn.net/images/p_blog_csdn_net/cbm666/366646/o_PrintZip.jpg






--------------------编程问答-------------------- 花了点时间帮你改好了

'****** 工程引用Microsoft ActiveX Data Objects 2.5 Library
'数据库名与表名自己改,并把它与程序放在同一路径
'cbmcust.mdb zip是表名, 含4个字段 你自己改你的

'添加Picture1

Option Explicit
Public conn As New ADODB.Connection '定义数据连接字符串
Public rs As New ADODB.Recordset '定义记录集
Dim aa$, bb$, cc$, dd$, i&, j&, recno&, PageNo&, db$, Appdisk$, spc1&, spc2&, spc3&, spc4&
Dim CBMstr$(1)

Private Sub Form_Load()
   Appdisk = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
   db = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & Appdisk & "cbmcust.mdb"
   conn.CursorLocation = adUseClient
   conn.Open db '打开数据库连接
   rs.Open "zip", conn, adOpenKeyset, adLockPessimistic '打开记录集
   If rs.RecordCount <= 0 Then MsgBox "数据库内无资料": Unload Me
   Me.Caption = "CBM666 的邮编总览打印测试"
   Me.Width = 10100: Me.Height = 9000
   Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
   Picture1.Width = Me.Width: Picture1.Height = Me.Height
   Picture1.Move Screen.Width, 0
   Picture1.AutoRedraw = True
   PageNo = 1
   Call ShowallZip
End Sub

Private Sub Form_Unload(Cancel As Integer)
   rs.Close
   conn.Close
   End
End Sub

Private Sub Picture1_Click()
   Picture1.Move Screen.Width, 0
   rs.MoveFirst
End Sub

Private Sub Form_Click()
   Call ShowallZip
   '**** 打印 标记拿掉即可打印
   'Printer.Orientation = vbPRORLandscape
   'Printer.PaintPicture Picture1.Image, 0, 0, Picture1.Width, Picture1.Height
   'Printer.EndDoc
End Sub

Private Sub ShowallZip()
   Picture1.Cls
   Picture1.Move 0, 0
   Picture1.Print
   Picture1.FontSize = 36
   Picture1.FontBold = True
   aa = "★ 全国邮编一览表 ★"
   Picture1.CurrentX = (Picture1.Width - CBMstrlen(aa) * 10 * Picture1.FontSize) \ 2
   Picture1.Print aa
   Picture1.FontBold = False
   Picture1.FontSize = 12
   Picture1.Print
   Picture1.Print "省    名  城  市  名  称  邮  编  区  号   省    名  城  市  名  称  邮  编  区  号"
   Picture1.Print String(126, "-")
   For i = 0 To 19 '每20行一页
      CBMstr(0) = "": CBMstr(1) = ""
      For j = 0 To 1
         recno = IIf(j = 0, i, i + 20)
         rs.MoveFirst
         rs.Move recno
         aa = Trim(rs.Fields(0))
         aa = IIf(CBMstrlen(aa) > 8, CBMmid(aa, 1, 8), aa)
         spc1 = IIf(CBMstrlen(aa) < 8, 8 - CBMstrlen(aa), 0)
         
         bb = Trim(rs.Fields(1))
         bb = IIf(CBMstrlen(bb) > 14, CBMmid(bb, 1, 14), bb)
         spc2 = IIf(CBMstrlen(bb) < 14, 14 - CBMstrlen(bb), 0)
         
         cc = Trim(rs.Fields(2))
         cc = IIf(Len(cc) > 6, Mid(cc, 1, 6), cc)
         spc3 = IIf(Len(cc) < 6, 6 - Len(cc), 0)
         
         dd = Trim(rs.Fields(3))
         dd = IIf(Len(dd) > 6, Mid(dd, 1, 6), dd)
         spc4 = IIf(Len(dd) < 6, 6 - Len(dd), 0)
         
         CBMstr(j) = CBMstr(j) & aa & Space(spc1) & Space(2) & bb & Space(spc2) & Space(2) & cc & Space(spc3) & Space(2) & dd & Space(spc4)
         If Not rs.EOF Then rs.MoveNext
         If rs.EOF Then Exit For
      Next j
      If rs.EOF Then Exit For
      Picture1.Print CBMstr(0) & Space(3) & CBMstr(1)
   Next i
   Picture1.Print String(126, "-")
   Picture1.Print
   Picture1.FontSize = 14
   aa = "*** 第 " & CStr(PageNo) & " 页 ***"
   Picture1.CurrentX = (Picture1.Width - CBMstrlen(aa) * 10 * Picture1.FontSize) \ 2
   Picture1.Print aa
End Sub

Public Function CBMmid(ByVal tstr As String, start As Integer, Optional leng As Variant) As String
   Dim tmpstr$
   tmpstr = IIf(IsMissing(leng), StrConv(MidB(StrConv(tstr, vbFromUnicode), start), vbUnicode), StrConv(MidB(StrConv(tstr, vbFromUnicode), start, leng), vbUnicode))
   CBMmid = tmpstr
End Function

Public Function CBMstrlen(Wstr$) As Long
   CBMstrlen = LenB(StrConv(Wstr, vbFromUnicode))
End Function


效果图:
http://p.blog.csdn.net/images/p_blog_csdn_net/cbm666/366646/o_ZIP.jpg --------------------编程问答-------------------- 太感谢了!!
我要慢慢学.
因为是原来的表格格式,不好去更改,那上面的格式就是这样子.
没办法啊.
我先试试看.
谢谢!!~``` --------------------编程问答-------------------- 你太有才了.刚看了你的效果图.
我要好好琢磨一下.
呵呵... --------------------编程问答-------------------- 纯粹是学习VB.
现在还没有资格谈商业啊.呵呵.... --------------------编程问答-------------------- Attn:楼主

如果你需要 zip 那个表的话,给我邮箱,以便于你的测试. --------------------编程问答-------------------- 3Q.
p13402100000@yahoo.cn
谢谢!!
你的程序我还看不大懂.要先多看看.呵呵.... --------------------编程问答-------------------- 有了数据库你运行对照一下就了解了, 省份长度16 代码是8 城市是28代码是14 因为中文占两字符 --------------------编程问答-------------------- 代码整个工程print2040.rar已发给你了 --------------------编程问答-------------------- 非常感谢啊.
已经在拜读了.
不过里面的函数挺多的.
正在学习.
谢谢!!!!!!! --------------------编程问答-------------------- 还想请问一下.
"省份长度16 代码是8 城市是28代码是14"在您给的例子中,如果我需要"名称"当数据长于一定长度时必须转行该怎么做?
此时一页仍然要3组(省名  城市  名称  区号  |省名  城市  名称  区号|省名  城市  名称  区号) ,
但是此时的这一行高度会超过普通的不用转行的那些行了.
也就是说,此时的数量就不会是一页90个了.
该如何设置变量呢?

即,每一页输出的数据个数(原来是90)是变量(因为有些字段要转行的,可能占用2行或3行等),
而且每一组输出30个也是不确定的(如果有字段要转行的话,而且假设肯定有需要转行的),这个30也要设置成变量.
比如:
请注意名称"eeeeeeeeeeee"转行了.这里有的转行,有的又不转行,-------------------------------------------------------------------
省名  城市    名称    区号  |省名  城市  名称  区号|省名  城市  名称  区号
-------------------------------------------------------------------
              eeee
上海  静安区  eeee   021   湖南  长沙   rrr  022  广东 广州   fff  023
            eeee
-------------------------------------------------------------------
如果能把表格的线也能画上去的话就更好了(垂直的线).
如果真的这样用picture控件来实现的话,好象挺耗费内存的.
麻烦您能讲解一下.
谢谢.

--------------------编程问答-------------------- 省名  城市      名称    区号   ¦省名  城市  名称  区号 ¦省名  城市  名称  区号 
------------------------------------------------------------------- 
              eeee 
上海  静安区    eeee   021   湖南  长沙   rrr  022  广东 广州   fff  023 
              eeee 
-------------------------------------------------------------------  --------------------编程问答-------------------- 那12个e是代表要转行的.要换行的.每4个e是一行.
有的需要换行,有的不需要换行.

这样变量又多了起来,而且如果需要画出表格的线(包括横线和垂直线)的话,工作量可能更大了.
--------------------编程问答-------------------- Picture1.Print CBMstr(0) & Space(3) & CBMstr(1) 
在上面这一行之下加上下面这行,那就能笔都画一条线来分隔
Picture1.Print String(126, "-") 

"数据长于一定长度时必须转行" 计算每一栏位的宽度,方法已给你了,要换行加上一行 Picture1.print就换行了.

"每4个e是一行". 像这种问题只有你自己最清楚你的思路,换别人想都想不透你要如何做. --------------------编程问答-------------------- 好的.谢谢. --------------------编程问答-------------------- 支持搂主,收藏
补充:VB ,  数据库(包含打印,安装,报表)
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,