如何将嵌入图像的相对路径分配给ActiveSheet.PageSetup.LeftHeaderPicture.FileName?

这有2个SSCCE:

1。

我通过右键单击解决方案 – >添加 – >现有项目 – > myPic.jpg将图片添加到我的VSTO文档级加载项。

现在我正在使用Excel电子表格,并希望在左上角标题中添加图片。 使用PageSetup.LeftHeaderPicture.FileName并提供图片的绝对路径,它在调试时加载得很好。

当我试图将路径改为非绝对并且说出类似的东西时

ActiveSheet.PageSetup.LeftHeaderPicture.FileName = "\\Assets\\myPic.jpg" 

我一直得到一个HRESULT: 0x800A03ECexception。

在此处输入图像描述

我想我没有获得访问Assets\myPic.jpg的正确语法。

2。

我添加了一个新资源,选择了一个现有项目并选择了myPic.jpg。 我可以通过Resource1.myPic访问它,但ActiveSheet.PageSetup.LeftHeaderPicture是只读的

PageSetup.LeftHeaderPicture.FileName需要一个string类型参数,我不知道如何检索我已经嵌入的资源的路径…

问:

如何在我的解决方案中将图片作为资源(或仅仅是现有项目)嵌入,以便能够将其与PageSetup.LeftHeaderPicture.FileName一起使用?

是的,我已经解决了。

在解决方案中添加了现有项myPic.jpg ,并将Build Action设置为ContentCopy to Output Directory以便Copy Always但我相信您可以将其设置为在较新时复制

在此处输入图像描述

注意: 使用此设置,您的文件将始终“复制”到已发布的目录。

在此处输入图像描述

现在您需要的代码就是

 ws.PageSetup.LeftHeaderPicture.Filename = AppDomain.CurrentDomain.BaseDirectory + "\\myPic.jpg"; ws.PageSetup.LeftHeader = "&G"; 

AppDomain.CurrentDomain.BaseDirectory 在这里得到了很好的解释

和预期的最终结果

在此处输入图像描述

根据我的经验,将文件添加到项目中会将它们嵌入到.exe 。 这意味着您无法使用文件路径引用它们。 但是你可以阅读它们。

如果您希望将文件放在.exe文件之外,则只需将其添加到项目中,然后右键单击它并选择属性。 将“ Copy to output directory属性设置为“ Always copy 。 您的文件将被复制到相同文件夹结构下的构建文件夹中。 现在,您可以使用相对路径引用文件。

如果你真的需要从资源文件中获取该图片,可以将其保存为临时文件(使用Path.GetTempFileName ),然后通过文件路径加载它。