Co zrobić, aby zapisać każdy akapit dokumentu Word jako rekord w bazie danych?
Skrypciarze odpowiadają na Wasze pytania
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! 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ść 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 |