2012-04-02 8 views
9

Wenn ich versuche, .doc-Datei mit DocumentFormat.OpenXml DLL zu lesen, gibt es einen Fehler wie "Datei enthält beschädigte Daten."Lesen von .Doc-Datei mit DocumentFormat.OpenXml dll

Diese DLL liest DOCX-Datei richtig.

Kann DocumentFormat.OpenXml dll beim Lesen von .doc-Dateien helfen?

string path = @"D:\Data\Test.doc"; 
string searchKeyWord = @"java"; 

private bool SearchWordIsMatched(string path, string searchKeyWord) 
{ 
    try 
    { 
     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(path, true)) 
     { 
      var text = wordDoc.MainDocumentPart.Document.InnerText; 
      if (text.Contains(searchKeyWord)) 
       return true; 
      else 
       return false; 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

Antwort

2

.doc (Wenn mit einer älteren Version von Microsoft Word erstellt) nicht die gleiche Struktur wie ein .docx (die im Grunde eine Zip-Datei mit einigen XML-Dokumenten ist).

Wenn Ihr .doc ist ‚unzippable‘ (Just benennen Sie die .doc Erweiterung .zip) zu untersuchen, werden Sie manuell die .doc zu einem .docx konvertieren.

13

Die alten .doc-Dateien haben ein völlig anderes Format als die neuen .docx-Dateien. Nein, Sie können die OpenXml-Bibliothek nicht zum Lesen von .doc-Dateien verwenden.

Um dies zu tun, müssten Sie entweder die Dateien zuerst manuell konvertieren, oder Sie müssten anstelle des Open XML SDK, das Sie jetzt verwenden, Office-Interop verwenden.

+0

Dank einen Blick darauf werfen. –

+0

Ja, ich warte auf weitere Antworten. –

+0

Ein Jahr verging. Warte noch. :/ –

5

Ich fürchte, es gibt keine bessere Antwort als die bereits angegebenen. Das Microsoft Word DOC-Format ist binär, während OpenXML-Formate wie DOCX gezippte XML-Dateien sind. Das OpenXml-Framework ist nur für die Arbeit mit dem letzteren Framework geeignet.

Wie vorgeschlagen, die einzige andere Option, die Sie haben, ist Word-Interop oder Third-Party-Bibliothek zu verwenden, um DOC -> DOCX zu konvertieren, die Sie dann mit der OpenXml-Bibliothek arbeiten können.

0

Sie können IFilterTextReader verwenden.

TextReader reader = new FilterReader(path); 
using (reader) 
{ 
    txt = reader.ReadToEnd(); 
} 

Sie können für Ihre Antwort auf http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

+0

Das sieht vielversprechend aus. Können Sie auch einen Link zum Projekt bereitstellen? Und vielleicht eine Erklärung, warum das funktioniert? –

+0

Sorry, mein Englisch ist nicht so gut ... aber Sie könnten einen Blick darauf werfen: http://www.codeproject.com/Articles/13391/Using-IFilter-in-C –