Richtextbox exporteren/opslaan in Word document

Status
Niet open voor verdere reacties.

goedlichtJoost

Gebruiker
Lid geworden
7 mrt 2012
Berichten
477
Hallo allemaal,

Ik zou graag de inhoud van een richttextbox willen opslaan in een word document, (het word document moet dan wel een custom indeling en opmaak hebben)

Het word document dient dus enkel "aangevuld" te worden door de richtextbox.

Is dit mogelijk? En zo ja hoe dien ik dit te verwezenlijken?

mvg
Joost
 
Hallo Joost,

Ik ben daar ook wel eens mee bezig geweest, je moet zoeken op RTF (Rich Text Format) en C#. Ik had toen ook plaatjes mee opgeslagen en ik kan me herinneren dat je dan een word document krijgt met allemaal vage codering ipv het plaatje.
Hier heb je misschien wat aan:
http://www.codeproject.com/Articles/11306/NRTFTree-A-class-library-for-RTF-processing-in-C

Het aanpassen van een bestaand word document... Zou kunnen, maar als je bijvoorbeeld een bestaande tabel wilt invullen, dat wordt erg lastig denk ik.

Groeten,

Geert
 
Hallo Geert,

wat ik eigenlijk zoek is het vervangen van een parameter in een worddocument door mijn richtextbox text.
Dus ik heb een geheel opgemaakt worddocument (sjabloon) en hierin staat dan bijvoorbeeld <<tekst1>>
Ik zou iets willen maken wat deze parameter <<tekst1>> vervangt door de inhoud van mijn richtextbox.

Ik zal je link even doorspitten, Bedankt voor je reactie in ieder geval!

gr
Pek
 
Hallo Bloodshed,

Dank voor de reactie, dit werkt prima (al werkt het niet als ik het tussen <<>> zet maar goed)
Ik zou de code:
Code:
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SearchAndReplace(@"C:\Users\erika\Desktop\123.docx");
        }
        // To search and replace content in a document part.
        public static void SearchAndReplace(string document)
        {
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
            {
                string docText = null;
                using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                {
                    docText = sr.ReadToEnd();
                }

                Regex regexText = new Regex("123456");
                docText = regexText.Replace(docText, "Hi Everyone!");

                using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
                {
                    sw.Write(docText);
                }
            }
        }
    }
}

Graag willen aanpassen dat hij een nieuw document maakt, dus eigenlijk het word document als sjabloon opent, invult, en opslaat op zelf te kiezen locatie.
Hierdoor blijft het sjabloon altijd origineel (wanneer deze niet opgeslagen wordt).

Nu heb ik wel een idee hoe ik dit zou moeten doen. (in combinatie met een Save File Dialog) echter weet ik niet hoe dit precies te moeten realiseren.


gr
Joost
 
moet je even de reader en de writer opsplitsen

-data ophalen met de reader
-reader sluiten
-data bewerken
-data wegschrijven

ik kan nu geen voorbeeldje maken, misschien later in de middag
 
Hallo Bloodshed,

Het splitsen even geprobeerd, maar geeft niet gewenste resultaat:

Code:
 private void button1_Click(object sender, EventArgs e)
        {
            SearchAndReplace(@"C:\Users\erika\Desktop\123.docx");
        }
       
        public static void SearchAndReplace(string document)
        {
            string docText = null;
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
            {
                
                using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                {
                    docText = sr.ReadToEnd();
                }

                Regex regexText = new Regex("123456");
                docText = regexText.Replace(docText, "Hi Everyone!");
            }
            Stream mystream;
            SaveFileDialog SFD = new SaveFileDialog();
            SFD.Filter = "wordfiles (*.docx)|*.docx";
            SFD.Title = "kies een locatie om document op te slaan";
             if (SFD.ShowDialog() == DialogResult.OK)
             {
                    if ((mystream = SFD.OpenFile()) != null)
                    {
                        StreamWriter sw = new StreamWriter(mystream);
                        sw.Write(docText);
                        mystream.Close();
                    }
             }
        }

edit: ook het toevoegen van:
Code:
WordprocessingDocument wordDocnew = WordprocessingDocument.Create(mystream,DocumentFormat.OpenXml.WordprocessingDocumentType.Document, true);
haalt niet veel uit helaas




Edit 2:

Ik heb even wat andere tests gedaan en ook de inhoud wordt niet naar wens gekopieerd. Ik heb namelijk een richtextbox met meerdere regels die ik vul aan de hand van string lists.
Met de volgende code:

Code:
richTextBox1.Text = "Overzicht boutenlijst:";
            foreach (string s in Bouten.Opstand)
            {
                richTextBox1.Text = richTextBox1.Text + "\n" + s;
            }
            foreach (string s in Bouten.Onderrand)
            {
                richTextBox1.Text = richTextBox1.Text + "\n" + s;
            }
            foreach (string s in Bouten.OTonderrand)
            {
                richTextBox1.Text = richTextBox1.Text + "\n" + s;
            }
            foreach (string s in Bouten.H501)
            {
                richTextBox1.Text = richTextBox1.Text + "\n" + s;
            }
            foreach (string s in Bouten.OT507501)
            {
                richTextBox1.Text = richTextBox1.Text + "\n" + s;
            }
            richTextBox1.Text = richTextBox1.Text + "\n" + Bouten.extra;

echter wanneer ik deze tekst naar mijn streamwriter stuur dan wordt het 1 lange string en zijn alle enters verwijderd. Hoe kan ik dit oplossen? (System.Environment.NewLine??)

mvg Joost
 
Laatst bewerkt:
Heb even wat geprobeerd en dit werkt:

Code:
private void SaveFile()
{
    const string templateFile = @"C:\Users\Bas\Desktop\template.docx";

    string templateData = null;
    using (var template = WordprocessingDocument.Open(templateFile, true))
    {
        using (var sr = new StreamReader(template.MainDocumentPart.GetStream()))
        {
            templateData = sr.ReadToEnd();
        }
    }

    using (var dlg = new SaveFileDialog())
    {
        dlg.Filter = "Word (*.docx)|*.docx";
        dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

        if (dlg.ShowDialog() == DialogResult.OK)
        {
            using (var doc = WordprocessingDocument.Create(dlg.FileName, WordprocessingDocumentType.Document))
            {
                doc.AddMainDocumentPart();

                using (var writer = new StreamWriter(doc.MainDocumentPart.GetStream()))
                {
                    string replace = templateData.Replace("<<FIRST_NAME>>", txtFirstName.Text).Replace("<<LAST_NAME>>", txtLastName.Text);
                    writer.Write(replace);
                }
            }
        }
    }
}


En ja, Environment.NewLine is de beste optie.... (anders moet je eens \r\n proberen i.p.v. \n alleen)
 
Hallo Bloodshed,

het werkt inderdaad. maar helaas werken de Enters nog niet.
Heb \n, \r\n, Environment.NewLine geprobeerd..

Tevens werkt bij mij ook nog steeds niet << >> maar dit is in principe geen probleem.

edit: Tevens werkt het niet met kop en voetteksten:confused:

gr
Joost
 
Laatst bewerkt:
Je moet even kijken hoe het document is gemaakt. (breakpoint bij het openen/lezen dan kun je de string van readToEnd bekijken)


Hier een voorbeeld van een title paragraaf, content paragraaf en 2x een nieuwe regel. (of je moet het hele document opbouwen in code, dan heb je je template document niet nodig)
Code:
<w:p w:rsidR="00CC0504" w:rsidRDefault="00CC0504" w:rsidP="00CC0504"><w:r><w:t>%TITLE%</w:t></w:r></w:p>
<w:p w:rsidR="00CC0504" w:rsidRPr="00CC0504" w:rsidRDefault="00CC0504" w:rsidP="00CC0504"><w:r><w:t>%CONTENT%</w:t></w:r>
<w:r w:rsidR="00DA678C"><w:br/></w:r>
<w:r w:rsidR="00DA678C"><w:br/></w:r>


als ik deze replace uitvoer krijg is wat extra regels na mijn title
Code:
string replace = templateData.Replace(
                                "<w:r><w:t>%TITLE%</w:t></w:r>",
                                string.Format("<w:r><w:t>{0}</w:t></w:r>{1}{1}{1}", txtFirstName.Text + " " +txtLastName.Text, linebreak));

de linebreak variable:
Code:
const string linebreak = "<w:r w:rsidR=\"00DA678C\"><w:br/></w:r>";

<<TITLE>> werkt ook wel als je dat zou willen in plaats van %TITLE%
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan