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

编辑:

问题是PageSetupbecasue 每个页面大小都有一个最大像素限制,正如您在评论中所指向的那样。

页面大小设置为超大 A0,这应该足以满足您的 100x1500 UsedRange 的需求。在这里,您可以使用 FitToPages... = 1 更改页面大小,以检查您的 Range 是否在打印行内。

FitToPagesWideFitToPagesTall 是将所有内容都放在一个页面上。

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)