【问题标题】:Excel export chart to wmf or emf?Excel 导出图表到 wmf 还是 emf?
【发布时间】:2010-02-15 14:47:40
【问题描述】:

我正在尝试将图表从 Excel 导出为 wmf 或 emf 格式。

如果您导出为 GIF 但不使用 WMF 作为过滤器名称,则该代码有效。

这行得通:

Chart.Export FileName:="current_sales.gif", FilterName:="GIF"

但是

Chart.Export FileName:="current_sales.wmf", FilterName:="WMF"

未能给出错误:

运行时错误“1004”: 应用程序定义或对象定义 错误

Powerpoint 允许您导出到 WMF。我通过将图表复制到 Powerpoint 并让 Powerpoint 将图像导出到 WMF 来“成功”导出,但必须有一种更简单的方法 - 我希望如此。

我想知道是否有办法为 Excel 注册 WMF 过滤器,但我不确定如何执行此操作。请帮忙!谢谢。

【问题讨论】:

  • @Alex Andronov - 是否需要使用导出命令?以不同方式保存图表的另一种方法可以吗?

标签: excel vba


【解决方案1】:

这个复制、保存方法对我有用,我把它分成 3 个部分(声明、保存为 EMF 函数和选择/复制/函数调用部分):

*我发现this article 详细说明了如何保存到 EMF,然后稍作修改以使用 ActiveChart 而不是任意选择。

首先声明几个:

Option Explicit

Private Declare Function OpenClipboard _
    Lib "user32" ( _
        ByVal hwnd As Long) _
As Long

Private Declare Function CloseClipboard Lib "user32" () As Long

Private Declare Function GetClipboardData _
    Lib "user32" ( _
        ByVal wFormat As Long) _
As Long

Private Declare Function EmptyClipboard Lib "user32" () As Long

'// CreateMetaFileA DeleteEnhMetaFile
Private Declare Function CopyEnhMetaFileA _
    Lib "gdi32" ( _
        ByVal hENHSrc As Long, _
        ByVal lpszFile As String) _
As Long

Private Declare Function DeleteEnhMetaFile _
    Lib "gdi32" ( _
        ByVal hemf As Long) _
As Long

这是实际的save as emf函数(CopyEnhMetaFileA和DeleteEnhMetaFile的使用在文章中有说明):

Public Function fnSaveAsEMF(strFileName As String) As Boolean
Const CF_ENHMETAFILE As Long = 14

Dim ReturnValue As Long

    OpenClipboard 0

    ReturnValue = CopyEnhMetaFileA(GetClipboardData(CF_ENHMETAFILE), strFileName)

    EmptyClipboard

    CloseClipboard

    '// Release resources to it eg You can now delete it if required
    '// or write over it. This is a MUST
    DeleteEnhMetaFile ReturnValue

    fnSaveAsEMF = (ReturnValue <> 0)

End Function

然后是选择、复制和函数调用部分:

Sub SaveIt()
Charts.Add
    ActiveChart.ChartArea.Select
    Selection.Copy
    If fnSaveAsEMF("C:\Excel001.emf") Then
        MsgBox "Saved", vbInformation
    Else
        MsgBox "NOT Saved!", vbCritical
    End If

End Sub

【讨论】:

  • 我发现您的答案看起来很有希望,但我无法重现 *.emf 格式的图表导出。我收到一条未保存的消息,没有任何进一步的想法,为什么它拒绝工作。我所做的只是在...声明函数之间添加“PtrSafe”。我忘记了什么?
【解决方案2】:

通过this forum entry,您可以找到奇妙的Stephen Bullen's Excel Page 并下载PastePicture utility,它展示了如何导出为WMF 格式。

它基本上是复制图表,将其作为图片粘贴到剪贴板中,然后通过几行代码将其内容保存到 WMF 文件中。

【讨论】:

    【解决方案3】:

    Andy 已经详细回答了这个问题Here

    【讨论】:

    • 这个建议的问题是安装完整版Office并没有添加WMF过滤器。
    • 没有时间测试安迪的解决方案 - 我不得不离开(因此评论延迟)我会为你寻找 WMF 过滤器。
    【解决方案4】:

    有趣的是,这张海报在forum 上遇到了完全相同的问题,在ExcelForum 看到了与此相关的这篇有趣的文章。

    希望对你有帮助, 此致, 汤姆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2014-11-25
      • 1970-01-01
      • 2010-12-18
      • 2012-12-15
      • 1970-01-01
      • 2010-10-19
      • 2010-10-07
      相关资源
      最近更新 更多