2016-05-17 19 views
2

Ich versuche derzeit, Zellen eines Excel-Tabellenkalkulationsobjekts mit C# Interop zu bearbeiten. Ich habe es als Objekt in ein Word-Dokument eingefügt.Excel-Spreadsheet-Objekt in Word-Dokument bearbeiten (C# Interop)

Bis dahin ist es mir nicht gelungen, etwas zu programmieren, was wirklich funktioniert. Ich kann die Komponente auswählen, aber ich kann sie nicht für die Edition öffnen und dann die Gitterzellen erreichen.

Ich verwende ein Button-Steuerelement in einem benutzerdefinierten Office-Multifunktionsleiste zum Starten der Bearbeitung. Hier ist meine Methode:

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(); 
    } 

Die einzige Möglichkeit, auf ein bestimmtes Objekt mit Interop zugreifen, ist mit Lesezeichen.

Hat jemand eine Vorstellung davon, wie man so etwas macht?

+0

Geben Sie die Code-Snippets ein, die Sie selbst getestet haben. Lassen Sie uns die genaue Anforderung wissen und wir können Ihnen helfen. Beschränke immer die Frage. Siehe [this] (http://stackoverflow.com/help/mcve) – SSJGSS

Antwort

1

In Word wird ein Excel-Arbeitsblatt (Arbeitsmappe) in ein OLE-Steuerelement "eingewickelt", das ein Mitglied der InlineShapes oder Shapes Auflistung ist. Sie benötigen also die AddOLEObject Methode der Sammlung, die Sie verwenden möchten.

Der Zugriff auf das Objektmodell des OLE-Servers (Excel) erfolgt über die OLEFormat-Eigenschaft der InlineShape oder Shape. Ihr Code wäre also etwas wie das folgende Beispiel.

Beachten Sie, dass, obwohl Sie sagen, dies ist ein VSTO-Projekt, der Code, den Sie uns zeigen, nicht VSTO ist. Sie starten eine neue Instanz der Word.Application, aber das VSTO-Add-In wird in Bearbeitung ausgeführt. Mein Code ist VSTO Code, kann aber sicherlich für andere Situationen angepasst wird ...

{ 
    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; 
    } 
} 

Um spätere Arbeit mit einer Tabelle im Word-Dokument, Sie im Grunde nach dem gleichen Prinzip folgen: deklarieren und instanziieren ein InlineShape.OLEFormat Objekt, Activate sie warf dann olef.Object zu einem Excel.Workbook:

olef.Activate(); 
Excel.Workbook wb = (Excel.Workbook)olef.Object; 
+0

Danke @CindyMeister! Ich habe versucht, Ihre Lösung und es funktioniert gut, aber es ist eine neue Tabelle hinzufügen. Mein Hauptziel ist es, die Tabellen zu bearbeiten, die sich bereits in meinem Word Template Dokument befinden. Wenn Sie einen anderen Hinweis dazu haben, wäre ich dankbar. – Chefty

+1

@Chefty Sie haben mich dazu geschlagen, aber ich habe meine Antwort mit den Informationen am Ende bearbeitet ... –

1

ich schließlich gelang es dank dieser Beitrag über modify an embedded Excel object inside a Word doc

Hier ist die C# Methode, wenn jemand es eines Tages brauchen:

Nochmals vielen Dank @CindyMeister für Ihre Antwort, es half mir zu verstehen, wie es wirklich funktioniert.