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.ParagraphTak, 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