stefanseiner
Goto Top

Batch um Word-Datei für 365 Tage zu erstellen mit Datum als Dateiname und Inhalt

Hallo zusammen,

wir brauchen in der Firma jedes Jahr als Protokollvorlage je eine Worddatei pro Tag mit
- Dateiname = 01 , 02, 03 ... 31 (wird dann abgelegt in den Verzeichnissen 01 - 12, also eins pro Monat)
- in der Dokumentenvorlage selbst, 2. Zeile dann nach dem Schema "Mittwoch, 09.06.2021"

Aktuell bastelt da jedes Jahr jemand stunden- / tagelang die einzelnen 365 Word-Dateien vor.

Gibt es da eine Möglichkeit, die Worddateien per Batch entsprechend zu erstellen? Das würde viel Zeit und Nerven sparen.

Danke schonmal im Voraus für eure Hilf
Grüße
Stefan

Content-ID: 667445

Url: https://administrator.de/contentid/667445

Ausgedruckt am: 24.11.2024 um 05:11 Uhr

PeterPanter
PeterPanter 09.06.2021 aktualisiert um 12:43:25 Uhr
Goto Top
PeterPanter
PeterPanter 09.06.2021 um 12:46:21 Uhr
Goto Top
Ups, übersehen:
- in der Dokumentenvorlage selbst, 2. Zeile dann nach dem Schema "Mittwoch, 09.06.2021"
Das vielleicht mit eine Word-Feldfunktion, die an den Dateinamen gekoppelt ist...
chkdsk
chkdsk 09.06.2021 um 12:56:36 Uhr
Goto Top
Moin,

Batch ist für sowas eigentlich nicht geeignet. Probier mal folgendes mit der Powershell.
$oWord = New-Object -Com Word.Application
$oWord.Visible = $true
$oMissing = [System.Reflection.Missing]::Value
$oDoc = $oWord.Documents.Add($oMissing, $oMissing, $oMissing, $oMissing)
$oPara1 = $oDoc.Paragraphs.Add($oMissing)
$oPara1.Range.Text = " "  
$oPara1.Range.InsertParagraphAfter()
$oPara2 = $oDoc.Paragraphs.Add($oMissing)
$date = Get-Date -Format "dddd MM/dd/yyyy"  
$oPara2.Range.Text = "$date"  
$oPara2.Range.InsertParagraphAfter()
$filename = 'C:\temp\YOUR NAME.docx'  
$oDoc.SaveAs($filename,
$oMissing, $oMissing,
$oMissing, $oMissing,
$oMissing, $oMissing,
$oMissing, $oMissing,
$oMissing, $oMissing)
$oDoc.Close()
$oWord.Quit()
Müsstest in Zeile 12 dann nur den entsprechenden Speicherort angeben bzw. für den User eine einfache Abfrage einbauen, wie die Datei heißen soll
Stefanseiner
Stefanseiner 09.06.2021 um 15:35:23 Uhr
Goto Top
cool, danach habe ich zumindest schonmal das Datum in der zweiten Zeile einer Word Datei.
Und wie bekommt man das nun für alle 365 Tage im Vorfeld hin?
Remotedesktopverbindung
Remotedesktopverbindung 09.06.2021 um 16:25:37 Uhr
Goto Top
Servus,

Serienbrief könnte hier Abhilfe verschaffen.
TK1987
TK1987 09.06.2021 aktualisiert um 16:57:55 Uhr
Goto Top
Moin Stefan,

Zitat von @Stefanseiner:
Und wie bekommt man das nun für alle 365 Tage im Vorfeld hin?
Schnellschuss:
# Quellpfad
$Pfad = 'C:\Test'  

# Ordner für einzelne Monate Erzeugen
For ($i=1 ; $i -lt 13 ; $i++) { [void](md -Force ("$Pfad\{0:d2}" -f $i)) }  

# Anfangsdatum 1. Januar
$Date = Get-Date -Day 1 -Month 1

# Folgejahr
$NY = $Date.AddYears(1).Year

# Word Öffnen
$Word = New-Object -Com Word.Application
$Word.DisplayAlerts = $false
$Doc = $Word.Documents.Add()

# Dokumente erzeugen
while ($Date.Year -lt $NY) {
  $Doc.Select()
  $Word.Selection.TypeText(($Date.ToString("`ndddd, \den dd.MM.yyyy")))  
  $Doc.SaveAs(("$Pfad\" + $Date.ToString('MM\\dd') + '.docx'))  
  $Date = $Date.AddDays(1)
}

# Word Beenden
$Doc.Close()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word)

Gruß Thomas
chkdsk
chkdsk 09.06.2021 um 21:19:42 Uhr
Goto Top
Wie genau soll denn der Dateiname aussehen?

Grüße
TK1987
TK1987 09.06.2021 um 21:31:51 Uhr
Goto Top
Moin,

Zitat von @chkdsk:
Wie genau soll denn der Dateiname aussehen?
Steht doch im Eingangspost:
Zitat von @Stefanseiner:
- Dateiname = 01 , 02, 03 ... 31
Hab ich bei meinem Code aber auch alles schon berücksichtigt.

Gruß Thomas
Stefanseiner
Stefanseiner 04.06.2023 um 08:17:16 Uhr
Goto Top
auch wenn der Thread schon etwas her ist möchte ich hier mal anknüpfen.
Der Code von Thomas funktioniert gut, danke nochmals hierfür face-smile

Könnte man den noch irgendwie ergänzen / abändern so dass
- keine leere Word-Datei erzeugt wird sondern ein vorhandenes Word-Dokument als Vorlage benutzt wird? Also im Grunde das Word 365 Mal kopiert mit der Dateinamensgebung wie bereits implementiert, und mit der Datumsangabe in der 2. Zeile wie bereits implementiert.

Das wäre mega!
7010350221
Lösung 7010350221 04.06.2023 aktualisiert um 23:09:12 Uhr
Goto Top
Zitat von @Stefanseiner:
- keine leere Word-Datei erzeugt wird sondern ein vorhandenes Word-Dokument als Vorlage benutzt wird?

Vorlagen benutzt du so
$Doc = $Word.Documents.Add("c:\pfad\vorlage.dotx")  
https://learn.microsoft.com/en-us/office/vba/api/word.documents.add

# Quellpfad
$Pfad = 'C:\Test'  
# Vorlage
$template = 'C:\test\vorlage.dotx'  

# Ordner für einzelne Monate Erzeugen
For ($i=1 ; $i -lt 13 ; $i++) { [void](md -Force ("$Pfad\{0:d2}" -f $i)) }  

# Anfangsdatum 1. Januar
$Date = Get-Date -Day 1 -Month 1

# Folgejahr
$NY = $Date.AddYears(1).Year

# Word Öffnen
$Word = New-Object -Com Word.Application -P @{DisplayAlerts = 0}
$Doc = $Word.Documents.Add($template)

# Dokumente erzeugen
while ($Date.Year -lt $NY) {
  # Datum in Absatz schreiben
  $Doc.Paragraphs[1].Range.Text = $Date.ToString("dddd, \den dd.MM.yyyy`n")  
  # Dokument speichern
  $Doc.SaveAs(("$Pfad\" + $Date.ToString('MM\\dd') + '.docx'))  
  # nächster Tag
  $Date = $Date.AddDays(1)
}

# Word Beenden
$Doc.Close()
# Meldungen auf Standard zurücksetzen
$Word.DisplayAlerts = -1
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word)
Gruß
Stefanseiner
Stefanseiner 04.06.2023 um 12:31:05 Uhr
Goto Top
supergut, mit meiner Testdatei schaut das schonmal prima aus!
Die richtige Vorlage habe ich gerade nicht zur Hand, muss ich auf Arbeit ausprobieren ob das Datum im Dokument an die richtige Stelle gesetzt wird. Melde mich dann wieder zurück face-smile
7010350221
7010350221 04.06.2023 aktualisiert um 15:22:59 Uhr
Goto Top
Man kann auch in der Vorlage ein "Bookmark (Textmarke)" an die gewünschte Position setzen und dann im Code direkt dort das Datum platzieren. Den Wünschen sind hier keine Grenzen gesetzt.
Stefanseiner
Stefanseiner 04.06.2023 um 19:45:13 Uhr
Goto Top
mit dem richtigen Paragraphen habe ich die richtige Stelle "getroffen".
Aber einen kleinen Fehler habe ich gefunden, erstes Dokument passt, im zweiten stehen dann zwei Datumsangaben, im dritten dann drei etc.

Jemand eine Idee, wo der Fehler liegt?
gt
7010350221
7010350221 04.06.2023 um 23:03:20 Uhr
Goto Top
Hab's korrigiert
Stefanseiner
Stefanseiner 05.06.2023 um 07:26:04 Uhr
Goto Top
vielen lieben Dank, so passt alles perfekt face-smile
Das erspart mir in Zukunft viel Arbeit
Stefanseiner
Stefanseiner 06.06.2023 um 14:17:44 Uhr
Goto Top
noch zwei Fragen im Nachgang:
- was muss ich am Code ändern, um die Dokumente für das Folgejahr zu erstellen?
- wie kann ich den oben erwähnten Marker setzen, um das Datum an eine beliebige STelle zu setzen?
TK1987
TK1987 06.06.2023, aktualisiert am 07.06.2023 um 07:30:17 Uhr
Goto Top
Moin,

Zitat von @Stefanseiner:
- was muss ich am Code ändern, um die Dokumente für das Folgejahr zu erstellen?
Einfach beim Anfangsdatum noch das Jahr ergänzen...
# Anfangsdatum 1. Januar
$Date = Get-Date -Day 1 -Month 1 -Year 2024

- wie kann ich den oben erwähnten Marker setzen, um das Datum an eine beliebige Stelle zu setzen?
  • Öffne deine Wordvorlage.
  • Gehe mit dem Cursor zu der Stelle, an der du das Datum platzieren willst.
  • Wähle im Reiter Einfügen Textmarke aus
  • Wähle hinzufügen und vergebe einen beliebigen Namen für deine Textmarke
# Datum an Textmarke schreiben
$Doc.Bookmarks["Textmarkenname"].Range.Text = $Date.ToString("dddd, \den dd.MM.yyyy`n")  

Gruß Thomas
Stefanseiner
Stefanseiner 06.06.2023 um 18:58:11 Uhr
Goto Top
ihr seid der Hammer face-smile