直接绘制到Excel单元格canvas

有没有办法使用VSTO直接绘制图像到包含Excel单元格的canvas,而不必插入形状?

我已经看到了,我知道这是可能的,我似乎无法find信息来源。

Range cell = sheet.Cells[1, 1]; var border = cell.Borders[XlBordersIndex.xlDiagonalDown]; border.Weight = XlBorderWeight.xlThin; border.LineStyle = XlLineStyle.xlContinuous; 

这个代码片段似乎在单元格的canvas内产生一个graphics。 我需要访问这个绘制的图层。

不幸的是,没有办法直接在canvas上绘画,至less通过公共API,并且当您想要重用绘制Windows窗体控件中的代码时,您绝对不能使用GDI +绘图引擎来绘制您提出的graphics。

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


你自己find了这部电影 ,我认为那里有一个可行的select。 如果您可以将graphics渲染到图像上,则可以通过公式插入该graphics(请注意图片仍然是您不喜欢的graphics,但我想我们可以对这些graphics进行例外)。

如果OLE对象被使用或需要渲染,我build议不要使用这些。 在我看来,他们太“老派”了,在你的Windows桌面上,除了Office以外的任何东西都不能工作。

video中的示例(在我的原始答案时未发布)不会“绘制到canvas上”,而是程序会生成OLE对象并将它们embedded到电子表格的单元格中。 当二次应用被用于实际绘制分子时可以看到这一点。 如果对是否使用OLE有任何疑问,这个名字应该让他们rest – 这叫做MarvinOLE 。 有一些文档,包括如何与其他供应商的OLE对象进行交互。 由于OLE是一种COM技术,并且Excel的接口都是基于COM的 ,所以这是可行的。

如果您百分百承诺学习如何“直接在canvas上绘制图像”,请忽略此答案的其余部分。 由于您希望使用C#(.NET语言)与Excel的COM接口进行交互,因此您需要熟悉主互操作程序集 。 他们的参考可以在这里find。 如果你只是针对最新的Excel / Office版本,你可能想看看这个答案 ,讨论“改进”Interop接口。 这里有一个博客作者可以帮助你开始。

search“ excel互操作oleobjects ”或类似的东西,你会发现很多的例子,SO问题,文档等

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

 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