直接绘制到Excel单元格画布

时间:2015-01-13 12:18:20

标签: c# excel vsto

有没有办法使用VSTO将图像直接绘制到包含Excel单元格的画布而无需插入形状?

我已经看到它完成了,我知道有可能我似乎无法找到信息来源。

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

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

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

3 个答案:

答案 0 :(得分:2)

视频中的示例(您在我的原始答案时尚未发布)并非“绘制到画布”,而是程序生成 OLE对象并将其嵌入电子表格中细胞。当二次应用用于实际绘制分子时,可以看到这一点。如果有任何疑问它是否使用OLE,名称应该让它们休息 - 它被称为MarvinOLE。有一些文档,包括如何与其他供应商的OLE对象进行交互,here。由于OLE是COM技术,Excel's interfaces are all COM-based,这是有效的。

如果您100%致力于学习如何“直接在画布上绘制图像”,请忽略其余的答案。因为您想使用C#(.NET语言)要与Excel的COM接口进行交互,您需要熟悉Primary Interop Assemblies。可以找到他们的参考here。如果您只定位最新的Excel / Office版本,您可能需要查看this SO answer,讨论“改进的”Interop界面。 Here's a blogger有一个可以帮助您入门的示例。

搜索“excel interop oleobjects”或类似内容,你会发现很多例子,SO问题,文档等。

答案 1 :(得分:1)

不幸的是,没有办法直接在画布上绘图,至少通过公共API,你绝对不能使用GDI +绘图引擎来绘制你想要重用来自绘制Windows窗体控件的代码时提出的建议

我正在研究直接使用Windows绘图的可能性,但这似乎也不可能,因为Excel不会为每个单元格保留句柄,因此很难知道要绘制哪个单元格。此外,这张图不会持久,这是我认为的一个主要缺点。


你自己找到了this movie,我觉得那里有一个可行的选择。如果您可以将图形渲染为图像,则可以通过公式将该图形插入内嵌(请注意,图片仍然是您不喜欢的形状,但我想我们可以为这些图像设置例外)。

如果使用或需要OLE对象进行渲染,我建议不要使用它们。在我看来,它们太“老派”了,除了Windows桌面上的Office之外,它们都无法使用。

答案 2 :(得分:-2)

这是一个非常基本的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