【问题标题】:Edit Excel Spreadsheet object in word document (C# Interop)在 Word 文档中编辑 Excel 电子表格对象(C# 互操作)
【发布时间】:2016-05-19 01:51:00
【问题描述】:

我目前正在尝试使用 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();
    }

我知道使用互操作访问特定对象的唯一方法是使用书签。

有人知道如何做这样的事情吗?

【问题讨论】:

  • 输入自己尝试的代码sn-ps。让我们知道确切的要求,我们可以为您提供帮助。总是缩小问题的范围。参考this

标签: c# excel ms-word vsto office-interop


【解决方案1】:

在 Word 中,Excel 工作表(工作簿)被“包装”在一个 OLE 控件中,该控件是 InlineShapesShapes 集合的成员。所以你需要你想使用的集合的AddOLEObject方法。

通过InlineShapeShapeOLEFormat 属性访问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;

【讨论】:

    【解决方案2】:

    感谢这篇关于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 的回答,它帮助我了解了它的实际工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多