将页脚的图像分配给 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 文件而不是外部路径的主要内容,如果未能解决你的问题,请参考以下文章