2012-04-02 64 views
9

Cuando intento leer el archivo .doc utilizando DocumentFormat.OpenXml dll, aparece el error "El archivo contiene datos dañados".Lectura del archivo .Doc con DocumentFormat.OpenXml dll

Este dll está leyendo correctamente el archivo .docx.

¿Puede DocumentFormat.OpenXml dll ayudar en la lectura del archivo .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; 
    } 
} 

Respuesta

2

.doc (Si creada con una versión anterior de Microsoft Word) no tiene la misma estructura que un .docx (que es básicamente un archivo zip con algunos documentos XML).

Si su .doc es 'unzippable' (sólo cambiar el nombre de la extensión .doc a .zip) para investigar, usted tiene que convertir manualmente el .doc a un .docx.

13

Los archivos antiguos .doc tienen un formato completamente diferente de los nuevos archivos .docx. Entonces, no, no puede usar la biblioteca OpenXml para leer archivos .doc.

Para hacerlo, primero deberá convertir los archivos manualmente o deberá usar la interoperabilidad de Office, en lugar del Open XML SDK que está utilizando ahora.

+0

Gracias por su respuesta. –

+0

Sí, estoy esperando por más respuestas. –

+0

Pasó un año. Todavía esperando. :/ –

5

Me temo que no habrá una mejor respuesta que las ya dadas. El formato Microsoft Word DOC es binario, mientras que los formatos OpenXML como DOCX son archivos XML comprimidos. El framework OpenXml es para trabajar solo con este último.

Como se sugirió, la única opción que tiene es usar la interoperabilidad de Word o una biblioteca de terceros para convertir DOC -> DOCX, que luego puede trabajar con la biblioteca OpenXml.

0

Puede usar IFilterTextReader.

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

Puede echar un vistazo a http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

+0

Esto parece prometedor. ¿Puedes proporcionar un enlace al proyecto también? Y tal vez una explicación de por qué esto funciona? –

+0

Lo siento, mi inglés no es tan bueno ... pero podrían echar un vistazo a esto: http://www.codeproject.com/Articles/13391/Using-IFilter-in-C –

Cuestiones relacionadas