SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Ersetze Bookmarks im Word-Dokument mit Hilfe von OpenXml in C#

Unbeantwortet Dieser Beitrag hat 6 Antworten

Ohne Rang
22 Beiträge
Wadik1977 erstellt 28 Juli 2016 10:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen!

Ich habe ein Problem, und komme seit mehreren Tagen nicht weiter.

Ich habe in Visual Studio einen EventReceiver für eine SP-Liste erstellt. Mit ItemUpdating wird eine Methode aufgerufen, die in einer Dokumentenbibliothek eine neue Word-Datei erstellt. Dieses Word-Dokument wird vorher mit Werten gefüllt. Dafür werden im Dokument die Bookmarks ersetzt.

So, nun zum Problem:

Die Lösung funktioniert in meiner Entwicklungsumgebung problemlos. Jedoch nicht in der Produktivumgebung. Ich finde nirgendwo genaue Fehlereintragungen. Ich weiß lediglich, wann der Fehler auftritt, und zwar bei dieser USING-Anweisung:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docStream, true))
{    
     ....
}

Hier ist die Methode:

public bool createMyWordDocument(string siteName, string listName, int vorschlagID, string fileName, List<Bookmarks> bookmarks)
       {
           bool created = false;
           try
           {
               using (SPSite site = new SPSite(siteName))
               {
                   using (SPWeb web = site.OpenWeb())
                   {
                       SPDocumentLibrary documentLibrary = web.Lists[listName + "_einstellungsinformation"] as SPDocumentLibrary;
                       SPFile template = web.GetFile(siteName + "/" + listName + "_einstellungsinformation/Forms/Einstellungsinformation_template.docx");

                       byte[] byteArray = template.OpenBinary();

                       using (MemoryStream docStream = new MemoryStream(byteArray))
                       {
                           docStream.Write(byteArray, 0, (int)byteArray.Length);

                               using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docStream, true))
                               {
                                   /* Ersetze Bookmarks */
                                   MainDocumentPart mainPart = wordDoc.MainDocumentPart;
                                   Body body = mainPart.Document.GetFirstChild<Body>();
                                   var paras = body.Elements<Paragraph>();

                                   foreach (var para in paras)
                                   {
                                       var bookMarkStarts = para.Elements<BookmarkStart>();
                                       var bookMarkEnds = para.Elements<BookmarkEnd>();

                                       foreach (BookmarkStart bookMarkStart in bookMarkStarts)
                                       {
                                           foreach (Bookmarks bookmark in bookmarks)
                                           {
                                               if (bookmark.BookmarkName == bookMarkStart.Name)
                                               {
                                                   var id = bookMarkStart.Id.Value;
                                                   var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First();

                                                   var runElement = new Run(new Text(bookmark.BookmarkValue));
                                                   para.InsertAfter(runElement, bookmarkEnd);
                                               }
                                           }
                                       }
                                   }
                                   mainPart.Document.Save();
                               }

                           web.AllowUnsafeUpdates = true;

                           SPFile uploadedFile = documentLibrary.RootFolder.Files.Add(fileName + ".docx", docStream, true);

                           uploadedFile.Item["vorschlagID"] = vorschlagID;
                           uploadedFile.Item["Title"] = fileName;
                           uploadedFile.Item.Update();
                           uploadedFile.Update();

                           web.AllowUnsafeUpdates = false;
                           created = true;
                       }
                   }
               }
           }
           catch (SPException ex)
           {
               createLog(siteName, listName, vorschlagID, "Error: " + ex.ToString());
           }
           return created;
       }

Hat jemand vielleicht eine Lösung für mich?

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Juli 2016 10:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Klasse WordProcessingDocument gehört zur Assembly DocumentFormat.OpenXml.dll und die fehlt auf dem Produktivsystem (sie ist nicht Bestandteil des .NET-Frameworks.

Sorge dafür, daß alle verwendeten Assemblies auf dem Produktivsystem sind. Du kannst sie z.B. mit in Deine Solution packen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 28 Juli 2016 11:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deinen Hinweis!

Die Assembly war schon auf dem Produktivsystem vorhanden. Auch, nachdem ich die Assembly nochmal heruntergeladen und installiert habe, funktioniert es nach wie vor nicht. Die Assembly befindet sich bei mir in:

C:\Program Files (x86)\Open XML SDK\V2.0\lib

bzw.

C:\Program Files (x86)\Open XML SDK\V2.5\lib

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Juli 2016 12:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dort findet sie SharePoint (bzw. der IIS) aber nicht. Sie gehört in den GAC.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 28 Juli 2016 12:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Assembly habe ich so dem Cache hinzugefügt:

gacutil -i  DocumentFormat.OpenXml.dll

Unter Windows\assembly taucht die Assembly auch auf. Was mache ich falsch?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Juli 2016 12:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann paßt das schon mal. Ich kenne dieses SDK nicht, nehme aber an, daß es einfach noch mehr Abhängigkeiten gibt. Schau mal in Visual Studio unter References. Dort sind alle verwendeten Assemblies aufgelistet und die müssen auf dem Zeilsystem auch vorhanden sein.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 29 Juli 2016 09:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi!

Es funktioniert jetzt:)

Ich habe die Assembly mit in die Lösung reingenommen, jetzt geht es.

Danke dir! Ohne dich wäre ich gar nicht darauf gekommen, dass das Problem an der Assembly lag.