Legen Sie OpenXmlElement nach word-Lesezeichen im Open XML SDK
War ich in der Lage, den Zugriff auf eine Textmarke in meinem word-Dokument mit diesem code:
var res = from bm in mainPart.Document.Body.Descendants<BookmarkStart>()
where bm.Name == "BookmarkName"
select bm;
Möchte ich nun fügen Sie einen Absatz und eine Tabelle nach diesem Lesezeichen. Wie mache ich das? (Beispiel-code wäre sehr hilfreich)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code
Sobald Sie über das Lesezeichen können Sie auf dessen parent-element und fügen Sie die anderen Elemente nach es.
Der obige code sollte es tun. Aber ich werde erklären, einige Besondere Umstände.
Sich bewusst sein, dass Sie versuchen werden die Einfügungen nach dem übergeordneten element der Lesezeichen. Welches Verhalten erwarten Sie, wenn Sie Ihre Lesezeichen passiert, ein Teil von einem Absatz innerhalb einer Tabelle? Sollte es fügen Sie die neuen Absatz-und Tisch-nach der, in dieser Tabelle? Oder sollte es nicht nach dieser Tabelle?
Werden Sie sich vielleicht Fragen, warum die oben genannten Fragen egal. Es hängt alles davon ab, wo die Einfügung stattfinden wird. Wenn das Lesezeichen ist ein Elternteil ist in einer Tabelle, derzeit würde der obige code versuchen, eine Tabelle innerhalb einer Tabelle. Das ist in Ordnung, aber ein Fehler kann auftreten, aufgrund von eine ungültige OpenXml-Struktur. Der Grund dafür ist, dass, wenn die Tabelle eingefügt wurde, die das Letzte element in der ursprünglichen Tabelle ist TableCell, es muss ein Absatz-element Hinzugefügt, nachdem die Schließung TableCell tag. Sie würde prompt entdecken Sie dieses Problem, wenn es aufgetreten ist, nachdem Sie versucht haben, öffnen Sie das Dokument in MS Word.
Die Lösung ist, um zu bestimmen, ob Sie tatsächlich ausführen die Einfügemarke innerhalb einer Tabelle.
Zu tun, können wir fügen Sie zu den oben genannten code (nach der übergeordneten var):
Dass sollte den Fehler verhindern und geben Sie gültige OpenXml. Die while-Schleife Idee kann verwendet werden, wenn Sie mit "ja" beantworten meine Vorherige Frage und wollte, führen Sie die Einfügemarke nach der übergeordneten Tabelle anstatt in der Tabelle, als würde der obige code tun. Wenn das der Fall ist, das oben genannte Problem nicht mehr ein Problem, und Sie können ersetzen, die Schleife und der Typ boolean mit den folgenden:
Diese hält wieder die Zuordnung des übergeordneten, bis es das main-element enthalten auf der Körper-Ebene. Also, wenn das Lesezeichen wurde in einem Absatz, wurde in einer Tabelle, es würde gehen Sie von Absatz zu TableCell für Tabellenzeilen Tabelle und dort anhalten, da die Tabelle parent-Körper. An diesem Punkt parent = element Tabelle und wir legen nach.
Abdecken sollten einige verschiedene Ansätze, abhängig von Ihrer ursprünglichen Absicht. Lassen Sie mich wissen, wenn Sie Erläuterungen benötigen, nach dem Versuch es heraus.
Dokument Reflektor
Werden Sie sich vielleicht Fragen, wie ich bestimmt die
GridColumn.Width
Werte. Ich habe eine Tabelle und verwendet das Document Reflector-tool, um es zu bekommen. Bei der Installation des Open Xml SDK productivity tools (wenn Sie installiert wurden) würde sich inC:\Program Files\Open XML Format SDK\V2.0\tools
(oder ähnlich).Der beste Weg, um zu lernen, wie die *.docx-format arbeitet (oder eine Offene Xml-formatierte doc) ist zu öffnen Sie eine vorhandene Datei mit der Document Reflector-tool. Navigieren Sie den Teil des Dokuments, und suchen Sie die Elemente, die Sie replizieren möchten. Das tool zeigt Ihnen die aktuell verwendeten code zu generieren, der das gesamte Dokument. Dies ist der code, können Sie copy/paste in Ihre Anwendung zu generieren, die zu ähnlichen Ergebnissen. Sie können Sie ignorieren, alle Referenz-IDs in der Regel, müssen Sie schauen Sie und probieren Sie es aus, um ein Gefühl für es.
Wie gesagt, die obigen Tabelle war der code angepasst von einem Beispiel-Dokument. Ich habe eine einfache Tabelle, um eine docx -, dann eröffnet er in das Werkzeug, und kopiert den code von dem tool generiert (habe ich entfernt, einige extras, um es zu säubern). Das gab mir ein funktionierendes Beispiel für eine Tabelle hinzufügen.
Ist es besonders hilfreich, wenn Sie wissen wollen, wie man code schreibt, der etwas erwirtschaftet, wie formatierte Tabellen und Absätze mit Formatvorlagen etc.
Werfen Sie einen Blick auf diesen link für screenshots und Infos zu den anderen tools im SDK enthalten: Eine Einführung in das Open XML SDK 2.0.
Code-Snippets
Sie könnten auch interessiert sein in der code-Schnipsel für Open Xml. Für eine Liste von snippets überprüfen in diesem blog-post. Sie können Sie hier herunterladen: 2007 Office System Sample: Open XML Format SDK 2.0 Code-Snippets für Visual Studio 2008.
Einmal installiert, würden Sie fügen Sie Sie über Extras | Codeausschnitt-Manager-Menü. Wählen Sie C# - Sprache, klicken Sie auf die Schaltfläche Hinzufügen, und navigieren Sie zu PersonalFolder\Visual Studio 2008\Code Snippets\Visual C#\Open XML SDK 2.0 für Microsoft Office, um Sie hinzuzufügen. Von Ihrem code, den Sie mit der rechten Maustaste und wählen Sie "Ausschnitt Einfügen" und wählen Sie die, die Sie wollen.