none
Word Textmarken/Bookmarks nach befüllen behalten RRS feed

  • Frage

  • Hallo zusammen,

    ich schreibe ein Programm, welches mir Word Textmarken (Bookmarks) mit Werten aus einer DB befüllt. Dies löse ich folgendermaßen:

    //...
    
    object oFileName = filePath;
    object oFALSE = false;
    object oEMPTY = string.Empty;
    object oDocFormat = 0;
    
    Word.Application wordApp = new Word.ApplicationClass();
    Word.Document wordDoc = wordApp.Documents.Open(ref oFileName, ref oFALSE, ref oFALSE, ref oFALSE, ref oEMPTY, ref oEMPTY, ref oFALSE, ref oEMPTY, ref oEMPTY, ref oDocFormat);
    
    foreach (Word.Bookmark bookmark in wordDoc.Bookmarks)
    {
        Word.Range range = bookmark.Range.Duplicate;
        range.Text = "Bsp";
    }
    
    //...

    Mein Problem ist folgendes: 
    Nach der Befüllung durch das Programm sind sämtliche Textmarken weg!
    Ich löse dies folgendermaßen:

    //...
    
    ArrayList alBookmarks = new ArrayList();
    foreach (Word.Bookmark bookmark in wordDoc.Bookmarks)
    {
        if ((bookmark.Name != null) && (bookmark.Name != ""))
            alBookmarks.Add(bookmark);
    }
    
    foreach (Word.Bookmark bookmark in alBookmarks)
    {
        string sBookmarkName = "";
        try { sBookmarkName = bookmark.Name; }
        catch { continue; }
        Word.Range range = null;
        try
        {
            range = bookmark.Range.Duplicate;
            range.Text = "Bsp";
        }
        catch (Exception) { }
        finally
        {
            if (range != null)
            {
                object oRange = range;
                wordDoc.Bookmarks.Add(sBookmarkName, ref oRange);
                Marshal.ReleaseComObject(range);
            }
        }
    }
    
    foreach (Word.Bookmark bookmark in alBookmarks)
        Marshal.ReleaseComObject(bookmark);
    
    //...

    Diese Möglichkeit liefert bei mir allerdings sehr schlechte Performance über eine Windows-Terminalsitzung (knapp 8-12 Sec für ~30 Textmarken).
    Gibt es eine Möglichkeit die Textmarken zu behalten ohne diesen Umweg?

    Vielen Dank im Voraus für eure Hilfe
    Dienstag, 2. Oktober 2012 11:52

Antworten

  • Hallo,

    Das von dir geschilderte Verhalten von Textmarken ist in allen Versionen von Word identisch, und die Lösung ist immer wieder die gleiche: Beim Setzen des Textes für bookmark.Range geht - wie Du festgestellt hast - die Textmarke unweigerlich verloren also ersetzt man die verlorengegangene Textmarke mit einer neuen. Dein Vorgehen ist diesbezüglich in Ordnung. Was Probleme bereiten kann, auch was Performanz angeht, sind die try/catch/finally-Konstrukte in deinem Code. Es sollte auch einfacher gehen:

    var bookmarks = wordDoc.Bookmarks.Cast<Word.Bookmark>().ToArray();
    foreach (Word.Bookmark bookmark in bookmarks)
    {
        var oldBookmarkName = bookmark.Name;
        var oldBookmarkValue = bookmark.Range.Text;
        object oldBookmarkRange = bookmark.Range.Duplicate;
        var newBookmarkValue = oldBookmarkValue + "_Bogus1";
        bookmark.Range.Text = newBookmarkValue;
        Word.Bookmark newBookmark = wordDoc.Bookmarks.Add(oldBookmarkName, ref oldBookmarkRange);
        newBookmark.End = newBookmark.Start + newBookmarkValue.Length;
    }

    Auch dieser Code läßt sich noch kürzer und prägnanter schreiben, ich lasse ihn aber so der Deutlichkeit wegen.

    Obiger Code geht davon aus, dass das Word-Dokument umschließende Textmarken verwendet. In Word gibt es zwei Arten von Textmarken: Platzhalter-Textmarken (graphisch als I gekennzeichnet) und umschließende Textmarken (in der Form [abc]). Umschließende Textmarken entstehen wenn man z.B. ein Wort markiert und dann den Befehl zum Einfügen der Textmarke ausführt. Weitere Infos findest Du in den folgenden Links.

    Inserting text at a bookmark without deleting the bookmark (VBA)
    Working with Bookmarks in VBA

    Gruß
    Marcel

    Mittwoch, 3. Oktober 2012 16:05
    Moderator

Alle Antworten

  • Hallo,

    Das von dir geschilderte Verhalten von Textmarken ist in allen Versionen von Word identisch, und die Lösung ist immer wieder die gleiche: Beim Setzen des Textes für bookmark.Range geht - wie Du festgestellt hast - die Textmarke unweigerlich verloren also ersetzt man die verlorengegangene Textmarke mit einer neuen. Dein Vorgehen ist diesbezüglich in Ordnung. Was Probleme bereiten kann, auch was Performanz angeht, sind die try/catch/finally-Konstrukte in deinem Code. Es sollte auch einfacher gehen:

    var bookmarks = wordDoc.Bookmarks.Cast<Word.Bookmark>().ToArray();
    foreach (Word.Bookmark bookmark in bookmarks)
    {
        var oldBookmarkName = bookmark.Name;
        var oldBookmarkValue = bookmark.Range.Text;
        object oldBookmarkRange = bookmark.Range.Duplicate;
        var newBookmarkValue = oldBookmarkValue + "_Bogus1";
        bookmark.Range.Text = newBookmarkValue;
        Word.Bookmark newBookmark = wordDoc.Bookmarks.Add(oldBookmarkName, ref oldBookmarkRange);
        newBookmark.End = newBookmark.Start + newBookmarkValue.Length;
    }

    Auch dieser Code läßt sich noch kürzer und prägnanter schreiben, ich lasse ihn aber so der Deutlichkeit wegen.

    Obiger Code geht davon aus, dass das Word-Dokument umschließende Textmarken verwendet. In Word gibt es zwei Arten von Textmarken: Platzhalter-Textmarken (graphisch als I gekennzeichnet) und umschließende Textmarken (in der Form [abc]). Umschließende Textmarken entstehen wenn man z.B. ein Wort markiert und dann den Befehl zum Einfügen der Textmarke ausführt. Weitere Infos findest Du in den folgenden Links.

    Inserting text at a bookmark without deleting the bookmark (VBA)
    Working with Bookmarks in VBA

    Gruß
    Marcel

    Mittwoch, 3. Oktober 2012 16:05
    Moderator
  • Hallo tkutter,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 24. Oktober 2012 12:29
    Moderator