以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助] 专业报表  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=196187)

--  作者:zcgmxf
--  发布时间:2025/4/7 11:00:00
--  [求助] 专业报表
老师,下面的代码执行后1、二维码水平不居中显示;2、表50行,只生成了一个页面。不知道是哪里问题,请指点,谢谢!

Dim doc As New PrintDoc
doc.Stacking = prt.StackingRulesEnum.InlineLeftToRight

\' 设置页面边距
doc.PageSetting.LeftMargin = 10
doc.PageSetting.RightMargin = 10
doc.PageSetting.TopMargin = 10
doc.PageSetting.BottomMargin = 10

\' 创建主容器
Dim mainContainer As New prt.RenderArea
mainContainer.SplitHorzBehavior = prt.SplitBehaviorEnum.Never \'禁止水平分割
mainContainer.SplitVertBehavior = prt.SplitBehaviorEnum.Never \'禁止垂直分割
mainContainer.Style.Spacing.Right = 2 \'设置标签之间的所有和上下间隔为2毫米
mainContainer.Style.Spacing.Bottom = 2
mainContainer.Style.Padding.All = 1 \' 标签内容距离边框为1毫米
mainContainer.Width = 210
mainContainer.Height = 279
doc.Body.Children.Add(mainContainer)

\' 获取数据
Dim Table As DataTable = DataTables("小学生健康检查表")
Dim rowCount As Integer = Table.DataRows.Count

\' 定义5个二维码类型和标题
Dim qrTypes() As String = {"形态二维码", "视力二维码", "五官二维码", "血压二维码", "内科二维码"}
Dim qrTitles() As String = {"形态检查", "视力检查", "五官检查", "血压测量", "内科检查"}

For i As Integer = 0 To rowCount - 1
    Dim Row As DataRow = Table.DataRows(i)
    Dim studentName As String = Row("班次").ToString() & "班-" & Row("姓名").ToString()
    
    \' 创建行容器
    Dim rowContainer As New prt.RenderArea
    rowContainer.Stacking = prt.StackingRulesEnum.InlineLeftToRight
    rowContainer.Width = mainContainer.Width
    rowContainer.Style.Spacing.Right = 2
    mainContainer.Children.Add(rowContainer)
    
    \' 左侧姓名区域
    Dim nameArea As New prt.RenderArea
    nameArea.Width = 20
    nameArea.Height = 25
    nameArea.Style.Padding.All = 1
    
    Dim nameText As New prt.RenderText
    nameText.Text = studentName
    nameText.Style.TextAlignHorz = prt.AlignHorzEnum.Center
    nameText.Style.TextAlignVert = prt.AlignVertEnum.Center
    nameArea.Children.Add(nameText)
    rowContainer.Children.Add(nameArea)
    
    \' 右侧二维码区域
    For j As Integer = 0 To qrTypes.Length - 1
        Dim qrData As String = Row(qrTypes(j)).ToString()
        
        Dim label As New prt.RenderArea
        label.Width = 30
        label.Height = 25
        label.Style.Padding.All = 1
        label.Style.Borders.All = New prt.Linedef(0.3, Color.Blue)
        
        Dim rt As New prt.RenderText
        rt.Text = qrTitles(j)
        rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center
        label.Children.Add(rt)
        
        
        
        \'        If Not String.IsNullOrEmpty(qrData) Then
        \'            Try
        Dim qr As New BarCodeBuilder
        qr.Symbology = Barpro.Symbology.QRCode
        qr.Code = qrData
        qr.BarRatio = 0.35
        
        Dim img As New prt.RenderImage
        img.Image = qr.GetImage()
        img.Width = 16
        img.Height = 16
        img.Y = "Prev.Bottom + 2"
        img.Style.ImageAlign.AlignHorz = prt.ImageAlignHorzEnum.Center
        label.Children.Add(img)
        \'            Catch ex As Exception
        \'                Dim errText As New prt.RenderText
        \'                errText.Text = "生成失败"
        \'                errText.Y = "Prev.Bottom + 2"
        \'                label.Children.Add(errText)
        \'            End Try
        \'        Else
        \'            Dim emptyText As New prt.RenderText
        \'            emptyText.Text = "无数据"
        \'            emptyText.Y = "Prev.Bottom + 2"
        \'            label.Children.Add(emptyText)
        \'        End If
        
        rowContainer.Children.Add(label)
    Next
Next

doc.Preview()

--  作者:有点蓝
--  发布时间:2025/4/7 11:40:00
--  
容器不能换页的,改为使用RenderTable吧,我把有关DataTables("小学生健康检查表")表格的代码去掉了,自己改回来即可

Dim doc As New PrintDoc
doc.Stacking = prt.StackingRulesEnum.InlineLeftToRight

\' 设置页面边距
doc.PageSetting.LeftMargin = 10
doc.PageSetting.RightMargin = 10
doc.PageSetting.TopMargin = 10
doc.PageSetting.BottomMargin = 10

Dim rt As New prt.RenderTable
\'rt.Style.GridLines.All = New prt.LineDef
rt.CellStyle.Spacing.All = 1 \'单元格内容和网格线距离1毫米
rt.Cols.Count = 1 \'总列数为3
doc.Body.Children.Add(rt)
\'doc.Stacking = prt.StackingRulesEnum.InlineLeftToRight 
\' 获取数据
\'Dim Table As DataTable = DataTables("小学生健康检查表")
Dim rowCount As Integer = 50 \'Table.DataRows.Count

\' 定义5个二维码类型和标题
Dim qrTypes() As String = {"形态二维码", "视力二维码", "五官二维码", "血压二维码", "内科二维码"}
Dim qrTitles() As String = {"形态检查", "视力检查", "五官检查", "血压测量", "内科检查"}

For i As Integer = 0 To rowCount - 1
\'    Dim Row As DataRow = Table.DataRows(i)
    Dim studentName As String = "班-" & i \'Row("班次").ToString() & "班-" & Row("姓名").ToString()
    
    \' 创建行容器
    Dim rowContainer As prt.RenderArea = rt.Cells(i, 0).Area
    rowContainer.Stacking = prt.StackingRulesEnum.InlineLeftToRight
\'    rowContainer.Width = mainContainer.Width
    rowContainer.Style.Spacing.Right = 2
\'    mainContainer.Children.Add(rowContainer)
\'doc.Body.Children.Add(rowContainer)
    
    \' 左侧姓名区域
    Dim nameArea As New prt.RenderArea
    nameArea.Width = 20
    nameArea.Height = 25
    nameArea.Style.Padding.All = 1
    
    Dim nameText As New prt.RenderText
    nameText.Text = studentName
    nameText.Style.TextAlignHorz = prt.AlignHorzEnum.Center
    nameText.Style.TextAlignVert = prt.AlignVertEnum.Center
    nameArea.Children.Add(nameText)
    rowContainer.Children.Add(nameArea)
    
    \' 右侧二维码区域
    For j As Integer = 0 To qrTypes.Length - 1
        Dim qrData As String = "Row(qrTypes(j)).ToString()"
        
        Dim label As New prt.RenderArea
        label.Width = 30
        label.Height = 25
        label.Style.Padding.All = 1
        label.Style.Borders.All = New prt.Linedef(0.3, Color.Blue)
        
        Dim rx As New prt.RenderText
        rx.Text = qrTitles(j)
        rx.Style.TextAlignHorz = prt.AlignHorzEnum.Center
        label.Children.Add(rx)
        
        
        
        \'        If Not String.IsNullOrEmpty(qrData) Then
        \'            Try
        Dim qr As New BarCodeBuilder
        qr.Symbology = Barpro.Symbology.QRCode
        qr.Code = qrData
        qr.BarRatio = 0.35
        
        Dim img As New prt.RenderImage
        img.Image = qr.GetImage()
        img.Width = 16
        img.Height = 16
        img.X = 6
        img.Y = "Prev.Bottom + 2"
        img.Style.ImageAlign.AlignHorz = prt.ImageAlignHorzEnum.Center
        label.Children.Add(img)

        rowContainer.Children.Add(label)
    Next
Next

doc.Preview()