Spis treści:

Kategoria:C#Word


Word w C# - style globalne

Style lokalne i style globalne

Jakiś czas temu pokazałem, jak wprowadzić do dokumentu Word proste style korzystając c interfejsów COM (Word w C# - Proste style i kolory) i tworząc plik XML w formacie Word (Word - style i kolory, XML). Pokazane techniki są skuteczne, ale zaleca się inne podejście. Po co zatem pokazywałem podejście niezalecane? Bo jest, zwłaszcza na początku, bardziej instuicyjne.

Po czym można poznać dobrze zrobiony dokument Word? Mam tu na myśli dokumenty kilkudziesięciostronicowe, tłumaczenia, prace naukowe, a nie prosty tekst wykorzystywany tylko prywatnie. Te lepsze dokumenty wyróżniają się odpowiednio użytymi nagłówkami, zastosowaniem automatycznych numeracji, spisów treści, spisów ilustracji i definiowanych lub wbudowanych styli. Skupię się tylko i wyłącznie na stylach. Po co je stosować? Dobrym zwyczajem jest przypisanie konkretnych styli do specyficznych sekcji dokumentu. Aby to zrozumieć, przywołajmy błędny sposób pisania. Załóżmy, że piszący uznał, że nazwy własne będą pochylone. Wprowadzając taki tekst użytkownik klika ikonę pochylenia, a następnie wpisuje, to co trzeba. Napisał tak 20 stron. Na 21 uznał, że napisze jakiś cytat i... też będzie pochylony. Napisał tak jeszcze kilkadziesiąr stron i zadowolony przekazuje tekst do druku. Wszystko wydaje się proste do momentu, w którym przechodzi wydawca i mówi: zrób tak, żeby cytaty były na jasnoszarym tle! Będą ładne i będą się ładnie wyróżniały i ogólnie będzie ładnie! Co robi autor tekstu? Przegląda cały dokument i ręcznie modyfikuje wszystkie cytaty. Istnieje opcja wyszukująca tekst o podobnym formatowaniu, ale... zaznaczy nam również nazwy własne. Sytuacja wydaje się beznadziejna, ale jest rozwiązanie.

Rozwiązaniem są definicje stylów. Definiujemy styl, nadajemy mu swoją nazwę, a następnie wykorzystujemy go.

Pewną analogią jest tutaj zewnętrzna definicja CSS w HTML. Można przypisywać ten sam styl każdemu elementowi z osobna, ale można też stworzyć ogólną definicję dla pewnej klasy obiektów i zamiast powielać atrybuty, połączyć te obiekty z klasą. Jest jeszcze jedna ważna rzecz: zmiana stylu sprowadza się do zmiany jednej definicji. Zmiana lokalnych definicji w każdym elemencie to zmiana we wszystkich tych definicjach po kolei.

Mam nadzieję, że przekonałem co do słuszności stosowania styli globalnych. Zdaję sobie sprawę, że większość już czeka na kod, więc nie przedłużam.

C# i przykład zastosowania globalnych styli Word

Pełny listing programu pokazany jest 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();

            //Definicja pierwszego stylu
            object styleName1 = "NiebieskiePogrubienie";
            Word.Style myStyle1 = wordDocument.Styles.Add(styleName1.ToString());
            myStyle1.Font.Bold = 1;
            myStyle1.Font.Color = Word.WdColor.wdColorBlue;

            //Definicja drugiego stylu
            object styleName2 = "ZielonePochylenie";
            Word.Style myStyle2 = wordDocument.Styles.Add(styleName2.ToString());
            myStyle2.Font.Italic = 1;
            myStyle2.Font.Color = Word.WdColor.wdColorGreen;

            //Styl -inline-
            var selection = wordApplication.Selection;
            selection.Font.StrikeThrough = 1;
            selection.Font.Color = Word.WdColor.wdColorRed;
            selection.TypeText("Linia 1");

            //Wybór pierwszego stylu
            selection.TypeParagraph();
            selection.set_Style(ref styleName1);
            selection.TypeText("Linia 2");

            //Wybór drugiego stylu
            selection.TypeParagraph();
            selection.set_Style(ref styleName2);
            selection.TypeText("Linia 3");

            //Wybór pierwszego stylu
            selection.TypeParagraph();
            selection.set_Style(ref styleName1);
            selection.TypeText("Linia 4");

            //Globalna zmiana pierwszego stylu, wpływa na wszystkie wystąpienia
            Word.Style myStyleDefinition = wordDocument.Styles[styleName1];
            myStyleDefinition.Font.Underline = Word.WdUnderline.wdUnderlineSingle;

            //Alternatywnie, można skorzystać z lokalnej zmiennej
            //myStyle1.Font.Underline = Word.WdUnderline.wdUnderlineSingle;
        }
        finally
        {
            wordApplication.Visible = true;
        }
    }
}

Efekt działania

Kodu jest coraz więcej, ale można już wyróżnić pewne stałe, powtarzające się fragmenty. Wszystko wymaga wprawy, doświadczenia i czasu. Przyjrzyjmy się rezultatowi działania powyższego programu w postaci wycinka dokumentu Word:

Globalne i lokalne style w dokumencie Word
Rys. 1. Globalne i lokalne style w dokumencie Word.

Na początku definiujemy sobie dwa globalne style - NiebieskiePogrubienie i ZielonePochylenie. To prawda, że definicje są nieco bardziej skomplikowane niż przypisanie tych samych atrybutów stylu do konkretnych linii tekstu. Jeżeli mamy pewność, że konkretny styl będzie użyty tylko raz i nie będzie modyfikowany, można pozostawić style lokalne. Jeżeli styl będzie użyty wielokrotnie, lub przewidujemy zmianę, warto stworzyć styl globalny.

W zaprezentowanym programie warto zwrócić uwagę na sposób modyfikacji stylu. Z kolekcji Styles dokumentu pobieramy, po nazwie, stworzoną wcześniej definicję. Taką definicję możemy zmodyfikować, a zmiany zostaną zastosowane we wszystkich miejscach. Przekładając to na pokazany przykład - paragrafy oznaczone stylem NiebieskiePogrubienie zostaną podkreślone. Jeżeli dysponujemy referencją stylu, możemy użyć tej referencji. Wygodniej jest jednak posługiwać się nazwami symbolicznymi.

Podsumowanie

Liczba styli w Word jest ogromna. Nie ma potrzeby pamiętania wszystkich właściwości, bo po pierwsze, jest ich za dużo, a po drugie, najczęsciej korzysta się z kilku, może kilkunastu podstawowych. Pozostałe zawsze można znaleźć w dokumentacji lub odgadnąć po nazwie właściwości w jednym z interfejsów aplikacji Word.

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?