YASR - еще один вопрос поиска и замены - PullRequest
3 голосов
/ 12 марта 2011

Среда: asp.net c # openxml

Хорошо, я читал тонну фрагментов и пытался воссоздать колесо, но я надеюсь, что сомоне поможет мне быстрее добраться до цели. У меня есть несколько документов, которые мне нужно объединить ... проверить ... Я могу сделать это с OpenXML SDK. Птицы поют, солнце до сих пор светит. Теперь, когда у меня есть документ так, как я хочу, мне нужно искать и заменять текст и / или элементы управления контентом.

Я попытался использовать свой собственный текст - {замените это}, но когда я смотрю на xml (переименуйте docx в zip и просмотрите файл), {не находится рядом с текстом. Поэтому мне либо нужно знать, как защитить это внутри элемента, чтобы они не расходились, либо мне нужно найти другой способ поиска и замены.

Я могу искать / заменять, если это XML-файл, но потом я возвращаюсь к тому, что не могу легко комбинировать элементы.

Код ниже ... и как я уже говорил ... слияние документов работает нормально ... просто нужно заменить вещи.

* Обновление * изменил мой вызов замены, чтобы идти после тега вместо регулярного выражения. У меня сейчас правильная информация, но вызов .Replace, похоже, не работает. Последние четыре строки предназначены для проверки того, что я вижу правильное содержимое тега. Я просто хочу заменить это содержимое сейчас.

    protected void exeProcessTheDoc(object sender, EventArgs e)
    {
        string doc1 = Server.MapPath("~/Templates/doc1.docx");
        string doc2 = Server.MapPath("~/Templates/doc2.docx");
        string final_doc = Server.MapPath("~/Templates/extFinal.docx");

        File.Delete(final_doc);
        File.Copy(doc1, final_doc);

        using (WordprocessingDocument myDoc = WordprocessingDocument.Open(final_doc, true))
        {
            string altChunkId = "AltChunkId2";

            MainDocumentPart mainPart = myDoc.MainDocumentPart;
            AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
            AlternativeFormatImportPartType.WordprocessingML, altChunkId);
            using (FileStream fileStream = File.Open(doc2, FileMode.Open))
            chunk.FeedData(fileStream);
            AltChunk altChunk = new AltChunk();
            altChunk.Id = altChunkId;
            mainPart.Document.Body.InsertAfter(altChunk, mainPart.Document.Body.Elements<Paragraph>().Last());
            mainPart.Document.Save();
        }
        exeSearchReplace(final_doc);
    }

    public static void GetPropertyFromDocument(string document, string outdoc)
    {
        XmlDocument xmlProperties = new XmlDocument();

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
        {
            ExtendedFilePropertiesPart appPart = wordDoc.ExtendedFilePropertiesPart;

            xmlProperties.Load(appPart.GetStream());
        }
        XmlNodeList chars = xmlProperties.GetElementsByTagName("Company");
        chars.Item(0).InnerText.Replace("{ClientName}", "Penn Inc.");

        StreamWriter sw;
        sw = File.CreateText(outdoc);
        sw.WriteLine(chars.Item(0).InnerText);
        sw.Close();
     }    
}

}

Ответы [ 2 ]

1 голос
/ 15 мая 2011

Если вы хотите искать и заменять текст в документе WordprocessingML, существует довольно простой алгоритм, который вы можете использовать:

  • Разбить все серии на отдельные символы.Это включает в себя прогоны, которые имеют специальные символы, такие как разрыв строки, возврат каретки или жесткая табуляция.
  • Тогда довольно легко найти набор прогонов, которые соответствуют символам в строке поиска.
  • Как только вы определили набор прогонов, которые соответствуют, вы можете заменить этот набор прогонов на вновь созданный прогон (в котором есть свойства прогона, содержащие первый символ, соответствующий строке поиска).
  • После замены односимвольных прогонов на вновь созданный прогон вы можете затем объединить смежные прогоны с идентичным форматированием.

Я написал сообщение в блоге и записал скриншот, проходящий черезэтот алгоритм.

Сообщение в блоге: http://openxmldeveloper.org/archive/2011/05/12/148357.aspx
Снимок экрана: http://www.youtube.com/watch?v=w128hJUu3GM

-Eric

1 голос
/ 14 марта 2011

Если я правильно читаю, у вас есть что-то вроде "{replace me}" в .docx, а затем, когда вы просматриваете XML, вы обнаруживаете что-то вроде <t>{replace</t><t> me</><t>}</t> или что-то подобное.Теперь, с подобным XML, невозможно создать подпрограмму, которая заменит «{replace me}».

Если это так, то это очень, очень вероятно, связано с тем, что это считается ошибкой проверки,то есть это неправильно написано, что касается Word.Причина в том, что вы открыли документ в Word и включили проверку.Таким образом, текст помечается как «isDirty» и разбивается на разные серии.

Существует два способа исправить это:

  1. На стороне клиента.В Word просто убедитесь, что все ошибки проверки корректируются или игнорируются.
  2. Формат-сторона.Используйте инструмент MarkupSimplifier , который является частью Power Tool редактора пакетов XML для Visual Studio 2010, чтобы исправить это за пределами клиента.У Эрика Уайта есть отличная (и своевременная для вас - всего несколько дней) запись здесь: Начало работы с Open XML Упрощенный разметка PowerTools
...