直接在Excel单元格画图

6
有没有一种方法可以在不插入形状的情况下,使用VSTO直接将包含Excel单元格的图像绘制到画布上?
我知道这是可能的,但我似乎找不到相关信息的来源。
    Range cell = sheet.Cells[1, 1];

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

这段代码似乎在单元格的画布内绘制了一幅图像。我需要访问此图像所绘制的图层。


可以设置工作表的背景图片:http://www.aspose.com/docs/display/cellsnet/Set+Background+Picture+of+a+Worksheet - Axel Richter
@AxelRichter 这看起来不错,但它是否仅适用于整个工作表?我想访问相同的图层,但我需要绘制到特定单元格。 - Christo S. Christov
@PatrickHofman 我已经实现了那个,它可以工作,但是对象不是单元格的一部分。 - Christo S. Christov
3个回答

3
视频中的示例(在我最初回答时您尚未发布)并没有“绘制到画布” ,而是程序生成OLE对象并将它们嵌入电子表格单元格中。当使用辅助应用程序实际绘制分子时,可以看到这一点。如果有任何疑问它是否使用OLE,那么名称应该让它们消除 —— 它被称为MarvinOLE。有一些文档,包括如何与其他供应商的OLE对象交互的说明,在这里。由于OLE是COM技术,而Excel接口都是基于COM的,所以可以这样运作。 如果您完全致力于学习如何“直接向画布绘制图像”,请忽略本回答的其余部分。因为您想使用C#(.NET语言)与Excel的COM接口进行交互,所以您需要熟悉主互操作程序集。它们的参考文档可以在这里找到。如果您只针对最新的Excel/Office版本,您可能需要查看这个SO回答,讨论“改进”的Interop接口。 这位博客作者提供了一个可以帮助您入门的示例。
搜索“excel interop oleobjects”或类似内容,您将会发现大量的示例、SO问题、文档等。

好的,这对我来说听起来足够好。你将获得赏金,但问题的答案将会给Patrick,因为他也提出了OLE对象作为解决方案。谢谢 :) - Christo S. Christov

2
很遗憾,至少通过公共API,没有直接在画布上绘制的方法,当您想要重用绘制Windows Forms控件的代码时,绝对不能使用GDI+绘图引擎来绘制。我正在研究直接使用Windows进行绘制的可能性,但这似乎也不可能,因为Excel不会为每个单元格保留句柄,所以很难知道要绘制哪个单元格。此外,这种绘制不会持久存在,这是我认为的一个主要缺点。
你自己找到了这部电影,我认为那里有一个可行的选择。如果你可以将你的图纸渲染成图像,你就可以通过公式将该图纸内联插入(请注意,图片仍然是形状,这是你不喜欢的,但我想我们可以为此做出例外)。
如果需要使用OLE对象进行渲染,我建议不要使用它们。在我看来,它们太“老派”了,而且除了Windows桌面上的Office之外,其他任何东西都无法与其配合使用。

@Chris:看起来他正在嵌入OLE对象。请不要这样做。在我看来,它们太“老派”了,除了Windows桌面上的Office之外,与其他任何东西都不兼容。 - Patrick Hofman
@Chris:已更新下划线下的部分。 - Patrick Hofman
我认为该示例中的结构不是形状。它们无法交互,似乎“嵌入”在单元格内部。 我查看了几个使用这种方法的项目(反汇编哎呀)。它们似乎使用一些与Excel进行低级交互的方式。这正是我想要的。不幸的是,由于代码混淆,我无法看清楚这个方式是什么。 - Christo S. Christov
他们可能在使用OLE吗?你有项目的位置吗? - Patrick Hofman
感谢你的思考,帕特里克!我非常感激! :) - Christo S. Christov
显示剩余9条评论

-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

我正在寻找一种允许我直接在单元格的画布上绘制的工具。你指出的是一个用形状解决的方案,而我已经拥有并不需要。但还是感谢您的努力。 - Christo S. Christov
我可以问一下,您想要实现什么特定的功能需要使用画布吗? - ExactaBox
OP问道:“不用插入形状怎么办?”你建议:使用形状。此外,VBA不是C#。 - Patrick Hofman
@ExactaBox 我正在使用Drawing Visuals在自定义的.NET控件上进行自定义绘图。我加载控件并绘制需要绘制的内容,然后希望将其插入到单元格画布中。 - Christo S. Christov
在Excel单元格中,使用默认API无法绘制任何内容。Excel单元格仅可包含值或公式,没有其他任何东西。单元格内部可以包含背景颜色或预定义的图案,但不能包含图片。您的代码片段也无法绘制任何内容。它只能将预定义的单元格边框线打开。 - Axel Richter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接