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.ComputeStatistics(Microsoft.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