Hallo Community,
ich arbeite derzeit an einem Projekt, bei dem ich Platzhalter in einem Word-Dokument (Form4) durch Werte aus einer Windows Forms-Anwendung mit C#-Code ersetzen muss. Leider funktioniert mein Code nicht wie erwartet, und ich benötige dringend Hilfe.
Das komische daran ist, dass einige Platzhalter tatsächlich ersetzt werden, aber nur die hier nicht:
[name]
[straße]
[stadt]
[anfang]
[angebotsnummer]
[baustellename]
[angebotsdatum]
[steuer]
[footer]
[iban] und [bic]
Aber alles andere funktioniert?
Quellcode:
Spoiler anzeigen
Zur Sicherheitshalber hier der code von Form6
Spoiler anzeigen
Ich habe alles versucht, aber diese Platzhalter werden nicht ersetzt, während andere erfolgreich ersetzt werden.
Das Problem ist, dass die Platzhalter im Dokument nicht korrekt bzw. ÜBERHAUPT ersetzt werden!!, obwohl ich sicher bin, dass die Platzhalter im Dokument vorhanden sind. Ich habe auch das Dokument im Anhang hinzugefügt....
Könnte jemand mir bitte bei der Identifizierung des Problems und der Behebung helfen? Ich wäre für jede Unterstützung sehr dankbar.
Vielen Dank im Voraus!
Ach übrigends ich habe auch Platzhalter gesetzt, habe nichts verstanden alles war clean, dann doch alte Methode MsgBox benutzt, tatsächlich nach pos1 etc. springt er zu email platzhalter und o.g. Platzhalter ignoriert er.
Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [✱ Neues Thema] klickt. ~VaporiZed
ich arbeite derzeit an einem Projekt, bei dem ich Platzhalter in einem Word-Dokument (Form4) durch Werte aus einer Windows Forms-Anwendung mit C#-Code ersetzen muss. Leider funktioniert mein Code nicht wie erwartet, und ich benötige dringend Hilfe.
Das komische daran ist, dass einige Platzhalter tatsächlich ersetzt werden, aber nur die hier nicht:
[name]
[straße]
[stadt]
[anfang]
[angebotsnummer]
[baustellename]
[angebotsdatum]
[steuer]
[footer]
[iban] und [bic]
Aber alles andere funktioniert?
Quellcode:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using DocumentFormat.OpenXml.Packaging;
- namespace CansProgramm
- {
- public partial class Form4 : Form
- {
- private string userDocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
- private string basePath = "Cans Rechnungs und Angebots Programm";
- private string templatesPath = "Template";
- private string angebotePath = "Angebote";
- private string settingsFilePath = "Einstellungen\\Informationen.txt";
- public Form4()
- {
- InitializeComponent();
- for (int i = 1; i <= 10; i++)
- {
- TextBox fiyatTextBox = this.Controls.Find("fiyat" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- if (fiyatTextBox != null)
- {
- fiyatTextBox.TextChanged += new EventHandler(FiyatTextBoxes_TextChanged);
- }
- }
- }
- private void FiyatTextBoxes_TextChanged(object sender, EventArgs e)
- {
- for (int i = 1; i < 10; i++)
- {
- TextBox fiyatTextBox = this.Controls.Find("fiyat" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox nextFiyatTextBox = this.Controls.Find("fiyat" + (i + 1) + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox nextAciklamaTextBox = this.Controls.Find("aciklama" + (i + 1) + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox nextStückTextBox = this.Controls.Find("stück" + (i + 1) + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox nextPosTextBox = this.Controls.Find("pos" + (i + 1) + "TxtBox", true).FirstOrDefault() as TextBox;
- if (fiyatTextBox != null && !string.IsNullOrWhiteSpace(fiyatTextBox.Text))
- {
- if (nextFiyatTextBox != null) nextFiyatTextBox.Enabled = true;
- if (nextAciklamaTextBox != null) nextAciklamaTextBox.Enabled = true;
- if (nextStückTextBox != null) nextStückTextBox.Enabled = true;
- if (nextPosTextBox != null) nextPosTextBox.Enabled = true;
- }
- else
- {
- if (nextFiyatTextBox != null) nextFiyatTextBox.Enabled = false;
- if (nextAciklamaTextBox != null) nextAciklamaTextBox.Enabled = false;
- if (nextStückTextBox != null) nextStückTextBox.Enabled = false;
- if (nextPosTextBox != null) nextPosTextBox.Enabled = false;
- }
- }
- }
- private void label6_Click(object sender, EventArgs e)
- {
- }
- private void fullsaveBtn_Click(object sender, EventArgs e)
- {
- string angebotPath = Path.Combine(userDocumentsPath, basePath, angebotePath, angebotsnummerTxtBox.Text + ".docx");
- string angebotTemplatePath = Path.Combine(userDocumentsPath, basePath, templatesPath, "Angebot.docx");
- CreateDocumentFromTemplate(angebotTemplatePath, angebotPath);
- }
- private void Form4_Load(object sender, EventArgs e)
- {
- string angebotTemplatePath = Path.Combine(userDocumentsPath, basePath, templatesPath, "Angebot.docx");
- string rechnungTemplatePath = Path.Combine(userDocumentsPath, basePath, templatesPath, "Rechnung.docx");
- if (!File.Exists(angebotTemplatePath) || !File.Exists(rechnungTemplatePath))
- {
- MessageBox.Show("Die erforderlichen Vorlagendateien 'Angebot.docx' und 'Rechnung.docx' wurden nicht im Template-Ordner gefunden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
- this.Close();
- }
- }
- private void CreateDocumentFromTemplate(string templatePath, string newFilePath)
- {
- try
- {
- File.Copy(templatePath, newFilePath, true);
- using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(newFilePath, true))
- {
- ReplaceWordPlaceholders(wordDoc);
- ReplaceInformationFromSettings(wordDoc);
- wordDoc.Save();
- }
- MessageBox.Show("Das Dokument wurde erfolgreich erstellt und unter '" + newFilePath + "' gespeichert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- catch (Exception ex)
- {
- MessageBox.Show("Fehler beim Erstellen des Dokuments: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- private void ReplaceWordPlaceholders(WordprocessingDocument wordDoc)
- {
- ReplaceWordPlaceholder(wordDoc, "[firmenname]", firmennameTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[name]", nameTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[straße]", straßeTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[stadt]", stadtTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[baustellenname]", bauTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[angebotsnummer]", angebotsnummerTxtBox.Text);
- ReplaceWordPlaceholder(wordDoc, "[angebotsdatum]", DateTime.Now.ToString("dd.MM.yyyy"));
- for (int i = 1; i <= 10; i++)
- {
- TextBox posTextBox = this.Controls.Find("pos" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox aciklamaTextBox = this.Controls.Find("aciklama" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox stückTextBox = this.Controls.Find("stück" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- TextBox fiyatTextBox = this.Controls.Find("fiyat" + i + "TxtBox", true).FirstOrDefault() as TextBox;
- ReplaceWordPlaceholder(wordDoc, "[pos" + i + "]", posTextBox?.Text ?? "");
- ReplaceWordPlaceholder(wordDoc, "[beschreibung" + i + "]", aciklamaTextBox?.Text ?? "");
- ReplaceWordPlaceholder(wordDoc, "[stück" + i + "]", stückTextBox?.Text ?? "");
- ReplaceWordPlaceholder(wordDoc, "[preis" + i + "]", fiyatTextBox?.Text ?? "");
- }
- }
- private void ReplaceInformationFromSettings(WordprocessingDocument wordDoc)
- {
- string settingsPath = Path.Combine(userDocumentsPath, basePath, settingsFilePath);
- if (File.Exists(settingsPath))
- {
- string[] lines = File.ReadAllLines(settingsPath);
- if (lines.Length > 0) ReplaceWordPlaceholder(wordDoc, "[inhaberunternehmen]", lines[0]);
- if (lines.Length > 1) ReplaceWordPlaceholder(wordDoc, "[inhabername]", lines[1]);
- if (lines.Length > 2) ReplaceWordPlaceholder(wordDoc, "[inhaberstraße]", lines[2]);
- if (lines.Length > 3) ReplaceWordPlaceholder(wordDoc, "[steuer]", lines[3]);
- if (lines.Length > 4) ReplaceWordPlaceholder(wordDoc, "[inhabertelefon]", lines[4]);
- if (lines.Length > 5) ReplaceWordPlaceholder(wordDoc, "[inhaberemail]", lines[5]);
- if (lines.Length > 6) ReplaceWordPlaceholder(wordDoc, "[iban]", lines[6]);
- if (lines.Length > 7) ReplaceWordPlaceholder(wordDoc, "[bic]", lines[7]);
- if (lines.Length > 8) ReplaceWordPlaceholder(wordDoc, "[inhaberstadt]", lines[8]);
- if (lines.Length > 9) ReplaceWordPlaceholder(wordDoc, "[footer]", lines[9]);
- string angebotInfoPath = Path.Combine(userDocumentsPath, basePath, "Einstellungen", "Angebot.txt");
- if (File.Exists(angebotInfoPath))
- {
- string angebotInfo = File.ReadAllText(angebotInfoPath);
- ReplaceWordPlaceholder(wordDoc, "[anfang]", angebotInfo);
- }
- }
- else
- {
- MessageBox.Show("Die Einstellungsdatei 'Informationen.txt' wurde nicht gefunden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- private void ReplaceWordPlaceholder(WordprocessingDocument wordDoc, string placeholder, string replacement)
- {
- ReplaceWordPlaceholderInPart(wordDoc.MainDocumentPart, placeholder, replacement);
- foreach (var headerPart in wordDoc.MainDocumentPart.HeaderParts)
- {
- ReplaceWordPlaceholderInPart(headerPart, placeholder, replacement);
- }
- foreach (var footerPart in wordDoc.MainDocumentPart.FooterParts)
- {
- ReplaceWordPlaceholderInPart(footerPart, placeholder, replacement);
- }
- foreach (var text in wordDoc.MainDocumentPart.Document.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>())
- {
- if (text.Text.Contains(placeholder))
- {
- text.Text = text.Text.Replace(placeholder, replacement);
- }
- }
- }
- private void ReplaceWordPlaceholderInPart(OpenXmlPart part, string placeholder, string replacement)
- {
- var textsToReplace = new List<DocumentFormat.OpenXml.Wordprocessing.Text>();
- foreach (var text in part.RootElement.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>())
- {
- if (text.Text.Contains(placeholder))
- {
- textsToReplace.Add(text);
- }
- }
- foreach (var text in textsToReplace)
- {
- text.Text = text.Text.Replace(placeholder, replacement);
- }
- }
- }
- }
Zur Sicherheitshalber hier der code von Form6
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.IO;
- namespace CansProgramm
- {
- public partial class Form6 : Form
- {
- private string userDocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
- private string basePath = "Cans Rechnungs und Angebots Programm";
- private string settingsFilePath = "Einstellungen\\Informationen.txt";
- public Form6()
- {
- InitializeComponent();
- }
- private void LoadSettings(string filePath)
- {
- string angebotFilePath = Path.Combine(userDocumentsPath, basePath, "Einstellungen", "angebot.txt");
- string rechnungFilePath = Path.Combine(userDocumentsPath, basePath, "Einstellungen", "rechnung.txt");
- if (File.Exists(filePath))
- {
- string[] lines = File.ReadAllLines(filePath);
- // Laden der Einstellungen in die Textboxen, wenn vorhanden
- if (lines.Length >= 9)
- {
- firmennameTxtBox.Text = lines[0];
- nameTxtBox.Text = lines[1];
- straßeTxtBox.Text = lines[2];
- steuernummerTxtBox.Text = lines[3];
- telefonnummerTxtBox.Text = lines[4];
- emailTxtBox.Text = lines[5];
- ibanTxtBox.Text = lines[6];
- bicTxtBox.Text = lines[7];
- stadtTxtBox.Text = lines[8];
- footerTxtBox.Text = lines[9];
- }
- else
- {
- MessageBox.Show("Einige oder alle Einstellungen fehlen in 'Informationen.txt'.");
- }
- }
- else
- {
- MessageBox.Show("Keine Einstellungen in 'Informationen.txt' gespeichert.");
- }
- // Laden der Inhalte der RichTextBoxen
- LoadRichTextBoxContent(angebotFilePath, angebotmailRichTxtBox);
- LoadRichTextBoxContent(rechnungFilePath, rechnungRichTxtBox);
- }
- private void Form6_Load(object sender, EventArgs e)
- {
- string fullPath = Path.Combine(userDocumentsPath, basePath);
- // Erstellen der benötigten Ordner
- CreateDirectoryIfNotExists(fullPath, "Einstellungen");
- CreateDirectoryIfNotExists(fullPath, "Angebote");
- CreateDirectoryIfNotExists(fullPath, "Rechnungen");
- CreateDirectoryIfNotExists(fullPath, "Template"); // Überprüfung und Erstellung des "Template"-Ordners
- // Überprüfen und Laden der Einstellungen
- LoadSettings(Path.Combine(fullPath, settingsFilePath));
- }
- private void CreateDirectoryIfNotExists(string basePath, string folderName)
- {
- string path = Path.Combine(basePath, folderName);
- if (!Directory.Exists(path))
- {
- Directory.CreateDirectory(path);
- }
- }
- private void LoadRichTextBoxContent(string filePath, RichTextBox richTextBox)
- {
- if (File.Exists(filePath))
- {
- richTextBox.Text = File.ReadAllText(filePath);
- }
- }
- private void speichernBtn_Click(object sender, EventArgs e)
- {
- try
- {
- string[] lines = {
- firmennameTxtBox.Text,
- nameTxtBox.Text,
- straßeTxtBox.Text,
- steuernummerTxtBox.Text,
- telefonnummerTxtBox.Text,
- emailTxtBox.Text,
- ibanTxtBox.Text,
- bicTxtBox.Text,
- stadtTxtBox.Text,
- footerTxtBox.Text
- // Die RichTextBox-Inhalte werden nicht mehr hier gespeichert
- };
- // Speichern der grundlegenden Einstellungen
- File.WriteAllLines(Path.Combine(userDocumentsPath, basePath, settingsFilePath), lines);
- // Speichern der Inhalte der RichTextBoxen in separaten Dateien
- File.WriteAllText(Path.Combine(userDocumentsPath, basePath, "Einstellungen", "angebot.txt"), angebotmailRichTxtBox.Text);
- File.WriteAllText(Path.Combine(userDocumentsPath, basePath, "Einstellungen", "rechnung.txt"), rechnungRichTxtBox.Text);
- MessageBox.Show("Einstellungen erfolgreich gespeichert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- catch (Exception ex)
- {
- MessageBox.Show("Fehler beim Speichern der Einstellungen: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
- }
Ich habe alles versucht, aber diese Platzhalter werden nicht ersetzt, während andere erfolgreich ersetzt werden.
Das Problem ist, dass die Platzhalter im Dokument nicht korrekt bzw. ÜBERHAUPT ersetzt werden!!, obwohl ich sicher bin, dass die Platzhalter im Dokument vorhanden sind. Ich habe auch das Dokument im Anhang hinzugefügt....
Könnte jemand mir bitte bei der Identifizierung des Problems und der Behebung helfen? Ich wäre für jede Unterstützung sehr dankbar.
Vielen Dank im Voraus!
Ach übrigends ich habe auch Platzhalter gesetzt, habe nichts verstanden alles war clean, dann doch alte Methode MsgBox benutzt, tatsächlich nach pos1 etc. springt er zu email platzhalter und o.g. Platzhalter ignoriert er.
Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [✱ Neues Thema] klickt. ~VaporiZed
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()