2010-10-29

VSTO İle word belgelerini sayfa sayfa okuma


Elimizde bir word belgesi var ve programatik olarak içinde bazı kelimleri sayfa bazlı aramamız gerekiyor.
Önce word belgemizi Interop yardımıyla açıyoruz ve bir Range nesnesi alıyoruz.

_WORD = New Microsoft.Office.Interop.Word.Application
_Doc = _WORD.Documents.Open(OpenFileDialog1.FileName)
If _Doc IsNot Nothing Then
Dim rng As Microsoft.Office.Interop.Word.Range = _Doc.Range()
'............

Range nesnesin parametresiz vererek tüm içeriğe erişmiş oluyoruz.
Şimdi toplam sayfa sayısını bulalım.

Dim pages As Integer = rng.ComputeStatisticsMicrosoft.Office.Interop.Word.WdStatistic.wdStatisticPages)

Bütün sayfaların başlangıç-bitiş değerlerini bir Dictionary nesnesinde tutalım

Dim list As New System.Collections.Generic.Dictionary(Of Integer, Integer())

İlk sayfanın başına gidelim ve en son Range değerini tutalım.

Dim what = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage
Dim which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToAbsolute
Dim nRange As Microsoft.Office.Interop.Word.Range
Dim last As Integer = rng.End

Şimdi 2. sayfadan son sayfaya kadar ilerliyelim.

Dim oncekiSon As Integer = 0
For i = 2 To pages
nRange = rng.GoTo(what, which, i)
list.Add(i - 1, New Integer() {oncekiSon, nRange.End})
oncekiSon = nRange.End
Next

Şimdi son sayfanın başlangıç ve bitişlerini ekliyelim.(Son Range değeri)

If list.Count > 0 Then
list.Add(list.Keys.Last + 1, New Integer() {oncekiSon, last})
End If

Artık elimizdde bütün sayflar için Range(Başlangıç-Bitiş) değerleri mevcut.
Sayfaların içerikleri işleyebiliriz.

For Each key As Integer In list.Keys
rng.SetRange(list(key)(0), list(key)(1))
Dim data As String = rng.Text 'key nolu sayfanın içeriği
Next

Word dan çıkalım.

COM nesnelerimizi bırakmayı unutmayalım :)

_WORD.Quit(SaveChanges:=Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
System.Runtime.InteropServices.Marshal.ReleaseComObject(_WORD)
System.Runtime.InteropServices.Marshal.ReleaseComObject(_Doc)
_WORD = Nothing
_Doc = Nothing