2015-05-17 3 views
0

Я знаю, что на нем много сообщений, НО ничего не работало для моей проблемы: Im using OPENxml для создания документа Word, и я добавляю некоторые готовые файлы к документу во время создание. Я хочу изменить текст в файле, который я добавляю после того, как документ будет готов. Так вот что я пробовал: Первое создание документа:Поиск и замена текста в OPENXML (добавленный файл)

fileName = HttpContext.Current.Server.MapPath("~/reports/"+fileName+".docx"); 
using (var doc = WordprocessingDocument.Create(
    fileName, WordprocessingDocumentType.Document)) 
{ 
    ///add files and content inside the document 
    addContentFile("template1part1", HttpContext.Current.Server.MapPath("~/templates/template1part1.docx"), mainPart); 
} 

это, как я добавляю файлы:

private static void addContentFile(string id,string path, MainDocumentPart mainPart){ 
    string altChunkId = id; 
    AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
     AlternativeFormatImportPartType.WordprocessingML, altChunkId); 
    using (FileStream fileStream = File.Open(path, FileMode.Open)) 
    { 
     chunk.FeedData(fileStream); 
     fileStream.Close(); 
    } 
    AltChunk altChunk = new AltChunk(); 
    altChunk.Id = altChunkId; 
    mainPart.Document.Body.Append(altChunk); 
    mainPart.Document.Save(); 
} 

И это, как я пытаюсь заменить текст ПОСЛЕ Я создал файл (после того, как я закончил использовать WordprocessingDocument)

Первая попытка:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) 
{ 
    string docText = null; 
    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
     docText = sr.ReadToEnd(); 

    docText = new Regex(findText, RegexOptions.IgnoreCase).Replace(docText, replaceText); 

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

Вторая попытка:

using (WordprocessingDocument doc = 
    WordprocessingDocument.Open(@"yourpath\testdocument.docx", true)) 
    { 
     var body = doc.MainDocumentPart.Document.Body; 
     var paras = body.Elements<Paragraph>(); 

     foreach (var para in paras) 
     { 
      foreach (var run in para.Elements<Run>()) 
      { 
       foreach (var text in run.Elements<Text>()) 
       { 
        if (text.Text.Contains("text-to-replace")) 
        { 
         text.Text = text.Text.Replace("text-to-replace", "replaced-text"); 
        } 
       } 
      } 
     } 
    } 
} 

Ни один из них не работал, и я пробовал гораздо больше. Сработал для текста, который я вручную добавляю в документ, но теперь он работает для текста, который я добавляю из готовых файлов. есть способ сделать это?

+1

Оба эти метода не работают, пока вы не откроете и сохраните созданный документ в MS Word. Когда вы импортируете контент wordML с помощью altChunk, он добавляет документ * как есть * (как внешний контент) в первый документ. На этом этапе созданный документ не содержит ничего, кроме ссылки на этот внешний контент (и нет абзацев, нет прогонов ...) Затем, когда вы открываете созданный документ в MS Word и сохраняете его, MS Word преобразуется добавленный файл в содержимое OpenXml. Не уверен, что лучше всего подходит для ваших нужд. – Chris

ответ

0

Способ добавления файлов использует altchunck s. Но вы пытаетесь заменить вещи так, как будто вы изменяете итоговый документ openxml.

При объединении документов как altchuncks вы в основном добавляете их как встроенные внешние файлы в исходный документ, но не как разметку openxml. Это означает, что вы не можете рассматривать дополнительные прилагаемые документы как документы openxml.

Если вы хотите добиться того, что вы пытаетесь, вы должны объединить документы, как описано в моем ответе здесь, - https://stackoverflow.com/a/18352219/860243, что делает результирующий документ надлежащим документом openxml. Это позволяет вам изменить его позже, как вы пожелаете.