opsec2022
Goto Top

Word Doc in CSharp mit Variablen erstellen o kopieren

Hallo,

Ich habe ein einseitiges Word Dokument als Vorlage. Dieses Enthält Tabellenspalten, welche als Variable übergeben werden sollen. Darunter Name und zwei Felder als Date-range z.B. 20.08.22 und 25.08.22

Mein Code

	var start = Datetimepicker1.SelectedValue
	var end = Datetimepicker2.SelectedValue
	string Vorname = Textbox1.Text
	string Nachname = Textbox2.Text
	List<Object> Weeks = new List<Object> Weeks
	var range = GetWeekdayRange(start,end);
	foreach(var val in range)
		{
			Weeks.Add("{0:yyyy-MM-dd} - {1:yyyy-MM-dd}",val.WeekStartDate,val.WeekEndDate);  
			Application app = new Application();
			Document doc = word.Documents.Add("C:\Users\user\doc.docx");  
			doc.Variables["WocheVon"].Value = {0:yyyy-MM-dd};  
			doc.Variables["WocheBis"].Value = {1:yyyy-MM-dd};  
			doc.Variables["VollerName"].Value = Nachname + "," + " " + Vorname;  
			doc.Fields.Update();
			doc.Save();
			doc.Close();
			app.Quit();	
		}	

Variablen habe ich gefunden.

allerdings möchte ich die Vorlagenseite für val in range dem doc "anfügen" oder in einem neuen Sammeln

z.B. start 15.08.2022, end 02.09.2022

Seite 1 Name, val(15.08.22), val(19.08.22)
Seite 2 Name, val(22.08.22), val(26.08.22)
Seite 3 Name, val(29.08.22),val(02.09.22)

Hat hier evtl. jemand eine Idee?

Gruß

OpSec

Content-ID: 3677889126

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

3479126418
3479126418 17.08.2022 um 10:21:12 Uhr
Goto Top
opsec2022
opsec2022 17.08.2022 um 10:26:09 Uhr
Goto Top

Hallo,

das ist VB, nicht?

Gruß

OpSec
3479126418
3479126418 17.08.2022 aktualisiert um 10:36:49 Uhr
Goto Top
Zitat von @opsec2022:


Hallo,

das ist VB, nicht?

Gruß

OpSec

In c# hast du dann im Endeffekt mit den Interop-Assemblies die selben Eigenschaften zur Verfügung wenn du die Word Referenz dem Projekt hinzufügst. Kannst also die Doku auch für c# mitbenutzen.
opsec2022
opsec2022 17.08.2022 um 10:55:04 Uhr
Goto Top
Zitat von @3479126418:

Zitat von @opsec2022:


Hallo,

das ist VB, nicht?

Gruß

OpSec

In c# hast du dann im Endeffekt mit den Interop-Assemblies die selben Eigenschaften zur Verfügung wenn du die Word Referenz dem Projekt hinzufügst. Kannst also die Doku auch für c# mitbenutzen.

Hallo,

ich kann nicht ganz nachvollziehen was du meinst.
Variablen sind zugewiesen und werden aus Controls übernommen.
Jetzt möchte ich die Template-Datei deklarieren und ein neues Word Doc, für jede WeekDayRange mit dem Template und den entsprechenden Werten "appenden".

Gruß
3479126418
3479126418 17.08.2022 aktualisiert um 11:41:10 Uhr
Goto Top
Joa, und damit das Word Doc weiß wohin dein Inhalt soll erstellst du Bookmarks im Template und sprichst diese Bookmarks aus dem Code an, feddisch.
screenshot
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Visible = true; // only for debugging purpose
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Add(@"C:\template.dotx");  
doc.Bookmarks["MyBookmark"].Range.Text = "Whatever you like";  

Tabellenzeilen kannst du natürlich auch hinzufügen, bsp. für die erste Tabelle im Dokument und drei Spalten mit Inhalt:
Microsoft.Office.Interop.Word.Row newRow = doc.Tables[1].Rows.Add();
newRow.Cells[1].Range.Text = "Andi  Mustermann";  
newRow.Cells[2].Range.Text = "01.01.2022";  
newRow.Cells[3].Range.Text = "05.01.2022";  
opsec2022
Lösung opsec2022 17.08.2022 um 18:40:34 Uhr
Goto Top
Hallo,

ich habe meine Frage zwischenzeitlich überarbeitet. Variablen hatte ich aber von Vorne rein in der Vorlage gesetzt und zugewiesen. Um das ganze abzuschließen:

Date Range
        public struct DateRange
        {
            public DateTime WeekStartDate { get; set; }
            public DateTime WeekEndDate { get; set; }
        }

Wochentage als Range
      public static IEnumerable<DateRange> GetWeekdayRange(DateTime startDate, DateTime endDate, DayOfWeek weekEndsOn = DayOfWeek.Sunday)
        {
            var currStartDate = startDate;
            var currDate = startDate;
            while (currDate < endDate)
            {
                while (currDate.DayOfWeek != weekEndsOn && currDate < endDate)
                {
                    currDate = currDate.AddDays(1);
                }
                yield return new DateRange { WeekStartDate = currStartDate, WeekEndDate = currDate };
                currStartDate = currDate.AddDays(1);
                currDate = currStartDate;
            }
        }

Für jede WeekDayRange, Start- und Enddatum als Value für die Word Variablen und Namenskonvention in der Ausgabe.
foreach (var val in range)
            {
                template.Variables["WocheVon"].Value = @$"{val.WeekStartDate:dd.MM.yy}";  
                template.Variables["WocheBis"].Value = @$"{val.WeekEndDate:dd.MM.yy}";  
                template.Variables["VollerName"].Value = fullName;  
                template.Fields.Update();
                template.SaveAs(root + @${fullName}_{val.WeekStartDate:dd.MM.yy}_{val.WeekEndDate:dd.MM.yy}.docx");  
>

Danke,

Gruß

OpSec