【问题标题】:How to export a graph with alternative text in Excel to PDF using Python or R?如何使用 Python 或 R 将 Excel 中带有替代文本的图形导出为 PDF?
【发布时间】:2019-12-25 04:03:32
【问题描述】:

我使用 VBA 在 Excel 中生成了大约 500 个图表,我需要将它们导出为 pdf。这些图表有可供盲人使用的替代文本。当我使用 VBA (ExportAsFixedFormat) 生成 pdf 时,pdf 中将缺少替代文本。 python 或 R 中是否有代码可以将图形从 excel 转换为 pdf 并保留替代文本?

如果我手动将图形保存为 pdf,替代文本将与图形一起保存在 pdf 文件中。但是,由于我的图表太多,因此能够自动执行此操作会很好。

 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PdfFileName, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

VBA 中的上述代码有助于创建 pdf,但不保留替代文本。

【问题讨论】:

  • 如果您在保存时打开宏记录器会发生什么情况,生成的代码是您提供的吗?
  • “如果我手动将图表保存为 pdf” - 你是怎么做到的?
  • 您可以将图表复制/粘贴为工作表上的图片,然后将图片上的替代文本设置为与图表相同。然后删除图表。如果您需要保留图表,您可以在工作簿的副本上执行此操作。图表图片上的替代文本将延续到 PDF。
  • ...我想我假设是嵌入式图表。你在使用图表吗?

标签: python r excel vba pdf


【解决方案1】:

以下代码为ThisWorkbook中的每个Sheet(不包括任何Worksheet)生成一个pdf文件:

Sub Charts_Export()
Const kPath As String = "D:\@D_Trash\SO Questions\Output\#Name.pdf"    'Update as required
Dim oSht As Object, sPath As String
    With ThisWorkbook
        For Each oSht In .Sheets
            With oSht
                If oSht.Type <> xlWorksheet Then
                    sPath = Replace(kPath, "#Name", .Name)    'Update as required
                    .ExportAsFixedFormat _
                        Type:=xlTypePDF, _
                        Filename:=sPath, _
                        Quality:=xlQualityStandard, _
                        IncludeDocProperties:=True, _
                        IgnorePrintAreas:=False, _
                        OpenAfterPublish:=False
    End If: End With: Next: End With

    End Sub

打开 pdf 文件后,同时按 Shift + Ctrl + Y 以激活 pdf 中的 Read Out Loud 选项.然后同时按 Shift + Ctrl + V 读取AlternativeText

之前的代码使用了 OP 发布的同一篇文章,将图表导出为 pdf 文件,每个文件中都包含 Alternative text

这似乎表明问题可能是由于用于将AlternativeText 添加到Chart 的方法。一旦将AlternativeText 作为Sheet 移动,我找不到将AlternativeText 添加到Chart 的方法,因此必须在将Chart 移动到Sheet 之前添加AlternativeText,当Chart 仍然是工作表中的对象 (Shape)。

使用此方法将AlternativeText 添加到每个Chart,然后再将其移动到Sheet`。

Private Sub Charts_Add_AlternativeText()
Const kAltTxt As String = "This is a test of the Alt Text in graph [#Name]"    'Update as required
Dim ws As Worksheet
Dim co As ChartObject

    Set ws = ThisWorkbook.Worksheets("DATA")    'Update as required
    For Each co In ws.ChartObjects
        co.ShapeRange.AlternativeText = Replace(kAltTxt, "#Name", co.Name)    'Update as required
    Next

    End Sub

或使用此方法将AlternativeText 添加到每个Chart 工作表中。

Private Sub Charts_Add_AlternativeText()
Const kWsName As String = "!Temp"
Const kAltTxt As String = "This is a test of the Alt Text in graph [#Name]"     'Update as required
Dim wb As Workbook, ws As Worksheet
Dim oSht As Object, sp As Shape
Dim sChName As String, bIdx As Byte

    With Application
        .EnableEvents = False
        .DisplayAlerts = False
        .ScreenUpdating = False
        .Application.Calculation = xlCalculationManual
    End With

    Set wb = ThisWorkbook
    With wb

        Rem Add Temp Worksheet
        On Error Resume Next
        .Worksheets(kWsName).Delete
        On Error GoTo 0
        Set ws = .Worksheets.Add(After:=.Sheets(.Sheets.Count))
        ws.Name = kWsName

        Rem Work with Chart Sheets
        For Each oSht In .Sheets
            With oSht
                If oSht.Type <> xlWorksheet Then

                    Rem Move Chart to Temp Worksheet
                    bIdx = .Index
                    sChName = .Name
                    .Location Where:=xlLocationAsObject, Name:=kWsName

                    Set sp = ws.Shapes(1)
                    With sp

                        Rem Add AlternativeText to Shape (Chart)
                        .AlternativeText = Replace(kAltTxt, "#Name", sChName)    'Update as required

                        Rem Move Chart to Chart Sheet
                        .Chart.Location Where:=xlLocationAsNewSheet, Name:=sChName
                        wb.Sheets(sChName).Move Before:=wb.Sheets(bIdx)

    End With: End If: End With: Next: End With

    With Application
        .EnableEvents = True
        .DisplayAlerts = True
        .ScreenUpdating = True
        .Application.Calculation = xlCalculationAutomatic
    End With

End Sub

【讨论】:

  • 很好的答案!我希望OP可以使它工作。谢谢!
猜你喜欢
  • 2021-11-10
  • 2015-08-09
  • 2018-05-26
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多