Использование Sharepoint Word Automation для замены текста - PullRequest
1 голос
/ 30 марта 2011

Я работаю с sharepoint 2010, я пытаюсь взять шаблон документа Word, заменить несколько ключевых слов (например, заменить ##ClientID## на идентификатор клиента) и сохранить его сконкретное имя в библиотеке на sharepoint.

Я выяснил, как это сделать на локальном компьютере с поддержкой взаимодействия слов, однако библиотека взаимодействия слов не предназначена для запуска в качестве службы.Затем я обнаружил Word Automation Services , которые, кажется, делают то, что мне нужно.Однако каждый пример, который я нахожу в Интернете (в том числе здесь, на SO), это просто «Как преобразовать текстовый документ в xxx», используя пространство имен Microsoft.Office.Word.Server.Conversions.Мне еще предстоит найти пример того, как использовать пространство имен Microsoft.Office.Word.Server.Service для поиска и замены документа.В MSDN очень не хватает того, как использовать классы, и я не знаю, с чего начать его использовать.

Разве невозможно использовать сервисы, чтобы делать то, что я хочу?Если это можно сделать, может кто-нибудь указать мне правильное направление, чтобы делать то, что я хочу сделать?

1 Ответ

3 голосов
/ 30 марта 2011

Похоже, что Word Automation Services - это не то, что я хочу использовать, чтобы делать то, что я хочу, а то, что мне нужно: Open XML SDK .

UPDATE: Вот код о том, как сделать замену в документе, в моем тексте, который я хотел заменить, где в текстовых полях. вот почему я смотрю внутрь 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);
        }
    }
}
...