Centrum skryptów - Microsoft Office

Co zrobić, aby zapisać każdy akapit dokumentu Word jako rekord w bazie danych?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Co zrobić, aby zapisać każdy akapit dokumentu Word jako rekord w bazie danych?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Kilka dni temu tłumaczyliście, jak otworzyć kilka plików tekstowych i zapisać zawarte w nich dane jako rekord w bazie danych. Mam dość podobne pytanie – chodzi mi o to, jak zapisać każdy akapit dokumentu Word jako rekord w bazie danych. Jak to zrobić?

-- HY

Cześć Skrypciarze! Odpowiedź

Cześć HY. Zanim zajmiemy się dzisiejszym pytaniem, trochę na temat ostatniego zakupu firmy Microsoft – giganta na rynku reklamy, firmy aQuantitive. Na pewno wielu z Was jest zaniepokojonych tym faktem i zastanawia się, jaki to będzie miało wpływ na centrum skryptów. Zapewniamy, nie ma się czym przejmować. To, że firma Microsoft wydała 6 mld USD na zakup agencji reklamowej online, nie będzie miało jakiegokolwiek wpływu na nasze centrum skryptów.

Jeżeli jednak nadal się nad tym zastanawiacie, to w prasie piszą, ze zakup ten z pewnością poprawi „ekosystem reklamowy w szerokim tego słowa znaczeniu”. Szczerze powiedziawszy, nie wiemy czym wspomniany „ekosystem reklamowy” tak dokładnie jest. Mamy nadzieję jednak, że oznacza on tyle co „napisanie skryptu, dzięki któremu można zapisać każdy akapit dokumentu Word jako rekord w bazie danych.” Jeśli tak właśnie jest, to i Skrypciarze chcieliby cos wnieść do rzeczonego ekosystemu reklamowego:

Const adLockOptimistic = 3



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = C:\Scripts\Test.mdb" 



objRecordSet.Open "SELECT * FROM WordParagraphs" , _

    objConnection, adOpenStatic, adLockOptimistic



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")



Set objSelection = objWord.Selection



For i = 1 to objDoc.Paragraphs.Count

    objDoc.Paragraphs(i).Range.Select

    If Len(objSelection.Text) > 1 Then

        objRecordSet.AddNew

        objRecordSet("ParagraphNumber") = i

        objRecordSet("ParagraphText") = objSelection.Text

        objRecordSet.Update

    End If

Next

Teraz do sedna. Jak działa powyższy skrypt? Mamy więc prosty dokument Word (C:\Scripts\Test.doc), dokument, który wygada następująco:

Mamy także bardzo prostą, małą bazę danych programu Access (C:\Scripts\Test.mdb). Zawiera ona tabelę o nazwie WordParagraphs, w której występują dwa pola:

belę o nazwie WordParagraphs, w której występują dwa pola:

  • ParagraphNumber – tego pola użyjemy, aby śledzić kolejne akapity (i tak, pierwszy akapit w dokumencie ma numer 1, drugi numer 2 itd.)
  • ParagraphText – pole, w które będziemy wpisywać tekst z każdego akapitu..

Do roboty, do roboty. Czas brać kielnię w garść!

Zaczynamy od zdefiniowania stałej o nazwie adLockOptimistic i ustawienia jej wartości na 3. Dzięki niej rekord w bazie danych będzie zablokowany dla innych użytkowników jedynie w czasie jego aktualizacji. Następnie za pomocą poniższego fragmentu kodu tworzymy wystąpienia obiektów ADODB.Connection i ADODB.Recordset oraz otwieramy bazę danych C:\Scripts\Test.mdb:

Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = C:\Scripts\Test.mdb"

Później uzywamy tego wiersza kodu, aby pobrać zestaw rekordów zawierający wszystkie rekordy znajdujące się w tabeli WordParagraphs:

objRecordSet.Open "SELECT * FROM WordParagraphs" , _

    objConnection, adOpenStatic, adLockOptimistic

Czas teraz trochę zmienić tematykę i zająć się programem Microsoft Word. Aby utworzyć wystąpienie obiektu Word.Application i sprawić, by był on widoczny na ekranie, używamy następujących wierszy kodu:

Set objWord = CreateObject("Word.Application")

objWord.Visible = True

Kiedy program Word się uruchomi, używamy metody Open, aby otworzyć dokument C:\Scripts\Test.doc:

Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")

Następnie tworzymy wystąpienie obiektu Word.Selection. Obiekt ten będzie nam potrzebny do pobrania tekstu z każdego akapitu. Tu dopiero zaczyna się prawdziwa zabawa.

Każdy dokument programu Word zawiera kolekcję Paragraphs. Znajdują się w niej wszystkie akapity z danego dokumentu. Jeśli chcemy uzyskać informacje o każdym z akapitów (a tak się składa, że chcemy), musimy uruchomić pętlę For Next, przechodzącą od pierwszego do ostatniego z nich. Liczbę akapitów możemy sprawdzić za pomocą właściwości Count kolekcji Paragraphs. Lub, bardziej programistycznie ująwszy:

For i = 1 to objDoc.Paragraphs.Count

Co się dzieje wewnątrz pętli? No cóż, zaznaczamy pierwszy akapit, czym zajmuje się poniższy wiersz kodu:

objDoc.Paragraphs(i).Range.Select

Używając metody Select w stosunku do zakresu akapitów, zaznaczamy całe akapity i automatycznie przechowujemy je w odwołaniu obiektu objSelection. Oznacza to, że możemy sprawdzić, ile znaków znajduje się we właściwości Text obiektu objSelection:

If Len(objSelection.Text) > 1 Then

Co nam to daje? Jeżeli spojrzymy na nasz dokument Word, zauważymy, że między poszczególnymi akapitami występują puste linijki. Nie są ona jednak tak do końca puste, ponieważ każda „pusta” linijka zawiera znak danego akapitu. Należy zatem sprawdzić, czy tekst danego akapitu ma więcej niż jeden znak (do sprawdzenia liczby znaków w danym ciągu używamy oczywiście funkcji Len). Jeżeli długość tekstu wynosi 1, zakładamy, że jest to pusty akapit i po prostu pomijamy go – w bazie danych magazynujemy tylko te akapity, których tekst ma więcej niż 1 znak.

Uwaga: W tym momencie warto nadmienić, że skrypt działa wyłącznie w odniesieniu do tekstów. Jeżeli zatem dokument zawiera tabele, nie możemy w żaden sposób zagwarantować, że skrypt będzie działał. Może działać, może też nie działać.

Załóżmy, ze mamy tu „prawdziwy” akapit, czyli taki, który zawiera więcej niż jeden znak. W tym przypadku uruchamiamy poniższy fragment kodu:

objRecordSet.AddNew

objRecordSet("ParagraphNumber") = i

objRecordSet("ParagraphText") = objSelection.Text

objRecordSet.Update

Jak zapewne nietrudno się domyślić, powyższy kod zapisuje tekst akapitu jako rekord w bazie danych. Aby to zrobić, należy najpierw utworzyć nowy, pusty rekord (dlatego nazywamy tę metodę metodą AddNew). Następnie przypisujemy wartość zmiennej licznika i polu ParagraphNumber, a tekst akapitu (objSelection.Text) polu ParagraphText. Po przypisaniu tych wartości wywołujemy metodę Update, która zapisuje nowy rekord w bazie danych.

Następnie ponownie uruchamiamy pętlę i powtarzamy cały proces, tym razem używając kolejnego akapitu w kolekcji.

Tyle powinno wystarczyć, HY. Jeśli coś Ci nie odpowiada, możesz zareklamować nasz skrypt w aQuantive.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office