2012-04-02 9 views
9

Quando si tenta di leggere il file .doc utilizzando DocumentFormat.OpenXml dll il suo errore di assegnazione come "File contiene dati danneggiati".Lettura del file .doc tramite DocumentFormat.OpenXml dll

Questa DLL sta leggendo correttamente il file .docx.

Può DocumentFormat.OpenXml dll aiutare nella lettura del file .doc?

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; 
    } 
} 

risposta

2

.doc (se creato con una versione precedente di Microsoft Word) non si ha la stessa struttura di un .docx (che è fondamentalmente un file zip con alcuni documenti XML).

Se il .doc è 'unzippable' (Basta rinominare l'estensione a .doc.zip) per sondare, dovrete convertire manualmente il .doc ad un .docx.

13

I vecchi file .doc hanno un formato completamente diverso dai nuovi file .docx. Quindi no, non è possibile utilizzare la libreria OpenXml per leggere i file .doc.

Per fare ciò, è necessario convertire i file manualmente, oppure è necessario utilizzare l'interoperabilità di Office, anziché l'SDK Open XML che si sta utilizzando ora.

+0

Grazie per la risposta. –

+0

Sì, sto aspettando altre risposte. –

+0

Un anno passato. Sto ancora aspettando :/ –

5

Temo che non ci sarà una risposta migliore di quelle già fornite. Il formato Microsoft Word DOC è binario mentre i formati OpenXML come DOCX sono file XML compressi. Il framework OpenXml è per lavorare solo con quest'ultimo.

Come suggerito, l'unica altra opzione disponibile è l'utilizzo di Word interop o di una libreria di terze parti per convertire DOC -> DOCX che è possibile quindi utilizzare con la libreria OpenXml.

0

È possibile utilizzare IFilterTextReader.

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

È possibile dare un'occhiata a http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

+0

Sembra promettente. Potete fornire anche un collegamento al progetto? E forse una spiegazione del perché questo funziona? –

+0

Scusate, il mio inglese non è buono ... ma potete dare un'occhiata a questo: http://www.codeproject.com/Articles/13391/Using-IFilter-in-C –