直接绘制到 Excel 单元格 canvas
Drawing directly to Excel cell canvas
是否可以使用 VSTO 将图像直接绘制到包含 Excel 单元格的 canvas 而无需插入形状?
我已经看到它完成了,我知道我可能只是无法找到信息来源。
Range cell = sheet.Cells[1, 1];
var border = cell.Borders[XlBordersIndex.xlDiagonalDown];
border.Weight = XlBorderWeight.xlThin;
border.LineStyle = XlLineStyle.xlContinuous;
此代码片段似乎在单元格的 canvas 内生成了一个绘图。我需要访问它绘制的图层。
这是一个非常基本的 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
不幸的是,没有办法直接在canvas上绘图,至少通过public API,你肯定不能使用GDI+绘图引擎来绘图当您想要重用绘图 Windows 表单控件中的代码时,您会提出这个建议。
我正在研究直接使用 Windows 绘图的可能性,但这似乎也不可能,因为 Excel 不会为每个单元格保留句柄,这很难知道要绘制哪个单元格。另外,这张图不会持久,这在我看来是一个主要缺点。
您自己找到了 this movie,我认为那里有一个可行的选择。如果你可以将你的绘图渲染成图像,你可以通过公式插入该绘图(请注意,图片仍然是形状,你不喜欢,但我想我们可以为那些例外)。
如果渲染使用或需要 OLE 对象,我建议不要使用它们。在我看来,它们太 'old school',无法在 Windows 桌面上使用 Office 以外的任何软件。
视频中的示例(您在我最初回答时尚未发布)没有 "draw to the canvas," 而是程序生成 OLE 对象 并嵌入它们在电子表格的单元格内。这可以在使用二次应用程序实际绘制分子时看到。如果对它是否使用 OLE 有任何疑问,这个名字应该让他们休息——它叫做 MarvinOLE. There is some documentation, including how to interact with other vendors' OLE objects, here. Since OLE is a COM technology, and Excel's interfaces are all COM-based,这很有效。
如果您 100% 致力于学习如何 "draw an image directly to the canvas",请忽略此答案的其余部分。 因为您想使用 C#(一种 .NET 语言) 要与 Excel 的 COM 接口交互,您需要通过一个可能有助于您入门的示例来熟悉 Primary Interop Assemblies. Their reference can be found here. If you are only targeting the newest Excel/Office versions, you may want to look at this SO answer, discussing the "improved" Interop interface. Here's a blogger。
搜索“excel interop oleobjects”或类似的内容,您会发现大量示例、SO 问题、文档等。
是否可以使用 VSTO 将图像直接绘制到包含 Excel 单元格的 canvas 而无需插入形状?
我已经看到它完成了,我知道我可能只是无法找到信息来源。
Range cell = sheet.Cells[1, 1];
var border = cell.Borders[XlBordersIndex.xlDiagonalDown];
border.Weight = XlBorderWeight.xlThin;
border.LineStyle = XlLineStyle.xlContinuous;
此代码片段似乎在单元格的 canvas 内生成了一个绘图。我需要访问它绘制的图层。
这是一个非常基本的 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
不幸的是,没有办法直接在canvas上绘图,至少通过public API,你肯定不能使用GDI+绘图引擎来绘图当您想要重用绘图 Windows 表单控件中的代码时,您会提出这个建议。
我正在研究直接使用 Windows 绘图的可能性,但这似乎也不可能,因为 Excel 不会为每个单元格保留句柄,这很难知道要绘制哪个单元格。另外,这张图不会持久,这在我看来是一个主要缺点。
您自己找到了 this movie,我认为那里有一个可行的选择。如果你可以将你的绘图渲染成图像,你可以通过公式插入该绘图(请注意,图片仍然是形状,你不喜欢,但我想我们可以为那些例外)。
如果渲染使用或需要 OLE 对象,我建议不要使用它们。在我看来,它们太 'old school',无法在 Windows 桌面上使用 Office 以外的任何软件。
视频中的示例(您在我最初回答时尚未发布)没有 "draw to the canvas," 而是程序生成 OLE 对象 并嵌入它们在电子表格的单元格内。这可以在使用二次应用程序实际绘制分子时看到。如果对它是否使用 OLE 有任何疑问,这个名字应该让他们休息——它叫做 MarvinOLE. There is some documentation, including how to interact with other vendors' OLE objects, here. Since OLE is a COM technology, and Excel's interfaces are all COM-based,这很有效。
如果您 100% 致力于学习如何 "draw an image directly to the canvas",请忽略此答案的其余部分。 因为您想使用 C#(一种 .NET 语言) 要与 Excel 的 COM 接口交互,您需要通过一个可能有助于您入门的示例来熟悉 Primary Interop Assemblies. Their reference can be found here. If you are only targeting the newest Excel/Office versions, you may want to look at this SO answer, discussing the "improved" Interop interface. Here's a blogger。
搜索“excel interop oleobjects”或类似的内容,您会发现大量示例、SO 问题、文档等。