C# 直接绘制到Excel单元格画布

C# 直接绘制到Excel单元格画布,c#,excel,vsto,C#,Excel,Vsto,是否有一种方法可以使用VSTO直接将图像绘制到包含Excel单元格的画布上,而无需插入形状 我已经看过了,我知道有可能我就是找不到信息来源 Range cell = sheet.Cells[1, 1]; var border = cell.Borders[XlBordersIndex.xlDiagonalDown]; border.Weight = XlBorderWeight.xlThin; border.LineStyle = XlLineStyle.xlC

是否有一种方法可以使用VSTO直接将图像绘制到包含Excel单元格的画布上,而无需插入形状

我已经看过了,我知道有可能我就是找不到信息来源

    Range cell = sheet.Cells[1, 1];

    var border = cell.Borders[XlBordersIndex.xlDiagonalDown];
    border.Weight = XlBorderWeight.xlThin;
    border.LineStyle = XlLineStyle.xlContinuous;

此代码段似乎在单元格的画布中生成了一个图形。我需要访问它所绘制的图层。

这是一个非常基本的VBA脚本,它绘制一个矩形并用所需的图像填充它。它的位置和大小不是绑定到单元格,而是相对于工作表。您需要进行修改以满足您的确切需求,但似乎您的绊脚石正在超越基于细胞的定位方案

Sub PlaceImage()

Dim ws As Excel.Worksheet
Dim sh As Excel.Shape

   Set ws = ThisWorkbook.Worksheets(1) 'use an index number or string as needed
   Set sh = ws.Shapes.AddShape(msoShapeRectangle, 100, 60, 400, 300) 'x-pos, y-pos, width, height

   sh.Fill.Visible = msoTrue
   sh.Fill.UserPicture "C:\Users\Public\Pictures\Sample Pictures\Desert.jpg" 'filename of image
   sh.Line.Visible = msoFalse 'removes the outline

   Range("A1").Select

End Sub

不幸的是,没有办法直接在画布上绘制,至少通过公共API是这样,而且当您想要重用来自绘图窗口窗体控件的代码时,您肯定不能使用GDI+绘图引擎来绘制

我正在研究直接使用Windows绘图的可能性,但这似乎不太可能,因为Excel并没有为每个单元格保留句柄,因此很难知道要绘制哪个单元格。而且,这幅画不会持久,这在我看来是一个主要的缺点


你发现了自己,我认为这是一个可行的选择。如果可以将图形渲染为图像,则可以通过公式内联插入该图形(请注意,图片仍然是形状,这是您不喜欢的,但我想我们可以破例)

如果OLE对象用于渲染或是渲染所必需的,我建议不要使用这些对象。在我看来,它们太“老派”了,除了Windows桌面上的Office之外,其他任何东西都无法使用。

视频中的示例(在我给出原始答案时您还没有发布)不是“绘制到画布”,而是程序生成OLE对象,并将它们嵌入电子表格的单元格中。当第二个应用程序用于实际绘制分子时,可以看到这一点。如果对它是否使用OLE有任何疑问,那么这个名称应该让它们停止使用——它被称为。有一些文档,包括如何与其他供应商的OLE对象交互。由于OLE是一种COM技术,而且,这是可行的

如果您100%致力于学习如何“直接在画布上绘制图像”,请忽略此答案的其余部分。由于您希望使用C#(一种.NET语言)与Excel的COM接口交互,因此您需要熟悉。可以找到他们的参考资料。如果您只针对最新的Excel/Office版本,您可能希望查看,讨论“改进的”互操作界面。举一个可能有助于您入门的示例


搜索“”或类似的内容,您会发现许多示例,因此问题、文档等都会出现。

您可以设置一张工作表背景图片:@AxelRichter这看起来不错,但不是只适用于整个工作表吗?我想访问同一层,但需要绘制到特定的单元格。@Patrickhoffman我已经实现了该层,它可以工作,但对象不是单元格的一部分。我正在寻找允许我直接在单元格画布上绘制的内容。您所指出的是一个解决方案,其中包含我已经拥有但不需要的形状。但感谢您的努力。我可以问一下,您到底在尝试实现什么特别需要画布吗?OP询问“无需插入形状”。您建议:使用形状。另外,VBA不是C#。@ExactaBox我正在使用图形视觉在自定义.NET控件上进行自定义绘图。我加载控件并绘制需要绘制的内容,然后我想将该内容插入单元格画布中。Excel单元格中不可能使用默认API绘制内容。Excel单元格可以包含值或公式,而不能包含其他内容。单元内部可以包含背景色或预定义图案,但不能包含图片。你的代码被剪掉了也不画东西。它只将预定义的单元格边框线切换为“开”。@Chris:看起来他在嵌入OLE对象。请不要去那里。在我看来,它们太“老派”了,除了Windows桌面上的Office之外,其他任何东西都无法使用。@Chris:更新了该行下面的部分。我不认为本例中的结构不是形状。它们不可交互,似乎“嵌入”在单元格中。我已经看了一些使用这种方法的项目。他们似乎使用了某种与Excel的低级交互。这就是我想要的。不幸的是,我看不到它是什么,因为它是模糊的。他们可能在使用OLE吗?你有这个项目的位置吗?我不允许向你提供一个项目来掩饰,但是如果你好奇的话,我相信你会想到一些东西:D。我不知道它们是否是旧物体,我对它不太熟悉。好吧,这对我来说已经足够好了。您将获得赏金,问题的答案将交给Patrick,因为他还提出了OLE对象作为解决方案。谢谢:)