heulendoch
Lt. Junior Grade
- Registriert
- Feb. 2014
- Beiträge
- 260
Hallo zusammen,
vorweg: Leider gibt es einen Grund weshalb ich direkt innerhalb einer Word-Datei manipulieren muss.
Ich habe eine kleine Hilfsklasse die mir die Ersetzung innerhalb eines DOCX-ZIPs ermöglicht. Dazu verwende ich DotNetZip 1.16.0. Nach dem zweiten mal speichern ist allerdings die DOCX angeblich beschädigt.
Folgendes Minimalbeispiel:
Nach dem zweiten Mal speichern erhalte ich folgenden Fehler:
Ich kann einfach nicht nachvollziehen weshalb.. hat jemand die Lösung?
vorweg: Leider gibt es einen Grund weshalb ich direkt innerhalb einer Word-Datei manipulieren muss.
Ich habe eine kleine Hilfsklasse die mir die Ersetzung innerhalb eines DOCX-ZIPs ermöglicht. Dazu verwende ich DotNetZip 1.16.0. Nach dem zweiten mal speichern ist allerdings die DOCX angeblich beschädigt.
Folgendes Minimalbeispiel:
C#:
using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace WordZipChangerTest {
public class Program {
static void Main(string[] args) {
var WordDoc = @"C:\tmp\testreplace.docx";
var ZipChanger = new WordZipChangerModel();
ZipChanger.Replace(WordDoc, (content) => { return content.Replace("Hallo!", "Tschüss!"); });
// Jetzt lässt sich das Dokument noch ohne Probleme öffnen!
Console.ReadKey();
Process.Start("explorer.exe", WordDoc); // Speichert man das geöffnete Word-Dokument hier mit Word wieder gibt es keine Probleme
Console.ReadKey();
ZipChanger.Replace(WordDoc, (content) => { return content.Replace("Tschüss!", "Wieder Hallo!"); });
// Jetzt gibt es einen Fehler beim öffnen des Dokuments sich das Dokument noch ohne Probleme öffnen!
Console.ReadKey();
Process.Start("explorer.exe", WordDoc);
Console.ReadKey();
}
}
public class WordZipChangerModel {
public bool Replace(string wordDocxFile, Func<string, string> replacing, string fileName = "word/document.xml") {
Console.WriteLine($"Dokument bearbeiten \"{wordDocxFile}\" \"{fileName}\"");
var Sw = Stopwatch.StartNew();
var DoneSomething = false;
using (var WordFile = new ZipFile(wordDocxFile)) {
var EntryFile = WordFile.Entries.FirstOrDefault(Current => Current.FileName == fileName);
if (EntryFile != null) {
using (var MemStrD = new MemoryStream()) {
EntryFile.Extract(MemStrD);
var Content = new UTF8Encoding().GetString(MemStrD.GetBuffer(), 0, (int)MemStrD.Length);
var ContentNew = replacing(Content);
DoneSomething = Content != ContentNew;
if (DoneSomething) {
var UpdatedEntry = WordFile.UpdateEntry(EntryFile.FileName, ContentNew, Encoding.UTF8);
}
}
}
if (DoneSomething)
WordFile.Save();
}
Sw.Stop();
if (DoneSomething)
Console.WriteLine($"Erledigt in {Sw.ElapsedMilliseconds} ms");
else
Console.WriteLine($"Nichts erledigt in {Sw.ElapsedMilliseconds} ms");
return DoneSomething;
}
}
}
Nach dem zweiten Mal speichern erhalte ich folgenden Fehler:
Ich kann einfach nicht nachvollziehen weshalb.. hat jemand die Lösung?