Spis treści:

Kategoria:C#WordXML


Word - style i kolory, XML

Powtórka z rozrywki

W poprzednim wpisie pokazałem, jak uzyskać proste formatowanie dokumentu Word korzystając z klas Word.Interop i języka C#. Obiecałem też pokazać, jak uzyskać podobny efekt przy pomocy składni XML i jej interpretacji przez Word. Poprzedni wpis można znaleźć tutaj: .Word w C# - Proste style i kolory. Przypomnijmy sobie, jak miał wyględać planowany dokument:

Pochylenie, pogrubienie, podkreślenie i kolor czcionki w dokumencie Word
Rys. 1. Pochylenie, pogrubienie, podkreślenie i kolor czcionki w dokumencie Word.

Dokument nie należy do skomplikowanych, więc narzut spowodowany koniecznością uruchomienia procesu WINWORD.exeWord jest komponentem wykonywalnym. Oznacza to, że jest urochamiany jako całkowicie oddzielny proces, z oddzielną przestrzenią adresową. jest znaczący. Więcej na temat potencjalnych niebezpieczeństw tutaj: Tworzenie dokumentu Word XML w C# - II. Dla takich dokumentów lepsza wydaje się wersja XML. Skąd ta pewność? Wszystko się wyjaśni po obejrzeniu rozwiązania.

Dokument Word z prostymi stylami jako XML

Przyjrzyjmy się przykładowemu plikowi XML, który definiuje pogrubienie, pochylenie i podkreślenie, a także kolory dla poszczególnych cyfr. Został on pokazany, w skórconej formie, poniżej:

<?xml version="1.0"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
  <w:body>
    <w:p>
      <w:r>
        <w:rPr>
          <w:b/>
        </w:rPr>
        <w:t>Linia 1</w:t>
      </w:r>
    </w:p>
    <w:p>
      <w:r>
        <w:rPr>
          <w:i/>
        </w:rPr>
        <w:t>Linia 2</w:t>
      </w:r>
    </w:p>
    <w:p>
      <w:r>
        <w:rPr>
          <w:u w:val="dot-dash"/>
        </w:rPr>
        <w:t>Linia 3</w:t>
      </w:r>
    </w:p>
   
    <w:p>
      <w:r>
        <w:t>0</w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:color w:val="191919"/>
        </w:rPr>
        <w:t>1</w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:color w:val="333333"/>
        </w:rPr>
        <w:t>2</w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:color w:val="4C4C4C"/>
        </w:rPr>
        <w:t>3</w:t>
      </w:r>
      Tutaj analogiczne bloki w:r dla znaków 4-7
      <w:r>
        <w:rPr>
          <w:color w:val="E5E5E5"/>
        </w:rPr>
        <w:t>8</w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:color w:val="FFFFFF"/>
        </w:rPr>
        <w:t>9</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:wordDocument>

Osoby przyzwyczajone do kodu znaczników HTML mogą mieć problem - znane ze stron internetowych znaczniki <b>, <i> i <u> pokrywają się i oznaczają to samo. Poniżej zestawienie styli HTML i odpowiedników Word:

Znacznik HTMLZnacznik WordZnaczenie
bw:bpogrubienie
iw:ipochylenie
uw:upodkreślenieZnacznik Word posiada dodatkowy atrybut definiujący rodzaj podkreślenia. Dostępne są następujące wartości: single, words, double, thick, dotted, dotted-heavy, dash, dashed-heavy, dash-long, dash-long-heavy, dot-dash, dash-dot-heavy, dot-dot-dash, dash-dot-dot-heavy, wave, wavy-heavy, wavy-double i none.

W czym zatem tkwi problem weteranów HTML?

Płaska struktura Word XML

W języku znaczników HTML formatowanie definiuje się poprzez zagnieżdżenia. Aby tekst został pogrubiony, należy otoczyć go parą znaczników <b> i </b>. Word przyjął inną zasadę: bloki z jednolitym formatowaniem umieszczone są w znaczniku w:r (ang. run), a dla tego bloku definiuje się konkretne właściwości (zob. też Tworzenie dokumentu Word XML w C# - II). Te właściwości umieszcza się w znaczniku w:rPr (ang. run properties).

Wśród wielu właściwości, które z czasem, dawkowane, będą się pojawiać, znajduje się atrybut koloru (color). Podaje się go w postaci szesnastkowej, po dwa znaki dla składowych czerwonej, zielonej i niebieskiej. Warto zaznaczyć, że w kodzie C# i modelu COM kolejność barw składowych jest inna! Nie ma co kruszyć kopii o tę drobną niedogodność, bo jedna prosta metoda załatwia całą sprawę. Warto jednak o tym pamiętać.

W pokazanym przykładzie część znaczników w:r została pominięta, bo nie wnoszą one niczego nowego. Wyglądają prawie tak samo jak pozostałe - jedynie kolor jest inny, proporcjonalnie szary do pozycji znaku w tekście.

Taki sam, a jednak inny

Po otworzeniu wskazanego pliku w Word można zauważyć, że wynik nie jest dokładnie taki sam. Co się rzuca w oczy na samym początku? Plik wygenerowany przez komponent wykonywalny COM ma więsze odstępy pomiędzy paragrafami. Skąd te różnice? Czy o czymś zapomnieliśmy? I tak, i nie. Plik tworzony ręcznie, nawet taki, którego jeszcze nie dotknęła ręka natchnionego użytkownika, pragnącego stworzyć coś wielkiego - już ma style! Co więcej, ma mnóstwo atrybutów, których nie potrzebujemy, nawet takich, o których istnieniu 99% użytkowników nie ma pojęcia, nigdy z nich nie korzystało i najprawdopodobnij nigdy nie skorzysta! Wśród tych styli znajdują się domyślne odstępy pomiędzy wierszami. O ile nie usuniemy tych odstępów jawnie, przejmiemy je w spadku. Dokument XML jest tworzony od podstaw i nie zawiera nic oprócz tego, co sami wstawimy.

Podsumowanie

Lista możliwych atrybutów jest długa i będą one w coraz większych ilościach pokazywane. Warto też zapamiętać, że struktura formatowania dokumentu XML odbiega od struktury znaczników stosowanej w dokumentach XML. Płaska struktura pliku Word w postaci XML jest w bliskiej relacji ze sposobem definiowania atrybutów: atrybuty definiuje się dla bloków. Te bloki umieszczane są w znacznikach w:r. Warto wiedzieć, że kolejne linie tekstu to paragrafy, które zawierają dowolną ilość wspomnianych bloków o jednolitym formatowaniu. Zatem, aby włączyć dwa style, wystarczy umieścić w znaczniku w:rPr dwa dowolne znaczniki formatowania. Tekst pogrubiony i pochylony będzie wobec tego osiągalny przy pomocy następującej składni:

<w:p>
  <w:r>
    <w:rPr>
       <w:b/>
       <w:i/>
    </w:rPr>
    <w:t>Linia 1</w:t>
  </w:r>
</w:p>

Te proste zagadnienia omawiane są szczegółowo, ponieważ przyjęte tutaj założenia będą się pojawiały przy okazji wielu innych struktur modelu Word XML. Ta sama płaska struktura będzie miała swoje wpływy na całym obszarze znacznikowej reprezentacji dokumentu. Bez względu na to, czy się nam to podoba, czy nie.

Kategoria:C#WordXML

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?