将页脚的图像分配给 excel 文件而不是外部路径

Posted

技术标签:

【中文标题】将页脚的图像分配给 excel 文件而不是外部路径【英文标题】:Assign image for footer to excel file and not an external path 【发布时间】:2019-10-26 08:09:19 【问题描述】:

我目前正在创建一个带有数据验证的模板,以便有一个包含 5 个不同位置名称的下拉菜单。选择时,将适当的地址图像插入到 excel 页脚中。我计划分发模板,但我需要将图像保存到 excel 文件中,因为当前文件路径不适用于其他用户。

非常感谢任何帮助

ActiveSheet.PageSetup.LeftFooterPicture.Filename = _
        "X:\Adrian\19.0 Templates\19.1 Test\UK Footer address"

【问题讨论】:

【参考方案1】:

我最初误解了这个问题,但留下这个答案以防将来对其他人有用。作为参考,我将问题陈述误解为:

我担心如果我从本地文件路径创建页眉/页脚图像,当我将文件分发给其他人时,这些图像不会呈现。

这不是页眉/页脚数据的工作方式,这里有一个冗长的解释。

我通过从文件路径添加图片,然后从该位置删除图片"c:\debug\Leftfooter.png")进行了测试。换句话说,原始文件路径中不存在文件。这应该与具有不同驱动器映射或权限等的同事基本相同。

重新打开文件后,我仍然可以看到页脚图像,即使它不再存在于我的硬盘上:

如果文件不再存在,图片如何保留在 Excel Footer 中?

现在,图像文件以xl\media\picture1.png 存在在 XLSX 的 .ZIP 存档中。因此,该文件已被合并为 Excel 工作簿的部分,并且作为对外部文件对象的引用。

我观察到在查询 Sheet1.PageSetup.LeftFooterPicture.Filename 时,返回值现在只是“Leftfooter”(原始文件名,没有 path 限定符)。

再深入挖掘底层 xml,关系似乎映射在 xl\drawings\_rels\vmlDrawing1.vml.rels 中,它通过“rID1”关系 ID 连接到 xl\worksheets\sheet1.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId1" 
      Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" 
      Target="../media/image1.png"/>

【讨论】:

您好,当您将模板共享给其他无权访问文件路径名的用户和计算机时,会出现问题。 @Adrian 好的,我想我误解了这个问题。所以你有几个选择,我认为,但我会更新可能是最简单的。 我明白你的意思。我们如何在不同的计算机上重复使用此图像?【参考方案2】:

您有多种选择,而不是使用本地文件路径:

    将映像托管在所有用户都可以访问的共享网络驱动器上。在这种情况下,您需要使用 UNC 路径名,而而不是本地驱动器映射。 在 imgur 等可公开访问的网站上托管图像。这假设用户可以访问互联网,但当然,如果需要,您可以捕获错误。以这种方式添加图像的语法完全相同,您只需将图像 URL 用于 Filename 属性即可。
    Sub f()
    With Sheet1.PageSetup.LeftFooterPicture
        .Filename = "https://i.stack.imgur.com/wc4Ew.jpg"
    End With
    Sheet1.PageSetup.LeftFooter = "&G"
    End Sub
    第三种选择是使用嵌入在工作簿中的图像,但这种方法更复杂。

我建议反对选项 #3,而支持上述更简单的选项之一,但如果您倾向于追求它,那么我认为您需要这样做。

    在工作簿/工作表中找到图片(这应该不会太难,取决于其名称或其他自定义属性/元数据)。 将图片复制到剪贴板(例如,picture.Select: picture.Copy。 将剪贴板内容转储到用户计算机上的某个位置,这并不像听起来那么容易,并且需要使用一些 WinAPI 调用(可能 -- 这里是 an older and quite verbose way of doing this 和 here 至少更容易,如果不是通过探索ChartObject 类来做这件事的一种小技巧)。进一步的复杂性比比皆是,因为您不能总是假设写入访问、特殊文件夹的存在/位置等,并且通常您还希望之后清理/删除图像,以免弄乱用户的磁盘。李>

【讨论】:

我不知道为什么这个答案被否决了......我面临着与提问者类似的困难,这是我能想象的唯一 3 个解决方案......在我的情况下,我'恐怕不得不使用数字 3...如果我能找到更简单的解决方案,这就是我在网上搜索的原因...在我的情况下,我需要在其他工作表标题上复制图片,一旦 Excel 是已经关闭并且我们无法再访问该路径(并且可能是该文件不再存在)【参考方案3】:

正如其他人所说,将图片放入没有文件路径的标题中很棘手。这是我要工作的一个:

Sub ExcelPicToWord()

    'optional - to set the height of the logo in inches
    Const logoHeight As Single = 0.5

    Dim WordApp As Object
    Set WordApp = CreateObject("Word.Application")

    WordApp.Documents.Add
    
    With WordApp.ActiveDocument
    
        'copy from excel - wherever your logo is
        Sheet1.Shapes("footerLogo").Copy
        
        'paste into text body first
        .Range.Paste
        
        'select the pasted picture - i just have the one picture
        .InlineShapes(.InlineShapes.Count).Select
        
        WordApp.Selection.Cut
        
        With .Sections(1).Headers(wdHeaderFooterPrimary)
            
            'needs to be visible for header paste to work. otherwise, crashes
            WordApp.Visible = True
            
            'this finally pastes the pic into the header
            .Range.Paste
            
            WordApp.Visible = False
            
            'optional - sets the height of the logo, keeping proportions
            With .Range.InlineShapes(.Range.InlineShapes.Count)
            
                .width = Application.InchesToPoints(logoHeight) * (.width / .Height)

                .Height = Application.InchesToPoints(logoHeight)
            
            End With
        
        End With
        
        'because Application.CutCopyMode = False doesn't work here
        ClearClipBoard
    
    End With
    
    WordApp.Visible = True

End Sub

Private Sub ClearClipBoard()
    Dim oData   As New DataObject 'object to use the clipboard

    oData.SetText text:=Empty 'Clear
    oData.PutInClipboard 'take in the clipboard to empty it
End Sub

我得到了 ClearClipboard() 代码here。

【讨论】:

以上是关于将页脚的图像分配给 excel 文件而不是外部路径的主要内容,如果未能解决你的问题,请参考以下文章

jquery 移动面板的固定页脚

将页脚推到短页面的底部

将页脚刷新到页面底部,twitter bootstrap

即使使用动态高度网站,如何将页脚保持在底部

如何插入带有页码、文件路径和图像的页脚?

如何将页脚按钮添加到我的回收站视图