Foxtable(狐表)用户栏目专家坐堂 → 专业报表写入数据


  共有3181人关注过本帖树形打印复制链接

主题:专业报表写入数据

帅哥哟,离线,有人找我吗?
nxqtxwz
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
专业报表写入数据  发帖心情 Post By: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()


 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By:2018/12/14 10:33:00 [显示全部帖子]

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

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By: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
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By: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”的转换无效。
输入字符串的格式不正确。


 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By: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
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By:2018/12/27 9:16:00 [显示全部帖子]

谢谢老师,我再认真看看。


 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  8楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By:2018/12/27 10:24:00 [显示全部帖子]

以下是引用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编辑过]

请老师再给看看,我的水平有限,代码写不了。我检查了表名也没有错,比如有三条记录的“办理入库”列是True,但它只填写当前行的一条数据。如果把这三条数据都拉选了,则正常。


 回到顶部
帅哥哟,离线,有人找我吗?
nxqtxwz
  9楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1495 积分:12175 威望:0 精华:0 注册:2013/3/19 16:41:00
  发帖心情 Post By:2018/12/27 10:58:00 [显示全部帖子]

老师,我找到问题了,是这一句:

For r As integer = 0 To tb.Rows.Count -1


 回到顶部