我目前正在尝试使用 C# 互操作编辑 Excel 电子表格对象的单元格。我将它作为对象插入到Word文档中。
在那之前我还没有成功地编写出任何真正有效的东西。我可以选择该组件,但无法将其打开进行编辑,然后到达网格的单元格。
我使用自定义 Office 功能区中的按钮控件来启动编辑。这是我的方法:
public void EditTable(Office.IRibbonControl control)
{
Word.Application oWordApp = (Word.Application)Marshal.GetActiveObject("Word.Application");
Word.Document oWordDoc = oWordApp.ActiveDocument;
Word.Bookmark ReqsBookmark = DocumentHelper.GetBookmark("test");
ReqsBookmark.Select();
}
我知道通过互操作访问特定对象的唯一方法是使用书签。
有人知道如何做这样的事情吗?
最佳答案
在 Word 中,Excel 工作表(工作簿)“包装”在 OLE 控件中,该控件是 InlineShapes
或 Shapes
集合的成员。因此,您需要要使用的集合的 AddOLEObject
方法。
通过 InlineShape
或 Shape
的 OLEFormat
属性访问 OLE 服务器 (Excel) 的对象模型。因此您的代码将类似于下面的示例。
请注意,虽然您说这是一个 VSTO 项目,但您向我们展示的代码不是 VSTO。您正在启动 Word.Application 的新实例,但 VSTO 外接程序将在进程内运行。我的代码是 VSTO 代码,但当然可以针对其他情况进行调整...
{
Word.Document doc = Globals.ThisAddIn.app.ActiveDocument;
object oRngTarget = Globals.ThisAddIn.app.Selection.Range;
//object oRngTarget = DocumentHelper.GetBookmark("test").Range;
object oOLEClass = "Excel.Sheet.12";
object oFalse = false;
Word.InlineShape ils = doc.InlineShapes.AddOLEObject(ref oOLEClass, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref oRngTarget);
Word.OLEFormat olef = ils.OLEFormat;
System.Globalization.CultureInfo oldCI= System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Excel.Workbook wb = (Excel.Workbook)olef.Object;
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
try
{
ws.get_Range("A1").Value2 = "New category";
ws.get_Range("B1").Value2 = 6.8;
}
catch (Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message);
}
finally
{
ws = null;
wb = null;
ils = null;
doc = null;
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
}
}
要稍后在 Word 文档中使用电子表格,您基本上遵循相同的原则:声明并实例化 InlineShape.OLEFormat
对象,激活它,然后强制转换 olef.Object
到 Excel.Workbook:
olef.Activate();
Excel.Workbook wb = (Excel.Workbook)olef.Object;
关于c# - 在 Word 文档中编辑 Excel 电子表格对象(C# Interop),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37272419/