2009-08-18 18 views
5

Vorrei caricare un file docx Word 2007 o superiore sul mio server Web e convertire il sommario in una semplice struttura xml. Fare questo sul desktop con VBA tradizionale sembra che sarebbe stato facile. Guardare i dati XML di WordprocessingML utilizzati per creare il file docx è fonte di confusione. C'è un modo (senza COM) per navigare nel documento in modo più orientato agli oggetti?Come posso interrogare un docx di Word in un'app ASP.NET?

risposta

4

Consiglio vivamente di esaminare lo Open XML SDK 2.0. È un CTP, ma l'ho trovato estremamente utile nella manipolazione dei file xmlx senza dover necessariamente occuparmi di COM. La documentazione è un po 'approssimativa, ma la cosa fondamentale da cercare è la classe DocumentFormat.OpenXml.Packaging.WordprocessingDocument. È possibile selezionare separatamente il documento .docx se si rinomina l'estensione in .zip e si scava nei file XML lì. Da ciò, sembra che un sommario sia contenuto in un tag "Documento strutturato" e che elementi come i titoli siano in un collegamento ipertestuale da lì. Mettendomi un po 'in giro, ho scoperto che qualcosa del genere dovrebbe funzionare (o almeno darti un punto di partenza).

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

Vedere XML Documents and Data come punto di partenza. In particolare, ti consigliamo di utilizzare LINQ in XML.

In generale, non si desidera utilizzare COM in un'applicazione .NET.

3

Ecco un post sul blog per interrogare i documenti Open XML WordprocessingML utilizzando LINQ in XML. Utilizzando il codice, è possibile scrivere una query come segue:

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

post del blog: Open XML SDK and LINQ to XML

-Eric

+1

Ho letto i vostri messaggi su Open XML - grande opera! –

Problemi correlati