如何用Python或R将Excel中带有替代文本的图表导出到PDF?

16 人关注

我有大约500个用VBA在Excel中生成的图表,我需要将它们导出到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很有帮助,但没有保留备选文本。

5 个评论
如果你在保存时打开宏记录器会发生什么,生成的代码是你所提供的吗?
"如果我手动将图形保存为pdf"--你到底是怎么做的?
你可以把图表作为图片复制/粘贴在工作表上,然后把图片的alt文本设置为与图表相同。 然后删除该图表。 如果你需要保留图表,你可以在你工作簿的副本上这样做。 图表图片上的alt文本将延续到PDF中。
...我想我是在假设嵌入式图表。 你在使用图表表吗?
python
r
excel
vba
pdf
Sam S
Sam S
发布于 2019-08-20
1 个回答
EEM
EEM
发布于 2019-08-24
已采纳
0 人赞同

以下代码为 Sheet 中的每个 Worksheet (不包括任何 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添加到Chart中,一旦它被移动为Sheet。因此,当Chart仍然是工作表中的一个对象(Shape)时,必须在将Chart移动到Sheet之前添加AlternativeText

使用这种方法,在将每个Chart移动到Sheet`之前,将其加入AlternativeText

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
    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