Foxtable(狐表)用户栏目专家坐堂 → [求助]报表导出PDF的问题


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

主题:[求助]报表导出PDF的问题

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


加好友 发短信
等级:三尾狐 帖子:712 积分:5547 威望:0 精华:0 注册:2019/11/14 9:36:00
[求助]报表导出PDF的问题  发帖心情 Post By:2020/10/20 11:28:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:11111.png
图片点击可在新窗口打开查看


报表设了两栏,导出PDF时,如果一张一张导出,是没有问题,栏宽一样,如果一次导出很多张,就会出现栏宽不一样,有时还会挤在一起的现象,如何处理这个问题?

以下是代码:
With Tables(e.Form.name & "_table1")
    Dim i As Integer
    Dim ii As Integer
    Dim i1 As Integer = .TopRow                                    '最上行位置
    Dim i2 As Integer = .BottomRow                                 '最末行位置
    Dim s As Integer
    s = i2 - i1 +1   '选择的行数
    '定义报表
    Dim doc As New PrintDoc '定义一个报表
    doc.PageSetting.PaperKind = 9 '纸张类型改为A4
    doc.PageSetting.Landscape = True '横向打印
    Doc.PageSetting.LeftMargin = 25 '设置左边距
    Doc.PageSetting.RightMargin = 20 '设置右边距
    Doc.PageSetting.TopMargin = 20 '设置上边距
    Doc.PageSetting.BottomMargin = 20 '设置下边距
    Dim ra As prt.RenderEmpty '定一个空对象
    Dim rt As New prt.RenderTable() '定义一个表格对象
    Dim rm As New prt.RenderImage() '定义一个图片对象
    Dim rx As New prt.RenderText '创建一个文本
    Dim Names As New List(Of Integer)
    For i = i1 To i2  '将选择的最上一行位置数减掉就等于0
        '强制换页,必须放在这里,如果放在判断集合之前,会出现排两个后有空白页
        ra = new prt.RenderEmpty '定义一个新的空对象
        ra.BreakBefore = prt.BreakEnum.Page '打印前换页
        doc.Body.Children.Add(ra) '加入到报表中
        '分栏
        Doc.Columns.Add() '增加第一栏
        Doc.Columns.Add() '增加第二栏
        Dim f1 As Integer
        f1 = 242 * .Rows(i)("报表照片宽")/(.Rows(i)("报表照片宽") + .Rows(i+1)("报表照片宽"))    '第一列宽
        Doc.Columns(0).Width = f1  '第一栏栏宽
        Doc.Columns(0).Spacing = 7 '第一栏右侧间距
        Doc.Columns(1).Width = 242-f1  '第二栏栏宽
        'MessageBox.Show(Doc.Columns(0).Width)
        'MessageBox.Show(Doc.Columns(1).Width)
        '表格
        rt = New prt.RenderTable() '定义一个表格对象
        'rt.Style.GridLines.All = New prt.Linedef(Color.Transparent) '将表格的颜色设为无色
        'rt.Style.GridLines.All = New prt.Linedef(Color.red) '将表格的颜色设为深灰色,Gainsboro
        rt.Style.GridLines.All = New prt.Linedef(Color.Gainsboro) '将表格的颜色设为深灰色,Gainsboro
        rt.Width = f1
        rt.height = 170
        'If f1 < 138 Then
        'rt.rows(0).Height = 138
        'Else
        If CInt(f1*100/.Rows(i)("报表照片宽")) +1 > 138 Then
            rt.rows(0).Height = 138
        Else
            rt.rows(0).Height = CInt(f1*100/.Rows(i)("报表照片宽")) +1    '第一行高度
        End If
        
        
        MessageBox.Show(rt.rows(0).Height)
        'rt.rows(0).Height = Math.Round(250*100/.Rows(i)("报表照片宽"),0)    '第一行高度,四舍五入错误
        
        rt.Rows(0).Style.Borders.All = New prt.LineDef("0.25mm", Color.Gainsboro)
        rt.rows(1).Height = "auto"    '第二行高度
        doc.Body.Children.Add(rt)    '将表格对象加入到报表中
        '图片
        rm = New prt.RenderImage() '定义一个图片对象
        Dim txt As String
        txt = .Rows(i)("路径")
        rm.Image = GetImage(txt) '请改为实际的图标名称和路径
        rm.Style.ImageAlign.AlignHorz = prt.ImageAlignHorzEnum.Center '图片水平居中
        rm.Style.ImageAlign.AlignVert = prt.ImageAlignVertEnum.Top '图片垂直居中
        rm.Style.ImageAlign.StretchHorz = True '禁止水平方向扩展图片
        rm.Style.ImageAlign.StretchVert = True '禁止垂直方向扩展图片
        rt.Cells(0,0).RenderObject = rm '将单元格内容设置为图片对象rm
        '题名+档案号
        rx = New prt.RenderText '创建一个文本
        rx.Text = vbcrlf & .Rows(i)("题名") & vbcrlf & vbcrlf & .Rows(i)("档案号") '设置文本对象的内容
        rx.Style.Font = New Font("宋体", 15, FontStyle.Bold) '设置字体如果不设置字体,会出现导出PDF乱码
        rx.Style.LineSpacing = 120 '1.3倍行距
        rx.Style.TextAlignHorz = prt.AlignHorzEnum.Left '水平居中
        rx.Style.TextAlignVert = prt.AlignVertEnum.Top '垂直居下
        rt.BreakAfter = prt.BreakEnum.Column '*****打印之后另起一栏
        rt.Cells(1,0).RenderObject = rx
        '表格
        rt = New prt.RenderTable() '定义一个表格对象
        'rt.Style.GridLines.All = New prt.Linedef(Color.Transparent) '将表格的颜色设为无色
        'rt.Style.GridLines.All = New prt.Linedef(Color.red) '将表格的颜色设为深灰色
        rt.Style.GridLines.All = New prt.Linedef(Color.Gainsboro) '将表格的颜色设为深灰色,Gainsboro
        rt.Width = 242-f1
        rt.height = 170
        'If 242-f1 < 138 Then
        'rt.rows(0).Height = 138
        'Else
        'rt.rows(0).Height = CInt((242-f1)*100/.Rows(i+1)("报表照片宽")) +1    '第一行高度
        'End If
        
        If CInt((242-f1)*100/.Rows(i+1)("报表照片宽")) +1 > 138 Then
            rt.rows(0).Height = 138
        Else
            rt.rows(0).Height = CInt((242-f1)*100/.Rows(i+1)("报表照片宽")) +1    '第一行高度
        End If
        rt.rows(1).Height = "auto"    '第二行高度
        rt.Rows(0).Style.Borders.All = New prt.LineDef("0.25mm", Color.Gainsboro)
        doc.Body.Children.Add(rt)    '将表格对象加入到报表中
        '图片2
        rm = New prt.RenderImage() '定义一个图片对象
        Dim txt2 As String
        txt2 = .Rows(i+1)("路径")
        rm.Image = GetImage(txt2) '请改为实际的图标名称和路径
        rm.Style.ImageAlign.AlignHorz = prt.ImageAlignHorzEnum.Center '图片水平居中
        rm.Style.ImageAlign.AlignVert = prt.ImageAlignVertEnum.Top '图片垂直居中
        rm.Style.ImageAlign.StretchHorz = True '禁止水平方向扩展图片
        rm.Style.ImageAlign.StretchVert = True '禁止垂直方向扩展图片
        rt.Cells(0,0).RenderObject = rm '将单元格内容设置为图片对象rm
        '题名+档案号2
        rx = New prt.RenderText '创建一个文本
        rx.Text = vbcrlf & .Rows(i+1)("题名") & vbcrlf & vbcrlf & .Rows(i+1)("档案号") '设置文本对象的内容
        rx.Style.Font = New Font("宋体", 15, FontStyle.Bold) '设置字体如果不设置字体,会出现导出PDF乱码
        rx.Style.LineSpacing = 120 '1.3倍行距
        rx.Style.TextAlignHorz = prt.AlignHorzEnum.Left '水平居中
        rx.Style.TextAlignVert = prt.AlignVertEnum.Top  '垂直居下
        rt.Cells(1,0).RenderObject = rx
    Next
    'Doc.Preview() '预览报表
    Dim dlg As New FolderBrowserDialog  '保存目录
    'dlg.Filter = "PDF文件|*.pdf"
    If dlg.ShowDialog = DialogResult.Ok Then
        Dim fl As String = dlg.SelectedPath & "\照片目录.pdf"
        doc.SavePDF(fl) '保存为PDF文件
        Dim Proc As New Process '打开PDF文件
        Proc.File = fl
        Proc.Start()
    End If
End With

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105942 积分:538779 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/10/20 11:31:00 [只看该作者]

建议使用表格,2列。不要做分栏

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


加好友 发短信
等级:三尾狐 帖子:712 积分:5547 威望:0 精华:0 注册:2019/11/14 9:36:00
  发帖心情 Post By:2020/10/20 11:52:00 [只看该作者]

 我使用了表格,三列,中间不用当栏宽,会出现另一个问题:因为宽度和高度是用公式计算出来的,转换成整数,会有很微小的差异,导制照片导出来后会有相对的白边;所以用了两栏,打印时不出现边框,底下的两段文字都是紧帖上面照片,所以采用了两栏

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105942 积分:538779 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/10/20 11:58:00 [只看该作者]

我测试没有什么白边。实例发上来看看

 回到顶部