/// <summary>
 /// Saves the DOM into the OpenXML part.
 /// </summary>
 /// <param name="openXmlPart">The part to be saved to.</param>
 public void Save(MailMergeRecipientDataPart openXmlPart)
 {
     base.SaveToPart(openXmlPart);
 }
 /// <summary>
 /// MailMergeRecipients constructor.
 /// </summary>
 /// <param name="ownerPart">The owner part of the MailMergeRecipients.</param>
 internal MailMergeRecipients(MailMergeRecipientDataPart ownerPart)
     : base(ownerPart)
 {
 }
 /// <summary>
 /// Loads the DOM from an OpenXML part.
 /// </summary>
 /// <param name="openXmlPart">The part to be loaded.</param>
 public void Load(MailMergeRecipientDataPart openXmlPart)
 {
     LoadFromPart(openXmlPart);
 }
Beispiel #4
0
        private void Merge(Func <String, String> fieldDataFunc, byte[] sourceBytes, String targetFileName)
        {
            // Open Template
            using (MemoryStream _workingMemoryStream = new MemoryStream()) {
                // Load into memory
                _workingMemoryStream.Write(sourceBytes, 0, sourceBytes.Length);

                using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(_workingMemoryStream, true)) {
                    XElement newBody = XElement.Parse(wordDocument.MainDocumentPart.Document.Body.OuterXml);
                    newBody = MergeReplace(newBody, fieldDataFunc);
                    wordDocument.MainDocumentPart.Document.Body = new Body(newBody.ToString());
                    wordDocument.MainDocumentPart.Document.Save();

                    foreach (HeaderPart x in wordDocument.MainDocumentPart.HeaderParts)
                    {
                        newBody  = XElement.Parse(x.Header.OuterXml);
                        newBody  = MergeReplace(newBody, fieldDataFunc);
                        x.Header = new Header(newBody.ToString());
                        x.Header.Save();
                    }

                    foreach (FooterPart x in wordDocument.MainDocumentPart.FooterParts)
                    {
                        newBody  = XElement.Parse(x.Footer.OuterXml);
                        newBody  = MergeReplace(newBody, fieldDataFunc);
                        x.Footer = new Footer(newBody.ToString());
                        x.Footer.Save();
                    }

                    XElement             settings     = null;
                    DocumentSettingsPart settingsPart = null;
                    if (wordDocument.MainDocumentPart.GetPartsOfType <DocumentSettingsPart>().Count() > 0)
                    {
                        settingsPart = wordDocument.MainDocumentPart.GetPartsOfType <DocumentSettingsPart>().First();
                        if (settingsPart != null)
                        {
                            if (settingsPart.GetPartsOfType <MailMergeRecipientDataPart>().Count() > 0)
                            {
                                MailMergeRecipientDataPart mmrPart = settingsPart.GetPartsOfType <MailMergeRecipientDataPart>().First();
                                settingsPart.DeletePart(mmrPart);
                                // Delete refrence to Mail Merge Data sources
                                settings = XElement.Parse(settingsPart.RootElement.OuterXml);
                            }
                        }
                    }

                    if (settings != null)
                    {
                        IList <XElement> mailMergeElements =
                            (from el in settings.Descendants()
                             where el.Name == (XMLNS + "mailMerge")
                             select el).ToList();

                        foreach (XElement field in mailMergeElements)
                        {
                            field.Remove();
                        }
                    }

                    if (settingsPart != null && settings != null)
                    {
                        settingsPart.RootElement.InnerXml = settings.ToString();
                        settingsPart.RootElement.Save();
                    }

                    // Save in output directory
                    // Create a new document based on updated template
                    using (FileStream fileStream = new FileStream(targetFileName, FileMode.Create)) {
                        _workingMemoryStream.WriteTo(fileStream);
                    }
                }
            }
        }