以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  专业报表写入数据  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=128748)

--  作者:nxqtxwz
--  发布时间:2018/12/14 9:37:00
--  专业报表写入数据

老师您好,想做一个入库单打印报表,用EXCEL比较麻烦并且效果不好。想用专业报表做,表打印入库单_TABLE1中有一办理入库是逻辑列,怎么能让下面的代码:

1、办理入库列被选中的就打印,没选中的则不打印。

2、只打印指定的列。

 

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
 
Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
 For c  As  Integer =  0 To tb.Cols.Count -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = tb.Cols(c).Name \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(c).Width = tb.Cols(c).PrintWidth \'列宽等于实际列宽
     If tb.Cols(c).IsNumeric OrElse tb.Cols(c).IsDate Then  \'如果是数值或日期列
        rt.Cols(c).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
     End  If
      For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        rt.Cells(r + 1 - tb.TopPosition , c).Text = tb(r,c)
     Next
 Next
 rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()


--  作者:有点甜
--  发布时间:2018/12/14 10:08:00
--  

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中

Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
Dim Colnames As String() = {"第一列", "第二列"}
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = colnames(c) \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(colnames(c)).Width = tb.Cols(colnames(c)).PrintWidth \'列宽等于实际列宽
    If tb.Cols(colnames(c)).IsNumeric OrElse tb.Cols(colnames(c)).IsDate Then  \'如果是数值或日期列
        rt.Cols(colnames(c)).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
    End  If
    Dim i As Integer = 1
    For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        If tb.rows(r)("办理入库") = True Then
            rt.Cells(i, c).Text = tb(r,colnames(c))
            i += 1
        End If
    Next
Next
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()


--  作者:nxqtxwz
--  发布时间:2018/12/14 10:33:00
--  

For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容

 

从字符串到length的转换无效。怎么改呢?


--  作者:有点甜
--  发布时间:2018/12/14 10:39:00
--  
贴出你最后写的代码。
--  作者:nxqtxwz
--  发布时间:2018/12/14 10:44:00
--  
以下是引用有点甜在2018/12/14 10:39:00的发言:
贴出你最后写的代码。

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中

Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
Dim Colnames As String() = {"物品名称","规格型号","单位","采购数量","采购单价","采购总价","供货单位"}
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = colnames(c) \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(colnames(c)).Width = tb.Cols(colnames(c)).PrintWidth \'列宽等于实际列宽
    If tb.Cols(colnames(c)).IsNumeric OrElse tb.Cols(colnames(c)).IsDate Then  \'如果是数值或日期列
        rt.Cols(colnames(c)).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
    End  If
    Dim i As Integer = 1
    For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        If tb.rows(r)("办理入库") = True Then
            rt.Cells(i, c).Text = tb(r,colnames(c))
            i += 1
        End If
    Next
Next
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()


--  作者:nxqtxwz
--  发布时间:2018/12/14 10:56:00
--  
以下是引用有点甜在2018/12/14 10:39:00的发言:
贴出你最后写的代码。

NET Framework 版本:2.0.50727.8793
Foxtable 版本:2018.10.9.1
错误所在事件:窗口,打印入库单,Button1,Click
详细错误信息:
从字符串“物品名称”到类型“Integer”的转换无效。
输入字符串的格式不正确。


--  作者:有点甜
--  发布时间:2018/12/14 12:47:00
--  

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中

Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
Dim Colnames As String() = {"物品名称","规格型号","单位","采购数量","采购单价","采购总价","供货单位"}
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = colnames(c) \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(c).Width = tb.Cols(colnames(c)).PrintWidth \'列宽等于实际列宽
    If tb.Cols(colnames(c)).IsNumeric OrElse tb.Cols(colnames(c)).IsDate Then  \'如果是数值或日期列
        rt.Cols(c).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
    End  If
    Dim i As Integer = 1
    For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        If tb.rows(r)("办理入库") = True Then
            rt.Cells(i, c).Text = tb.Rows(r)(colnames(c))
            i += 1
        End If
    Next
Next
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()


--  作者:nxqtxwz
--  发布时间:2018/12/27 8:16:00
--  
以下是引用有点甜在2018/12/14 12:47:00的发言:

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中

Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
Dim Colnames As String() = {"物品名称","规格型号","单位","采购数量","采购单价","采购总价","供货单位"}
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = colnames(c) \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(c).Width = tb.Cols(colnames(c)).PrintWidth \'列宽等于实际列宽
    If tb.Cols(colnames(c)).IsNumeric OrElse tb.Cols(colnames(c)).IsDate Then  \'如果是数值或日期列
        rt.Cols(c).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
    End  If
    Dim i As Integer = 1
    For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        If tb.rows(r)("办理入库") = True Then
            rt.Cells(i, c).Text = tb.Rows(r)(colnames(c))
            i += 1
        End If
    Next
Next
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()

不管选中几条记录,都只打印一条记录,怎么改呢?

[此贴子已经被作者于2018/12/27 8:16:43编辑过]

--  作者:nxqtxwz
--  发布时间:2018/12/27 8:25:00
--  

Dim doc  As New PrintDoc  \'定义一个新报表
Dim rt  As New prt.RenderTable \'定义一个新表格
Dim rs As New prt.RenderText() \'定义一个文本对象
Dim rt1 As New prt.RenderTable() \'定义一个表格对象
rt1.Style.Spacing.Top = 1  \'表格和前面对象的垂直间隔为1毫米
rt1.Style.Spacing.Bottom = 1  \'表和和后续对象的垂直间隔为1毫米

rs.Text = "青铜峡市铝业学校入库单"  \'设置文本对象的内容
rs.Style.Font = New Font("宋体", 16 , FontStyle.Bold) \'设置文本对象的字体
rs.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'文本内容水平居中
doc.Body.Children.Add(rs) \'将文本对象加入到表格中
doc.Body.Children.Add(rt1) \'将表格对象加入到报表中
rs = New prt.RenderText() \'再次定义一个文本对象
rs.Text = "上面的表格有三行三列,此行文本和表格的距离是10毫米"
doc.Body.Children.Add(rs) \'将文本对象加入到表格中

Dim tb  As  Table =  Tables("打印入库单_Table1") \'.Cols("办理入库") = \'True\'
Dim Colnames As String() = {"物品名称","规格型号","单位","采购数量","采购单价","采购总价","供货单位"}
rt.Width = "Auto"  \'表格宽度为自动,也就是等于各列设置宽度之和
rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded \'表格宽度超出页宽时,可以水平换页
rt.Style.Font = tb.Font
For c  As  Integer =  0 To Colnames.length -1  \'逐列设置和填入内容
    rt.Cells(0,c).Text = colnames(c) \'列名作为标题
    rt.Cells(0,c).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'标题内容水平居中
    rt.Cols(c).Width = tb.Cols(colnames(c)).PrintWidth \'列宽等于实际列宽
    If tb.Cols(colnames(c)).IsNumeric OrElse tb.Cols(colnames(c)).IsDate Then  \'如果是数值或日期列
        rt.Cols(c).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'数据水平靠右
    End  If
    Dim i As Integer = 1
    For r As Integer = tb.TopPosition To tb.BottomPosition \'开始填入该列内容
        If tb.rows(r)("办理入库") = True Then
            rt.Cells(i, c).Text = tb.Rows(r)(colnames(c))
            i=i+1
        End If
    Next
Next
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) \'灰色网格线
rt.CellStyle.Spacing.All = 0.5  \'单元格内距设为0.5毫米
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'第一行内容水平居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All \'利用行组,将第一行设为表头
doc.Body.Children.Add(rt) \'将表格加入到报表
doc.Preview()

 

总是打印当前行并且"办理入库" = True的一条记录。

1、如果"办理入库" = True但不是当前行不能打印。

2、如果是当前行但"办理入库" <> True的记录也不打印。

 

我的目的是:打印"办理入库" = True的所有记录。

[此贴子已经被作者于2018/12/27 8:29:38编辑过]

--  作者:有点甜
--  发布时间:2018/12/27 9:14:00
--  

是不是你表名写错了?或者是你操作错了表格?

 

Dim tb  As  Table =  Tables("打印入库单_Table1")

 

代码是没问题的。请认真测试。

 

如果确实自己不会排错,实例发上来。