20 Vb.Net program generujący dokument Word

Generujemy dokument Word


Kiedyś pisząc program napotkałem problem, chciałem wyeksportować dane zebrane w moim programie do pliku tekstowego jako tzw raport. Jednak ewidentnie nie było to w żaden sposób akceptowalne, dane wyglądały źle, żeby nie powiedzieć tragicznie, nie mogłem ich w żaden sposób sformatować ani nic z nimi zrobić. Szybko jednak doczytałem o sprytnym sposobie wyeksportowania danych do dokumentu Word i nadania im takiego kształtu jaki bym oczekiwał od raportu. Żeby na dobre zacząć coś pisać w kodzie, musimy najpierw dodać referencję do naszego projektu. W moim przypadku jest to Microsoft Word 11.0 Object Library. Znajdziecie ją mniej więcej w tym miejscu:
Wersja biblioteki jaka będzie zależy od wersji zainstalowanego w naszym komputerze MS Office. Zaznaczamy i dodajemy do naszego projektu.
Dzięki temu możemy skorzystać w naszym kodzie z nowych obiektów np:
        Dim oWord As Word.Application ' obiekt aplikacji
        Dim oDoc As Word.Document ' obiekt dokumentu
        Dim oTable As Word.Table ' obiekt tabeli

Mając już zadeklarowane obiekty spróbujmy z nich jakoś skorzystać, zadeklarujmy jeszcze kilka akapitów:
Dim oPara1, oPara2, oPara3 As Word.Paragraph
Tak, tak nie mówiłem wam wcześniej, ale zmienne lub obiekty tego samego typu można deklarować jednocześnie. Powyżej zadeklarowaliśmy 3 akapity jedną komendą. Można też zadeklarować tradycyjnie jak robiliśmy do tej pory np:
        Dim oPara1 As Word.Paragraph
        Dim oPara2 As Word.Paragraph
        Dim oPara3 As Word.Paragraph
Ale czy nie lepiej tak jak pokazałem na początku? to już zależy od was.
Wracając do tematu: Mamy już akapity, ale co to dla nas oznacza? Każdy akapit można z osobna zdefiniować. Dla przykładu weźmiemy sobie akapit pierwszy i wpiszemy do niego kilka linijek tekstu:
        oPara1 = oDoc.Content.Paragraphs.Add
        oPara1.Range.Text = "Dzisiaj mamy piękny dzień." & vbNewLine & _
        "Miłego dnia życzy autor poradnika !" & vbNewLine & _
        "Spotkamy się w następnym dziale !" & vbNewLine & _
        "Powodzenia w zdobywaniu wiedzy !" & vbNewLine & vbNewLine
Na końcu tego akapitu wstawmy kod:
oDoc.SaveAs("C:\Users\yeti\Documents" & "\mój własny dokument.doc") ' oczywiście jako ścieżkę docelową dla pliku ustawiamy naszą rzeczywistą
Dodajmy w całości kod, który do tej pory napisaliśmy do jakiegoś Buttona na formie. Uruchamiamy program, naciskamy przycisk. O, jest ! Udało się! Utworzyliśmy nasz pierwszy dokument, który zapisał się nam na dysku.
To jeszcze nie wszystko, spróbujmy wykorzystać jeszcze nasze pozostałe akapity, napisałem przecież, że można coś w nich zmieniać prawda? ano można, prawie tak samo dużo jak za pomocą prawdziwego Worda. Spójrzmy zatem na kod poniżej:
        oPara2 = oDoc.Content.Paragraphs.Add
        oPara2.Range.Font.Size = 14
        oPara2.Range.Font.Bold = True
        oPara2.Range.Font.Shadow = True
        oPara2.Range.Text = "Dzisiaj mamy piękny dzień." & vbNewLine & _
        "Miłego dnia życzy autor poradnika !" & vbNewLine & _
        "Spotkamy się w następnym dziale !" & vbNewLine & _
        "Powodzenia w zdobywaniu wiedzy !" & vbNewLine & vbNewLine
Co się zmieniło ? widać na pierwszy rzut oka, dla całego akapitu ustawiliśmy większą czcionkę, została pogrubiona i dodatkowo otrzymała cień. Co jeszcze? Co to jest VbNewLine ? ta funkcja mówi sama za siebie, przerzuca wszystko co jest za nią do nowej linii. Zamiast funkcji VbNewLine Można użyć równie dobrze VBCrLf, działa podobnie, zdecydowanie jednak łatwiej zapamiętać i używać VbNewLine.

Dobrze, przejdźmy jeszcze do tabeli. Za pomocą kodu możemy utworzyć w naszym dokumencie tabelę. Spójrzmy na poniższy kod:
'Definiowanie nowej tabeli
        oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 2, 2)
        'Definiowanie widoczności ramki tabeli
        oTable.Borders.Enable = True
        'Definiowanie wysokości 2 wiersza
        oDoc.Tables(1).Rows(2).Height = 80
        'Formatowanie ramki dla tabeli
        oDoc.Tables(1).Rows().Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleEngrave3D
        'Definiowanie zawartości 1 i 2 wiersza 1 i 2 kolumny wraz z formatowaniem
        With oWord.ActiveDocument.Tables.Item(1).Cell(1, 1).Range
            .Text = "Nr"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(1, 2).Range
            .Text = "Dane"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(2, 1).Range
            .Text = "1." & vbNewLine & "2." & vbNewLine & "3."
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(2, 2).Range
            .Text = "Marek" & vbNewLine & "Andrzej" & vbNewLine & "Grzegorz"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
Stworzyliśmy tabelę 2 kolumny i 2 wiersze, nadaliśmy jej kształt, wstawiliśmy do niej dane.


Poniżej pełny kod, który można sobie wkleić do własnego buttona na formie:
        'Deklaracje zmiennych dla worda
        Dim oWord As Word.Application
        Dim oDoc As Word.Document
        Dim oTable As Word.Table

        'Deklaracje zdefiniowanych akapitów
        Dim oPara1 As Word.Paragraph
        Dim oPara2 As Word.Paragraph
        Dim oPara3 As Word.Paragraph

        ' Definiowanie podstawowych stylów formatowania (interlinia, odstępy między wierszami), widoczności
        oWord = CreateObject("Word.Application")
        oWord.Visible = True
        oDoc = oWord.Documents.Add
        oDoc.Paragraphs.LineSpacingRule = Word.WdLineSpacing.wdLineSpaceSingle
        oDoc.Paragraphs.SpaceAfter = 0
        oDoc.Paragraphs.SpaceBefore = 0

        ' Formatowanie tekstu oraz importowanie danych w nowe sformatowane akapity
        oPara1 = oDoc.Content.Paragraphs.Add
        oPara1.Range.Text = "Dzisiaj mamy piękny dzień." & vbNewLine & _
        "Miłego dnia życzy autor poradnika !" & vbNewLine & _
        "Spotkamy się w następnym dziale !" & vbNewLine & _
        "Powodzenia w zdobywaniu wiedzy !" & vbNewLine & vbNewLine

        oPara2 = oDoc.Content.Paragraphs.Add
        oPara2.Range.Font.Size = 14
        oPara2.Range.Font.Bold = True
        oPara2.Range.Font.Shadow = True
        oPara2.Range.Text = "Dzisiaj mamy piękny dzień." & vbNewLine & _
        "Miłego dnia życzy autor poradnika !" & vbNewLine & _
        "Spotkamy się w następnym dziale !" & vbNewLine & _
        "Powodzenia w zdobywaniu wiedzy !" & vbNewLine & vbNewLine

        oPara3 = oDoc.Content.Paragraphs.Add
        oPara3.Range.Font.Color = Word.WdColor.wdColorBlue
        oPara3.Range.Font.Underline = Word.WdUnderline.wdUnderlineDashLongHeavy
        oPara3.Range.Text = "Dzisiaj mamy piękny dzień." & vbNewLine & _
        "Miłego dnia życzy autor poradnika !" & vbNewLine & _
        "Spotkamy się w następnym dziale !" & vbNewLine & _
        "Powodzenia w zdobywaniu wiedzy !" & vbNewLine & vbNewLine

        'Definiowanie nowej tabeli
        oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 2, 2)
        'Definiowanie widoczności ramki tabeli
        oTable.Borders.Enable = True
        'Definiowanie wysokości 2 wiersza
        oDoc.Tables(1).Rows(2).Height = 80
        'Formatowanie ramki dla tabeli
        oDoc.Tables(1).Rows().Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleEngrave3D
        'Definiowanie zawartości 1 i 2 wiersza 1 i 2 kolumny wraz z formatowaniem
        With oWord.ActiveDocument.Tables.Item(1).Cell(1, 1).Range
            .Text = "Nr"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(1, 2).Range
            .Text = "Dane"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(2, 1).Range
            .Text = "1." & vbNewLine & "2." & vbNewLine & "3."
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With
        With oWord.ActiveDocument.Tables.Item(1).Cell(2, 2).Range
            .Text = "Marek" & vbNewLine & "Andrzej" & vbNewLine & "Grzegorz"
            .ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
            .FormattedText.Font.Bold = True
            .FormattedText.Font.Size = 11
        End With

        'Zapytanie o zapis pliku
        Dim path As String = "C:\Users\yeti\Documents"
        Dim result As DialogResult = MessageBox.Show("czy chcesz zapisać plik w ścieżce: " & vbNewLine & path, "Zapisywanie pliku", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If result = Windows.Forms.DialogResult.Yes Then
            oDoc.SaveAs(path & "\mój własny dokument.doc")
        ElseIf result = Windows.Forms.DialogResult.No Then
        Else
        End If
    End Sub

Dziękuję za uwagę i zapraszam do następnego poradnika, który pojawi się wkrótce.



Utworzono 02.10.2015r

Brak komentarzy:

Prześlij komentarz