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.ParagraphAle 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 & vbNewLineNa 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 & vbNewLineCo 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 WithStworzyliś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