Spis treści:

Kategoria:C#Word


Tworzenie dokumentów Word w C# - Operacje tekstowe

Operacje na zakresie

Jakiś czas temu ogłosiłem rozpoczęcie cyklu wpisów na temat generowania dokumentów Word. Pokazałem, jak utworzyć dokument przy pomocy biblioteki Microsoft.Office.Interop.Word i COM, jakie niemiłe niespodzianki mogą nas czekać podczas pracy z obiektami Word (Tworzenie dokumentu Word w C# - I), a także w postaci XML (Tworzenie dokumentu Word XML w C# - II). Wersja COM, bo tak ją będę nazywał, nie robiła nic. Po prostu była. Nadszedł czas na to, aby w dokumencie coś powstawiać.

Istnieją dwie podstawowe techniki wstawiania tekstu:

  • Poprzez obiekt Range
  • Poprzez obiekt Selection

Pierwszy z tych obiektów to zakres. Większość obiektów, w których można coś wstawić, ma przypisany obiekt Range. Zakresem (ang. range) może być zatem cały dokument, komórka, paragraf. Przyjrzyjmy się fragmentowi pokazanemu poniżej:

using System;
using Word = Microsoft.Office.Interop.Word;

class Program
{
    static void Main(string[] args)
    {
        object missing = Type.Missing;
        Word._Application wordApplication = new Word.Application();
        try
        {
            Word._Document wordDocument = wordApplication.Documents.Add(
                ref missing, ref missing, ref missing, ref missing);

            wordDocument.Range().Text = "Hello Word!"
        }
        finally
        {
            wordApplication.Visible = true;
        }
    }
}

Zaszło kilka zmian w porównaniu z poprzednim przykładem. Po pierwsze, pojawił się blok try ... finally. Wspomniałem już, że domyślnie aplikacja Word jest niewidoczna. Celem bloku finally jest pokazanie jej, bez względu na to, co się wydarzy. Jest to po części konsekwencja drugiej zmiany: nie zamykamy już dokumentu i nie kończymy aplikacji - pozwalamy jej chodzić. Po wykonaniu się programu na pulpicie powinien się pojawić dokument. Nasz program się kończy, ale WINWORD.exe to oddzielny proces. Pamiętajmy, że my się tylko z nim komunikujemy, nie jest on naszą własnością. Błędy w naszej aplikacji mogą doprowadzić do przedwczesnego zakończenia naszej aplikacji, ale nie procesu WINWORD.exe. Word będzie działał dalej, ale nie dostanie już żadnych rozkazów, instrukcji i komunikatóww od naszego programu.

Po uruchomieniu zaprezentowanego przykładu powinniśmy ujrzeć dokument Word z tekstem Hello Word!

Podmiana zakresu

Należy zdawać sobie sprawę, że domyślnie zakres obejmuje wszystkie elementy umieszczone wewnątrz rozpatrywanego obiektu. W pokazanym przykładzie zakres obejmował cały dokument. Popatrzmy na poniższy listing:

using System;
using Word = Microsoft.Office.Interop.Word;

class Program
{
    static void Main(string[] args)
    {
        object missing = Type.Missing;
        Word._Application wordApplication = new Word.Application();
        try
        {
            Word._Document wordDocument = wordApplication.Documents.Add(
                ref missing, ref missing, ref missing, ref missing);

            wordDocument.Range().Text = "Hello Word!";
            //Tekst Hello Word! zostanie nadpisany
            wordDocument.Range().Text = "Karaczan";
        }
        finally
        {
            wordApplication.Visible = true;
        }
    }
}

Dokument wynikowy będzie zawierał wyłącznie drugi napis: Karaczan. Jak zatem wpisać kilka wyrazów?

Sterowanie zakresem

Zakres domyślnie obejmuje cały dokument - ale tylko domyślnie. Możemy nim sterować. Metoda Range() może przyjąć dwa argumenty: pierwszy z nich określa początek zakresu, a drugi koniec. Jeżeli chcemy wstawić coś za 11 znakiem, wystarczy wskazać nowy zakres tak, jak poniżej:

object missing = Type.Missing;
Word._Application wordApplication = new Word.Application();
try
{
    Word._Document wordDocument = wordApplication.Documents.Add(
        ref missing, ref missing, ref missing, ref missing);

    wordDocument.Range().Text = "Hello Word!";
    object from = 11; //"Hello Word!".Length
    object to = 11;
    wordDocument.Range(ref from, ref to).Text = "Karaczan";
}
finally
{
    wordApplication.Visible = true;
}

Wynikiem działania będzie napis: Hello Word!Karaczan. Można oczywiście tak ustawić zakres, aby celowo podmienić wybrany fragment tekstu. Warto trochę poeksperymentować z obiektem Range, bo może on być wykorzystywany do wielu operacji, tj. formatowania, wstawiania obiektów i wielu innych. Do tego obiektu będziemy często wracać.

Operacje na zaznaczeniu

Nie mniej ważnym obiektem od Range jest obiekt Selection. Tu ważna różnica: obiekt Selection może być tylko jeden dla całej aplikacji. Reprezentuje on bieżącą pozycję zaznaczenia lub kursora i tak należy ten obiekt traktować. Gdy piszemy zwykły tekst, kursor wskazuje nam bieżącą pozycję. Nowe znaki wstawiane są w miejscu kursora, a kursor przechodzi za wstawiane znaki. Gdy zaznaczymy jakiś fragment tekstu, wpisanie pierwszego znaku lub wstawienie tekstu ze schowka podmieni zaznaczony fragment, a samo zaznaczenie zlikwiduje. Popatrzmy na przykład pokazany poniżej:

object missing = Type.Missing;
Word._Application wordApplication = new Word.Application();
try
{
    Word._Document wordDocument = wordApplication.Documents.Add(
        ref missing, ref missing, ref missing, ref missing);

    wordApplication.Selection.TypeText("Hello Word!");
    //Kursor znajduje się za Hello Word!
    wordApplication.Selection.TypeText("Karaczan");
    //Wynik: Hello Word!Karaczan
}
finally
{
    wordApplication.Visible = true;
}

Podobnie jak obiekt Range, tak i obiekt Selection można przestawić we wskazane miejsce. Zostanie to jednak pokazane przy innej okazji.

Kategoria:C#Word

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za te informacje. były kluczowe
Dobrze wyjaśnione, dzięki !
a z innej strony - co gdybym ciąg znaków chciał mieć rozbity nie na wiersze a na kolumny? Czyli ciąg ABCD: 1. kolumna: A, 2. kolumna: B, 3. kolumna: C, 4 kolumna: D?
Ciekawy artykuł.
Czy można za pomocą EF wysłać swoje zapytanie?
Czy lepiej do tego użyć ADO.net i DataTable?