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-Key: 3677889126

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

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 3479126418
3479126418 Aug 17, 2022 at 08:21:12 (UTC)
Goto Top
Member: opsec2022
opsec2022 Aug 17, 2022 at 08:26:09 (UTC)
Goto Top

Hallo,

das ist VB, nicht?

Gruß

OpSec
Mitglied: 3479126418
3479126418 Aug 17, 2022 updated at 08:36:49 (UTC)
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.
Member: opsec2022
opsec2022 Aug 17, 2022 at 08:55:04 (UTC)
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ß
Mitglied: 3479126418
3479126418 Aug 17, 2022 updated at 09:41:10 (UTC)
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";  
Member: opsec2022
Solution opsec2022 Aug 17, 2022 at 16:40:34 (UTC)
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