我目前正在尝试使用c#interop编辑excel电子表格对象的单元格。我将它作为对象插入到word文档中。
直到我没有成功编程任何真正有用的东西。我可以选择该组件,但我无法将其打开到版本,然后到达网格的单元格。
我在自定义办公功能区中使用按钮控件来启动编辑。这是我的方法:
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();
}
我知道用interop访问特定对象的唯一方法是使用书签。
有没有人知道如何做这样的事情?
答案 0 :(得分:1)
在Word中,Excel工作表(工作簿)被“包装”在OLE控件中,该控件是InlineShapes
或Shapes
集合的成员。所以你需要你想要使用的集合的AddOLEObject
方法。
访问OLE服务器(Excel)的对象模型是通过OLEFormat
或InlineShape
的{{1}}属性。所以你的代码就像下面的例子。
请注意,虽然您说这是VSTO项目,但您向我们展示的代码不是VSTO。您正在启动Word.Application的新实例,但VSTO加载项将在进程中运行。我的代码是VSTO代码,但当然可以针对其他情况进行调整......
Shape
要稍后使用Word文档中的电子表格,您基本上遵循相同的原则:声明并实例化{
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;
}
}
对象,激活它,然后将InlineShape.OLEFormat
转换为Excel.Workbook:
olef.Object
答案 1 :(得分:1)
由于这篇关于modify an embedded Excel object inside a Word doc
的帖子,我终于成功了如果有人有一天需要它,那么这是c#方法:
{
Word.Document oWordDoc = Globals.ThisAddIn.Application.ActiveDocument;
Excel.Workbook oOLE = null;
Excel.Worksheet oSheet = null;
Word.InlineShapes ils = oWordDoc.InlineShapes;
ils[1].OLEFormat.Activate();
oOLE = ils[1].OLEFormat.Object;
oSheet = oOLE.Worksheets[1];
oSheet.get_Range("A1").Value = "I did it too!";
}
再次感谢@CindyMeister的回答,它帮助我理解它是如何运作的。