Я знаю, что на нем много сообщений, НО ничего не работало для моей проблемы: 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");
}
}
}
}
}
}
Ни один из них не работал, и я пробовал гораздо больше. Сработал для текста, который я вручную добавляю в документ, но теперь он работает для текста, который я добавляю из готовых файлов. есть способ сделать это?
Оба эти метода не работают, пока вы не откроете и сохраните созданный документ в MS Word. Когда вы импортируете контент wordML с помощью altChunk, он добавляет документ * как есть * (как внешний контент) в первый документ. На этом этапе созданный документ не содержит ничего, кроме ссылки на этот внешний контент (и нет абзацев, нет прогонов ...) Затем, когда вы открываете созданный документ в MS Word и сохраняете его, MS Word преобразуется добавленный файл в содержимое OpenXml. Не уверен, что лучше всего подходит для ваших нужд. – Chris