2009-08-18 36 views
5

Tôi muốn tải lên tệp Wordx hoặc tệp docx Word 2007 trở lên lên máy chủ web của mình và chuyển đổi mục lục thành cấu trúc xml đơn giản. Làm điều này trên máy tính để bàn với VBA truyền thống có vẻ như nó sẽ dễ dàng. Nhìn vào dữ liệu XML WordprocessingML được sử dụng để tạo tệp docx là khó hiểu. Có cách nào (không có COM) để điều hướng tài liệu theo nhiều kiểu thời trang hướng đối tượng không?Tôi làm cách nào để truy vấn một tài liệu Word trong ứng dụng ASP.NET?

Trả lời

4

Tôi khuyên bạn nên xem xét số Open XML SDK 2.0. Đó là một CTP, nhưng tôi đã tìm thấy nó cực kỳ hữu ích trong việc thao tác các tập tin xmlx mà không cần phải đối phó với COM ở tất cả. Tài liệu này hơi sơ sài, nhưng điều quan trọng cần tìm là lớp DocumentFormat.OpenXml.Packaging.WordprocessingDocument. Bạn có thể tách rời tài liệu .docx nếu bạn đổi tên phần mở rộng thành .zip và tìm hiểu các tệp XML ở đó. Từ việc đó, có vẻ như một Mục lục được chứa trong một thẻ "Tài liệu có cấu trúc" và những thứ như các tiêu đề nằm trong một siêu liên kết từ đó. Putzing xung quanh với nó một chút, tôi thấy rằng một cái gì đó như thế này sẽ làm việc (hoặc ít nhất là cung cấp cho bạn một điểm khởi đầu).

WordprocessingDocument wordDoc = WordprocessingDocument.Open(Filename, false); 
SdtBlock contents = wordDoc.MainDocumentPart.Document.Descendants<SdtBlock>().First(); 
List<string> contentList = new List<string>(); 
foreach (Hyperlink section in contents.Descendants<Hyperlink>()) 
{ 
    contentList.Add(section.Descendants<Text>().First().Text); 
} 
0

Xem XML Documents and Data làm điểm bắt đầu. Đặc biệt, bạn sẽ muốn sử dụng LINQ to XML.

Nói chung, bạn không muốn sử dụng COM trong ứng dụng .NET.

3

Đây là bài đăng trên blog về truy vấn tài liệu Open XML WordprocessingML sử dụng LINQ to XML. Sử dụng mã đó, bạn có thể viết một truy vấn như sau:

using (WordprocessingDocument doc = 
    WordprocessingDocument.Open(filename, false)) 
{ 
    foreach (var p in doc.MainDocumentPart.Paragraphs()) 
    { 
     Console.WriteLine("Style: {0} Text: >{1}<", 
      p.StyleName.PadRight(16), p.Text); 
     foreach (var c in p.Comments()) 
      Console.WriteLine(
       " Comment Author:{0} Text:>{1}<", 
       c.Author, c.Text); 
    } 
} 

Blog bài: Open XML SDK and LINQ to XML

-Eric

+1

Tôi đọc bài viết của mình trên Open XML - công việc tuyệt vời! –

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