2011-11-15 23 views
6

Ten jest prawdopodobnie trochę głupi, ale naprawdę go potrzebuję. Mam dokument z 5 tabelami, z których każda ma nagłówek. nagłówek to zwykły tekst bez specjalnej stylizacji, nic. Muszę wyodrębnić dane z tych tabel plus nagłówek. Obecnie, za pomocą MS współdziałanie byłem w stanie wykonać iterację każdej komórce każdej tabeli, używając mniej więcej tak:Pobierz tekst powyżej tabeli MS Word

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

Ale teraz walczą na próbuje dowiedzieć się, jak uzyskać tekst tuż nad stołem. Oto zrzut ekranu: enter image description here

Na pierwszym stole muszę dostać „Potrzebuję ten tekst” i secnd tabeli muszę się: „A ten też proszę”

Więc w zasadzie muszę ostatnia akapit przed każdą tabelą. Wszelkie sugestie, jak to zrobić?

Odpowiedz

3

Możesz spróbować czegoś podobnego. Porównuję akapity do pierwszej komórki tabeli, a gdy jest dopasowanie, chwyć poprzedni akapit jako nagłówek tabeli. Oczywiście działa to tylko wtedy, gdy pierwsza komórka tabeli zawiera unikalny punkt, że nie będzie można znaleźć w innym miejscu w dokumencie:

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

Wyjście próbki:

Header: I NEED THIS TEXT 

Header: AND THIS ONE also please 
+0

Wielkie dzięki za pomoc! Twoje rozwiązanie dało mi pomysł, jak to wdrożyć. Po spędzeniu trochę czasu wymyśliłem łatwiejszy sposób na zrobienie tego. Opublikuję to jako odpowiedź. – user194076

9

Mellamokb w jego odpowiedź dał wskazówkę i dobry przykład wyszukiwania w akapitach. Podczas wdrażania jego rozwiązania natknąłem się na funkcję "Poprzedni", która spełnia dokładnie to, czego potrzebujemy. Oto jak z niego korzystać:

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

Poprzednia akceptuje dwa parametry. Pierwszy - Jednostka, którą chcesz znaleźć na tej liście: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdunits.aspx a drugi parametr określa liczbę jednostek, które chcesz odliczyć. W moim przypadku 2 działało. Wyglądało na to, że powinno być, ponieważ jest tuż przed stołem, ale z jednym, mam dziwny specjalny znak: , który wygląda jak wskaźnik żeński.

+0

Myślałem, że szukanie w Google hasła "Jak uzyskać tekst nad tabelą w słowie" byłoby zupełnie bezużyteczne, ale byłem zdesperowany i próbowałem. To doprowadziło mnie do rozwiązania. Dzięki! I C# z netoffice, chcesz użyć metody previousSibling() w tabeli. – user1815201

+0

Świetna odpowiedź, dziękuję bardzo! –

+0

Wow! naprawdę sprytna sztuczka, działa idealnie –

Powiązane problemy