VB Worddokument öffnen, Textmarken und Tabellen verwenden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Zenker.

    VB Worddokument öffnen, Textmarken und Tabellen verwenden

    Hallo, ich bin noch nicht ganz firm mit .Net, muss aber schon loslegen. Bei der Wahl 'Selbstdrucken' oder 'Word macht's', würde ich gerne letzteres nehmen, aber das hakt letztlich doch noch. Vllt. kann mir da jmd. helfen? :saint:

    Ich versuche über einen Wordtext, der als Vorlage dient, Rechnungen zu generieren. Im Prinzip klappt das, aber es gibt ein paar Dinge, die ich gerne verbessern möchte bzw. die ich nicht verstehe.

    1. es dauert ewig, bis das 'Vorlage'-Dokument bereit steht (bei 100 Rechnungen dauert der Vorgang ca. eine Stunde)
    2. die Vorlage enthält 2 Seiten, wobei die zweite Seite die sog. Folgeseite ist, d.h. ab da gibt es z.B. einen Seitenzähler im Dokumenten-Fuß. Der Cursor geht auch nicht auf die zweite Seite, d.h. Leerzeichen, Entercode usw. wurden gelöscht. Dennoch hat jede Rechnung hinterher statt zwei vier Seiten, wobei die Seiten drei und vier leer sind (nur Kopf und Fuß)
    3. Gibt es eine Möglichkeit, Word anzuweisen, die zweite Seite nur dann mitzuspeichern, wenn sie auch befüllt wurde? Da ich die Tabelle 2 beliebig groß werden lasse, obliegt es ja Word für neue Seiten zu sorgen
    4. Wenn etwas schief läuft, ist die Vorlage verändert und gespeichert! Wie geht das denn?
    5. Irgendwie sind die Kopien alle 'geöffnet', d.h. es gibt dann '~$'-Dateien. Vermutlich muss ich die Vorlage vor dem Speichern schließen?!?

    VB.NET-Quellcode

    1. Private Sub WordTest()
    2. Dim wd As New Microsoft.Office.Interop.Word.Application
    3. Dim docVorlage As Microsoft.Office.Interop.Word.Document
    4. Dim ind1 As Integer
    5. Dim ind2 As Integer
    6. '
    7. wd.Visible = False
    8. 'Mache fünf Dokumente
    9. For ind2 = 1 To 5
    10. docVorlage = wd.Documents.Open("C:\Formulare\INVOICE.DOCX")
    11. Dim doc As Microsoft.Office.Interop.Word.Document = docVorlage
    12. doc.Activate()
    13. Try
    14. doc.Bookmarks("DELIVERY_ADDRESS").Range.Text = "Herrn" & vbCrLf & "Emil Schlawiner" & vbCrLf & "Lerchenweg 3" & vbCrLf & vbCrLf & "40000 Düsseldorf"
    15. 'Tabelle 1 oben rechts
    16. Dim Tw As Microsoft.Office.Interop.Word.Table = doc.Tables(1)
    17. Tw.Cell(1, 1).Range.Text = "Ust-Id"
    18. Tw.Cell(1, 2).Range.Text = "DE XXX XXX XXX"
    19. '
    20. Tw.Cell(3, 1).Range.Text = "Bei Zahlung angeben:"
    21. 'Funzt net
    22. Tw.Cell(3, 1).Range.Font.Bold = True
    23. '
    24. Tw.Cell(4, 1).Range.Text = "Rechnungs-Nr."
    25. Tw.Cell(4, 2).Range.Text = "123456789"
    26. Tw.Cell(5, 1).Range.Text = "Datum"
    27. Tw.Cell(5, 2).Range.Text = "12.12.2021"
    28. '
    29. doc.Bookmarks("TYPE_LABEL").Range.Text = "RECHNUNG"
    30. '
    31. 'Jetzt Positionen in zweite Tabelle eintragen
    32. Dim Tw2 As Microsoft.Office.Interop.Word.Table = doc.Tables(2)
    33. Dim Tr2 As Microsoft.Office.Interop.Word.Row
    34. '
    35. Tw2.Cell(1, 1).Range.Text = "Artikel"
    36. Tw2.Cell(1, 2).Range.Text = "Bezeichnung"
    37. Tw2.Cell(1, 3).Range.Text = "Menge"
    38. Tw2.Cell(1, 4).Range.Text = "Preis"
    39. Tw2.Cell(1, 6).Range.Text = "Rabatt"
    40. 'Fülle Tabelle 2 mit 16 Zeilen, genug, um in die Folgeseite hineinzureichen
    41. For ind1 = 0 To 15
    42. Tr2 = Tw2.Rows.Add()
    43. ' Jetzt die Zellen eintragen
    44. Tr2.Cells(1).Range.Text = "123456789"
    45. Tr2.Cells(2).Range.Text = "Sehr langer Beschreibungstext." & vbCrLf & "Autowrap in Word eingestellt, Enter können aber auch vorkommen"
    46. Tr2.Cells(3).Range.Text = "2,0"
    47. Tr2.Cells(4).Range.Text = "200,00"
    48. Tr2.Cells(5).Range.Text = "400,00"
    49. Tr2.Cells(6).Range.Text = "10"
    50. 'Tr2.Cells(7).Range.Text = "360,00"
    51. Next
    52. doc.SaveAs("c:\temp\wdtest\invoice-neu" & ind2 & ".docx")
    53. Catch ex As Exception
    54. MessageBox.Show(ex.ToString)
    55. docVorlage = Nothing
    56. Exit For
    57. End Try
    58. docVorlage = Nothing
    59. Next ip2
    60. wd = Nothing
    61. End Sub
    Was ist eine Word-Vorlage für Dich? Eine normale Word-Datei (*.docx) oder einen richtige Word-Vorlagen-Datei (*.dotx)
    Für die Vorlage gilt dann dieser Code:

    Visual Basic-Quellcode

    1. docVorlage = wd.Documents.Add("C:\Formulare\invoice.doTx")​

    So arbeitest Du immer in einer Kopie der Vorlage.

    In der Vorlage wird zunächst eine zweite Seite angelegt und die Kopf- und Fußzeilen entsprechend definiert. Anschließend wird die zweite Seite wieder gelöst. Nun stehen die Kopf- und Fußzeilen für alle weiteren Seiten zur Verfügung.

    Was Du für Probleme mit den leeren Seiten hast kann ich so nicht erkennen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).