以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]报表导出PDF的问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=157544) |
-- 作者:2425004926 -- 发布时间:2020/10/20 11:28:00 -- [求助]报表导出PDF的问题 报表设了两栏,导出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 |
-- 作者:有点蓝 -- 发布时间:2020/10/20 11:31:00 -- 建议使用表格,2列。不要做分栏 |
-- 作者:2425004926 -- 发布时间:2020/10/20 11:52:00 -- 我使用了表格,三列,中间不用当栏宽,会出现另一个问题:因为宽度和高度是用公式计算出来的,转换成整数,会有很微小的差异,导制照片导出来后会有相对的白边;所以用了两栏,打印时不出现边框,底下的两段文字都是紧帖上面照片,所以采用了两栏 |
-- 作者:有点蓝 -- 发布时间:2020/10/20 11:58:00 -- 我测试没有什么白边。实例发上来看看 |