2012-04-02 57 views
9

Khi tôi đang cố gắng đọc tệp .doc bằng cách sử dụng DocumentFormat.OpenXml dll, lỗi của nó là "Tệp chứa dữ liệu bị hỏng".Đọc .Doc Tệp bằng cách sử dụng DocumentFormat.OpenXml dll

Dll này đang đọc tệp .docx đúng cách.

Có thể DocumentFormat.OpenXml dll trợ giúp đọc tệp .doc không?

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

Trả lời

2

.doc (Nếu tạo ra với phiên bản cũ của Microsoft Word) không có cấu trúc tương tự như một .docx (về cơ bản Đó là một file zip có một số tài liệu XML).

Nếu .doc của bạn là 'unzippable' (Chỉ cần đổi tên phần mở rộng .doc để .zip) để thăm dò, bạn sẽ phải tự chuyển đổi .doc đến một .docx.

13

Các tệp .doc cũ có định dạng hoàn toàn khác với các tệp .docx mới. Vì vậy, không, bạn không thể sử dụng thư viện OpenXml để đọc các tệp .doc.

Để làm điều đó, trước tiên bạn cần phải chuyển đổi tệp theo cách thủ công hoặc bạn cần sử dụng Office interop thay vì Open XML SDK bạn đang sử dụng ngay bây giờ.

+0

Cám ơn câu trả lời của bạn. –

+0

Có, tôi đang chờ đợi một số câu trả lời khác. –

+0

Một năm trôi qua. Vẫn đang đợi. :/ –

5

Tôi e rằng sẽ không có câu trả lời nào tốt hơn câu trả lời đã đưa ra. Định dạng Microsoft Word DOC là nhị phân trong khi các định dạng OpenXML như DOCX được nén các tệp XML. Khung OpenXml chỉ hoạt động với khung công tác sau.

Như được đề xuất, tùy chọn duy nhất khác mà bạn có là sử dụng Word interop hoặc thư viện của bên thứ ba để chuyển đổi DOC -> DOCX mà sau đó bạn có thể làm việc với thư viện OpenXml.

0

Bạn có thể sử dụng IFilterTextReader.

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

Bạn có thể có một cái nhìn tại http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

+0

Điều này có vẻ đầy hứa hẹn. Bạn có thể cung cấp liên kết đến dự án không? Và có lẽ một lời giải thích là tại sao nó hoạt động? –

+0

Xin lỗi, tiếng anh của tôi không tốt ... nhưng bạn có thể xem xét điều này: http://www.codeproject.com/Articles/13391/Using-IFilter-in-C –

Các vấn đề liên quan