excelsheet的所有列都不适合pdf的同一页;使用 Excel VBA 进行转换时
Posted
技术标签:
【中文标题】excelsheet的所有列都不适合pdf的同一页;使用 Excel VBA 进行转换时【英文标题】:All columns of excelsheet are not fitted in same page of pdf; while converting using Excel VBA 【发布时间】:2016-01-12 16:20:42 【问题描述】:我正在尝试使用 Excel VBA 代码将具有大量列 (70+) 的 microsoft excel 文件转换为 pdf。
在活动工作簿中,我正在尝试将“Sheet1”保存为所需路径的 PDF 格式。我有以下代码。
Sub GetSaveAsFilename()
Dim fileName As String
fileName = Application.GetSaveAsFilename(InitialFileName:="", _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Path and FileName to save")
If fileName <> "False" Then
With ActiveWorkbook
.Worksheets("Sheet1").ExportAsFixedFormat Type:=xlTypePDF, fileName:= _
fileName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End With
End If
End Sub
当我运行 VBA 代码并保存 pdf 文件时,我看到了;整个 excelsheet 不适合在同一页面中。它正在下一页显示一些内容。
(只有几列出现在第一页,其余的出现在下一页等等......)。
我检查过How to publish a wide worksheet in PDF format?。
但是,将页面布局设置为横向并手动将 excel 文件转换为 PDF;还会在下一页显示一些列。
网上有很多免费的 Excel 到 PDF 转换器,结果都一样。
VBA 中是否有任何可用的功能,通过它我可以将所有列放在 PDF 的单个页面中?
【问题讨论】:
您检查过工作表的页面设置吗?您可能设置了较大的边距、不合适的页面大小等。您还可以通过选择查看 --> 页面布局 来控制工作表的打印区域 我的页面大小是 A4,页面布局 --> 方向设置为Landscape
感谢您的建议。现在我还要检查其他页面设置,例如比例,检查我是否可以手动将 excel 转换为 PDF 并返回给您
是的,有时它只是反复试验,直到你完全按照你的需要得到它...... :)
你能把它发布在两页上吗(无论如何,10% 不是真的不可读吗?)如果你在左边保留一些列来打印每张纸以识别第二张纸上的数据行?
有一个打印选项可以强制您的数据为 1 页宽和/或 1 页高。当您单击此 [在页面布局下 -> 缩放以适合] 时,它会向您显示它缩小了多少数据以适合 1 页。如果您录制了一个宏,它将为您提供设置该选项的 VBA 代码。
【参考方案1】:
首先选择您要打印的范围并将其设置为PrintArea。然后运行这段代码,这对我来说是一个 79 列的工作表
Sub saveAsPDF()
Dim MyPath
Dim MyFolder
With Sheet1.PageSetup
'.CenterHorizontally = True
.CenterVertically = True
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.BottomMargin = 0
.TopMargin = 0
.RightMargin = 0
.LeftMargin = 0
End With
MyPath = ThisWorkbook.Path
MyFolder = Application.GetSaveAsFilename(MyPath, "PDF Files (*.pdf),*.pdf")
If MyFolder = False Then Exit Sub
Sheet1.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=MyFolder, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
End Sub
【讨论】:
谢谢你的朋友的回答。 +1,我能够导出比 79 少一点的列,因为我现在的像素大小更大了。【参考方案2】:问题是你需要选择UsedRange
,然后使用Selection.ExportAsFixedFormat
Sub GetSaveAsFilename()
Dim fileName As String
fileName = Application.GetSaveAsFilename(InitialFileName:="", _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Path and FileName to save")
If fileName <> "False" Then
'Selecting the Used Range in the Sheet
ActiveWorkbook.Worksheets("Sheet1").UsedRange.Select
'Saving the Selection - Here is where the problem was
Selection.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
End If
End Sub
编辑:
问题是PageSetup
becasue 每个页面大小都有一个最大像素限制,正如您在评论中所指向的那样。
页面大小设置为超大 A0,这应该足以满足您的 100x1500 UsedRange
的需求。在这里,您可以使用 FitToPages... = 1
更改页面大小,以检查您的 Range
是否在打印行内。
FitToPagesWide
和 FitToPagesTall
是将所有内容都放在一个页面上。
Sub GetSaveAsFilename()
Dim fileName As String
fileName = Application.GetSaveAsFilename(InitialFileName:="", _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Path and FileName to save")
If fileName <> "False" Then
'Suspending Communicaiton with Printer to Edit PageSetup via Scripting
Application.PrintCommunication = False
'Setting Page Setup
With ActiveSheet.PageSetup
.FitToPagesWide = 1
.FitToPagesTall = 1
' Setting Page Size to 92x92 inch Should cater for your data
.PaperSize = 159
End With
'Enabling Communicaiton with Printer
Application.PrintCommunication = True
'Selecting the Used Range in the Sheet
ActiveWorkbook.Worksheets("Sheet1").UsedRange.Select
'Saving the Selection - Here is where the problem was
Selection.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=True, OpenAfterPublish:=True
End If
End Sub
请注意,页面将显示为空白,您需要放大很多才能查看数据
【讨论】:
哥们,谢谢你的回答。不过,这给了我同样的结果。抱歉,昨天有人对答案投了反对票。 @Avidan 现在看看脚本,每次都和我一起工作 感谢您的编辑 :) 我仍然得到相同的结果。I guess, What am trying is may not be doable
As, 1) 所有列的宽度加起来是 2750 像素。 2) 总数列数 - 100。Is it so?
***.com/questions/33127693/…
感谢您的新编辑。我能够导出比以前更多的列。 (与此问题的其他答案相同,几乎有 85 列。仍然有 15 列无法放入页面)。为它+1。此外,我的一些专栏不可读。希望使用纸张大小作为“E”可以解决这个问题。 ***.com/questions/33127693/…
页面尺寸 92x92 是 233cm x 233cm,比尺寸 E 大。什么打印机设置为默认打印机?如果它是一台真正的打印机,打印机本身可能会阻止你。在我的测试中,该脚本的总列宽超过 2700pxl【参考方案3】:
问题出在页面设置设置上,我对您的代码做了一些小改动,并添加了一个执行页面设置设置的程序,启动该程序时您可以选择纸张尺寸,但请注意允许的最小缩放是 10% (请参阅 PageSetup Members (Excel))。因此,即使在 10% 的情况下,打印区域也不适合一页,我建议选择更大的纸张尺寸(即 A3)来生成一页 PDF,然后在打印 Pdf 时选择适合页面。该过程还为您提供了使用边距的更改,在生成 PDF 时,我将所有边距设置为 0,但您可以根据自己的目标进行更改。
Sub Wsh_LargePrintArea_To_Pdf()
Dim WshTrg As Worksheet
Dim sFileName As String
sFileName = Application.GetSaveAsFilename( _
InitialFileName:="", _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Path and FileName to save")
If sFileName <> "False" Then
Rem Set Worksheet Target
Set WshTrg = ActiveWorkbook.Worksheets("Sheet1")
Rem Procedure Update Worksheet Target Page Setup
'To Adjust the Page Setup Zoom select the Paper Size as per your requirements
'Call Wsh_Print_Setting_OnePage(WshTrg, xlPaperLetter)
'Call Wsh_Print_Setting_OnePage(WshTrg, xlPaperA4)
'To Adjust the Page Setup Zoom select the Paper Size as per your requirements
'If the Print Still don't fit in one page then use a the largest Paper Size (xlPaperA3)
'When printing the Pdf you can still selet to fix to the physical paper size of the printer.
'Call Wsh_Print_Setting_OnePage(WshTrg, xlPaperA3)
'This is the largest paper i can see in my laptop is 86.36 cm x 111.76 cm
Call Wsh_Print_Setting_OnePage(WshTrg, xlPaperEsheet)
Rem Export Wsh to Pdf
WshTrg.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=sFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
End If
End Sub
Sub Wsh_Print_Setting_OnePage(WshTrg As Worksheet, ePaperSize As XlPaperSize)
On Error Resume Next
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0)
.RightMargin = Application.InchesToPoints(0)
.TopMargin = Application.InchesToPoints(0)
.BottomMargin = Application.InchesToPoints(0)
.HeaderMargin = Application.InchesToPoints(0)
.FooterMargin = Application.InchesToPoints(0)
'.Orientation = xlLandscape
.Orientation = xlPortrait
.PaperSize = ePaperSize
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Application.PrintCommunication = True
End Sub
【讨论】:
感谢您的回答和解释。虽然仍然只能导出 50-60 列(选择 A3 页面大小后),但它帮助我学习了如何录制宏来调整页面设置。为它+1。导出的列很少是不可读的;是否可以加宽页面宽度?这样,我就可以正确阅读这些内容了吗? (考虑到 - 我不会在纸上打印生成的 PDF,我只需要将其作为软拷贝查看) 如果在 A3 纸上以最小缩放(即 10%)打印仍然无法将所有内容都放在一页中,那么您的意图是不可行的。您最初的问题是关于将工作表打印在一页中,以及这个答案是关于什么的。现在您对可读性表示担忧,那么您需要使用.FitToPagesWide
和.FitToPagesTall
并决定什么是允许可读性的最佳压缩。
@Avidan 道歉没有意识到最初的问题实际上不是你的。正如我之前所说,最小缩放可能是 10%,请尝试调整页面设置并告诉我们。问题,1)您的打印区域有多宽,不仅是列数,还有所有列的宽度; 2)打印区域有多少行,3)使用什么字体大小。需要这个来尝试复制您的案例。但是,如果您可以共享您的文件会更好...
感谢@EEM 的指导。我将检查属性.FitToPagesWide
和.FitToPagesTall
- 我是否能够将我们的数据放入更宽的页面中。在这一点上,即使我相信你的句子:what I intent is not doable.
,但仍然很好奇,是否可以通过扩大页面的大小(宽度)来实现。 (我不必物理打印它;仅以软拷贝形式 - PDF)
我浏览了这篇文章:***.com/questions/5116828/… 和 1) Width of all columns together is 2750 pixels.
(总列数 - 100)。 2)There are around 1500 rows
。 3) Arial 和 Calibri,字体大小 11;很抱歉,我将无法共享该文件,因为它包含一些敏感数据。 ......你不必道歉。 :) 我发现这个问题与我的要求相似,因此考虑提供赏金而不是提出新问题。问候,【参考方案4】:
将此添加到您的代码中,它将强制所有内容打印在一张宽的纸上,但仍然让它打印在多张高的纸上
With Worksheets("Sheet1").PageSetup
.FitToPagesWide = 1
.FitToPagesTall = False
End With
还将您的边距设置为“窄”
【讨论】:
感谢@neuralgroove 的回答。 :) 通过添加上面的代码尝试了反复试验。尝试使用 two with blocks 创建并在前面的 block 中添加上述代码(将两个块组合成单个 with block)。还将边距设置为“窄”。我得到与以前相同的结果。你能告诉我,我怎样才能将它与早期的代码结合起来?以上是关于excelsheet的所有列都不适合pdf的同一页;使用 Excel VBA 进行转换时的主要内容,如果未能解决你的问题,请参考以下文章
R语言将多张可视化结果图像保存到PDF中实战:多图保存到同一PDF页将多个绘图保存到PDF格式的不同页面
pdf阅读器仅阅读前2页,但不是obj c中PDF文件的所有页面
将csv上传到sql server时,“给定的ColumnMapping与源或目标中的任何列都不匹配”
将csv上传到sql server时,“给定的ColumnMapping与源或目标中的任何列都不匹配”
R语言使用pdftools包的pdf_text函数抽取pdf中所有页的文本使用cat函数查看抽取获得的特定页的文本(Extract the text for all pages)