2011-11-15 12 views
6

Questo è probabilmente un po 'stupido, ma ne ho davvero bisogno. Ho un documento con 5 tabelle ogni tabella ha un titolo. l'intestazione è un testo normale senza uno stile speciale, niente. Ho bisogno di estrarre i dati da quelle tabelle + più intestazione. Attualmente, utilizzando MS interoperabilità sono stato in grado di scorrere ogni cella di ogni tabella utilizzando qualcosa di simile:Ottieni testo sopra la tabella MS Word

app.Tables[1].Cell(2, 2).Range.Text; 

ma ora sto lottando per cercare di capire come ottenere il testo proprio sopra il tavolo. Ecco uno screenshot: enter image description here

Per la prima tabella che ho bisogno di ottenere "Ho bisogno di questo TESTO" e per la tavola secnd ho bisogno di ottenere: "E anche questo favore"

Quindi, in pratica ho bisogno di ultima paragrafo prima di ogni tabella. Qualche suggerimento su come fare questo?

risposta

3

Si potrebbe provare qualcosa sulla falsariga di questo. Confronto i paragrafi con la prima cella della tabella e quando c'è una corrispondenza, acquisisci il paragrafo precedente come intestazione della tabella. Naturalmente questo funziona solo se la prima cella della tabella contiene un paragrafo unica che non sarebbe stata trovata in un altro punto del documento:

var tIndex = 1; 
var tCount = oDoc.Tables.Count; 
var tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
var pCount = oDoc.Paragraphs.Count; 
var prevPara = ""; 
for (var i = 1; i <= pCount; i++) { 
    var para = oDoc.Paragraphs[i]; 
    var paraData = para.Range.Text; 

    if (paraData == tblData) { 
     // this paragraph is at the beginning of the table, so grab previous paragraph 
     Console.WriteLine("Header: " + prevPara); 
     tIndex++; 
     if (tIndex <= tCount) 
      tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
     else 
      break; 
    } 
    prevPara = paraData; 
} 

Output di esempio:

Header: I NEED THIS TEXT 

Header: AND THIS ONE also please 
+0

Grazie mille per il vostro aiuto! La tua soluzione mi ha dato un'idea su come implementarlo. Dopo aver trascorso un po 'di tempo, ho capito un modo più semplice per farlo. Lo posterò come risposta. – user194076

9

Mellamokb nella sua risposta ha dato un suggerimento e un buon esempio di come cercare nei paragrafi. Mentre implementavo la sua soluzione, mi sono imbattuto nella funzione "Precedente" che fa esattamente ciò di cui abbiamo bisogno. Ecco come usarlo:

wd.Tables[1].Cell(1, 1).Range.Previous(WdUnits.wdParagraph, 2).Text; 

Indietro accetta due parametri. Primo - Unità che si desidera trovare da questo elenco: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdunits.aspx e il secondo parametro è il numero di unità che si desidera contare. Nel mio caso 2 ha funzionato. Sembra che dovrebbe essere perché è giusto prima del tavolo, ma con uno, ho avuto uno strano personaggio speciale: che sembra un indicatore femminile.

+0

Ho pensato su google "Come ottenere testo sopra un tavolo in parola" sarebbe completamente inutile, ma ero disperato e ci ho provato. Questo mi ha portato a una soluzione. Grazie! I C# con netoffice, si desidera utilizzare il metodo previousSibling() sulla tabella. – user1815201

+0

Ottima risposta, grazie mille! –

+0

Wow! trucco davvero intelligente, funziona perfettamente –