Open xml-ersetzen von text aus word-Datei und Rückkehr Speicher-stream mit MVC
Ich habe eine word-Datei enthält meine angegebenen Muster text {Muster} und ich will, dass solche zu ersetzen, die Muster mit der neuen my-string, der gelesen wurde aus der Datenbank. So habe ich open xml Lesen stream von meiner docx-Vorlage-Datei die ersetzen meine Muster-string dann wieder in Strom, die Unterstützung von download-Datei ohne das erstellen einer temporären Datei. Aber wenn ich öffnete es generiert mir Fehler auf docx-Datei. Unten ist mein Beispiel code
public ActionResult SearchAndReplace(string FilePath)
{
MemoryStream mem = new MemoryStream(System.IO.File.ReadAllBytes(FilePath));
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(mem, true))
{
string docText = null;
using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
docText = sr.ReadToEnd();
}
Regex regexText = new Regex("Hello world!");
docText = regexText.Replace(docText, "Hi Everyone!");
//Instead using this code below to write text back the original file. I write new string back to memory stream and return to a stream download file
//using (StreamWriter sw = new //StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
//{
// sw.Write(docText);
//}
using (StreamWriter sw = new StreamWriter(mem))
{
sw.Write(docText);
}
}
mem.Seek(0, SeekOrigin.Begin);
return File(mem, "application/octet-stream","download.docx"); //Return to download file
}
Bitte machen Sie mir irgendwelche Lösungen statt Lesen einen text aus einer word-Datei und ersetzen Sie die erwarteten Muster-text schreiben Sie dann die Daten zurück auf die ursprüngliche Datei. Gibt es irgendwelche Lösungen ersetzen von text mit WordprocessingDocument Bibliothek? Wie kann ich wieder zur Erinnerung stream mit Validierung docx-Datei-format?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Ansatz, den Sie nehmen, ist nicht richtig. Wenn, durch Zufall, das Muster, das Sie suchen, entspricht einige Open XML-markup, die Sie korrumpieren das Dokument. Wenn der text Sie sind auf der Suche für split über mehrere Läufe, Ihre suchen - /ersetzen-code nicht finden den text und nicht richtig arbeiten. Wenn Sie wollen, suchen und ersetzen von text in ein WordprocessingML-Dokument, es ist ein ziemlich einfacher Algorithmus, die Sie verwenden können:
Charakter. Dies beinhaltet Läufe,
spezielle Zeichen wie ein
Zeilenumbruch, Wagenrücklauf, oder hart
tab.
set von Auflagen, die mit den eingegebenen Zeichen übereinstimmen
in Ihrem Suchbegriff.
dann können Sie Sie ersetzen, die diesem Satz läuft
mit einem neu geschaffenen laufen (die
die Lauf Eigenschaften Lauf
mit dem ersten Zeichen, das
matched the search string).
mit einem neu geschaffenen ausführen, können Sie
dann konsolidieren angrenzenden läuft mit
identisch formatieren.
Ich geschrieben habe, einen blog-post und verzeichnete ein screen-cast, die geht durch dieses Algorithmus.
Blog post: http://openxmldeveloper.org/archive/2011/05/12/148357.aspx
Screen-cast: http://www.youtube.com/watch?v=w128hJUu3GM
-Eric
Schreiben direkt an die word-Dokument-stream wird in der Tat beschädigen.
Sollten Sie stattdessen schreiben, um die
MainDocumentPart
stream, aber zuerst sollten es abschneiden.Es sieht aus wie
MainDocumentPart.FeedData(Stream sourceStream)
- Methode wird genau das tun.Ich habe es noch nicht getestet aber das sollte funktionieren.