2012-04-02 4 views
9

Когда я пытаюсь прочитать файл .doc с помощью DocumentFormat.OpenXml dll, он дает ошибку как «Файл содержит поврежденные данные».Чтение .Doc-файла с использованием DocumentFormat.OpenXml dll

Эта DLL правильно считывает .docx-файл.

Может ли DocumentFormat.OpenXml помочь с dll в чтении файла .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; 
    } 
} 

ответ

2

.doc (Если создан с более старой версией Microsoft Word) не имеет такую ​​же структуру, как .docx (который в основном почтовый файл с некоторыми XML-документов).

Если .doc является «unzippable» (Просто переименовать .doc расширение к .zip) зондировать, вам придется вручную преобразовать .doc в .docx.

13

Старые файлы .doc имеют совершенно другой формат из новых файлов .docx. Итак, нет, вы не можете использовать библиотеку OpenXml для чтения файлов .doc.

Для этого вам необходимо сначала вручную преобразовать файлы, или вам понадобится использовать межсетевой офис Office вместо используемого вами Open XML SDK.

+0

Спасибо за ваш ответ может. –

+0

Да, я жду еще нескольких ответов. –

+0

Прошел год. Все еще ждут. :/ –

5

Боюсь, что лучшего ответа не будет, чем те, которые уже даны. Формат Microsoft Word DOC является двоичным, тогда как форматы OpenXML, такие как DOCX, представляют собой zip-файлы XML. Рамка OpenXml предназначена только для работы с последним.

Как и было предложено, единственный вариант, который у вас есть, - использовать Word или стороннюю библиотеку для преобразования DOC -> DOCX, который затем можно использовать с библиотекой OpenXml.

0

Вы можете использовать IFilterTextReader.

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

Вы посмотрите на http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

+0

Это выглядит многообещающе. Можете ли вы предоставить ссылку на проект? И, возможно, объяснение, почему это работает? –

+0

Извините, мой английский не так уж хорош ... но вы можете взглянуть на это: http://www.codeproject.com/Articles/13391/Using-IFilter-in-C –