Using Sharepoint Word Automation to do a text replace

后端 未结 1 1942
一向
一向 2021-01-16 17:26

I am working with sharepoint 2010, what I am trying to do is take a word document template, do a replace on a few key words (ex: replace ##ClientID## with the i

相关标签:
1条回答
  • 2021-01-16 18:07

    It appears that Word Automation Services is not what I want to use to do what I want to do, what I need is Open XML SDK.

    UPDATE: here is the code on how to do a replace on the document, in my the text I wanted to replace where in rich text boxes. so that is why I am looking inside SdtRun.

    public FileDetails GetOrGenerateChecklist(string PracticeName, string ContractID, string EducationDate, string MainContactInfo, string Address)
    {
        if (String.IsNullOrEmpty(PracticeName) || String.IsNullOrEmpty(ContractID))
            return null;
        SPWeb web = SPContext.Current.Web;
    
        SPDocumentLibrary list = (SPDocumentLibrary)web.Lists["Educator Checklists"];
        var templetAddr = String.Concat(web.Url, '/', list.DocumentTemplateUrl);
        SPQuery query = new SPQuery();
        query.Query = string.Concat(
                                "<Where><Eq>",
                                    "<FieldRef Name='FileLeafRef'/>",
                                    "<Value Type='File'>", PracticeName, " - ", ContractID, ".docx</Value>",
                                "</Eq></Where>");
        var items = list.GetItems(query);
    
        //if document exists return existing document.
        if (items.Count > 0)
            return new FileDetails() { Address = String.Concat(web.Url, "/Educator Checklists/", PracticeName, " - ", ContractID, ".docx"), LastModified = (DateTime)items[0]["Modified"]};
    
        //Begin transforming form template to document.
        MemoryStream documentStream;
    
        //copy the stream to memory
        using (Stream tplStream = web.GetFile(templetAddr).OpenBinaryStream())
        {
            documentStream = new MemoryStream((int)tplStream.Length);
            CopyStream(tplStream, documentStream);
            documentStream.Position = 0L;
        }
    
        using (WordprocessingDocument template = WordprocessingDocument.Open(documentStream, true))
        {
            template.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
            MainDocumentPart mainPart = template.MainDocumentPart;
            mainPart.DocumentSettingsPart.AddExternalRelationship(
                "http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate",
                new Uri(templetAddr, UriKind.Absolute));
    
            ReplaceText(mainPart, "#PracticeName#", PracticeName);
            if(!String.IsNullOrEmpty(EducationDate))
                ReplaceText(mainPart, "#EducationDate#", EducationDate);
            if(!String.IsNullOrEmpty(MainContactInfo))
                ReplaceText(mainPart, "#MainContactInfo#", MainContactInfo);
            if(!String.IsNullOrEmpty(Address))
                ReplaceText(mainPart, "#Address#", Address);
        }
        documentStream.Position = 0L;
        try
        {
            list.RootFolder.Files.Add(String.Concat(PracticeName, " - ", ContractID, ".docx"), documentStream);
        }
        catch(SPException)
        {
            return null;
        }
    
        return new FileDetails() { Address = String.Concat(web.Url, "/Educator Checklists/", PracticeName, " - ", ContractID, ".docx"), LastModified = DateTime.Now };
    
    
    }
    
    private static void CopyStream(Stream source, Stream destination, int bufferSize = 0x1000)
    {
        int num;
        byte[] buffer = new byte[bufferSize];
        while ((num = source.Read(buffer, 0, buffer.Length)) != 0)
        {
            destination.Write(buffer, 0, num);
        }
    
    }
    
    private static void ReplaceText(MainDocumentPart docPart, string match, string value)
    {
        if (value == null)
            value = String.Empty;
        var sdtr = docPart.Document.Descendants<SdtRun>();
        foreach (var sdt in sdtr)
        {
            if (sdt.InnerText == match)
            {
    
                Text txt = new Text(value);
                //using the sdt.FirstChild.FirstChild.CloneNode(true) will copy the text formatting of the old text.
                var newtext = new SdtContentRun(new Run(sdt.FirstChild.FirstChild.CloneNode(true), txt));
                sdt.SdtContentRun.RemoveAllChildren();
                sdt.SdtContentRun.InsertAt(newtext, 0);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题