Centrum skryptów - Microsoft Office

W jaki sposób mogę przekonwertować tysiąc plików .RTF na format dokumentu Word? 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.

W jaki sposób mogę przekonwertować tysiąc plików .RTF na format dokumentu Word?

Cześć Skrypciarzu! Mam folder zawierający około tysiąca plików .RTF. Musze przekonwertować je wszystkie na format dokumentu Word (.DOC). Czy możecie mi pomóc?

-- LS

Cześć LS. Jasne że możemy. Możemy, ale wcale nie musimy.

Nie, chwila, żartujemy. Nie tylko możemy, ale i zrobimy to. Zacznijmy zatem od skryptu otwierającego jeden plik .RTF (C:\Scripts\Test.rtf), by później utworzyć jego wersję w formacie Word:

Const wdFormatDocument = 0



Set objWord = CreateObject("Word.Application")

Set objDoc = objWord.Documents.Open("c:\scripts\test.rtf")

objDoc.SaveAs "C:\Scripts\test.doc", wdFormatDocument



objWord.Quit

Prawda że łatwe? Najpierw tworzymy stałą o nazwie wdFormatDocument i przypisujemy jej wartość 0; to właśnie wartość oznaczająca standardowy dokument Word. Tworzymy wystąpienie obiektu Word.Application, następnie przy pomocy metody Open otwieramy dokument C:\Scripts\Test.rtf.

Jak zatem można konwertuje się ten dokument na format Word? No cóż. Prawdę mówiąc, nie będziemy go konwertować, tylko zapiszemy jego kopię w formacie Word. Będziemy wtedy mieli dwa pliki: Test.doc i Test.rtf. Jeśli nie chcesz mieć dwóch plików, można zawsze dodać dodać kilka wierszy kodu i usunąć plik Test.rtf.

Oto wiersz tworzący plik Test.doc. Jak widać, wywołujemy metodę SaveAs, podając jako parametr nową ścieżkę pliku (C:\Scripts\Test.doc) oraz stałą wdFormatDocument (która nakazuje programowi Word zapisać plik jako dokument Word):

objDoc.SaveAs "C:\Scripts\test.doc", wdFormatDocument

Następnie wywołujemy metodę Quit (aby wyjść z programu Word) i po kłopocie. Łatwo, prosto i przyjemnie.

Rzecz jasna mógłby to być koniec, ale nie jest. Chodzi w końcu o cały folder po brzegi wypełniony plikami do przekonwertowania. Czy można skombinować skrypt konwertujący wszystkie te pliki? No jasne:

Const wdFormatDocument  = 0



strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _

        & "ResultClass = CIM_DataFile")



Set objWord = CreateObject("Word.Application")



For Each objFile in colFiles

    If objFile.Extension = "rtf" Then

        strFile = "C:\Scripts\" & objFile.FileName & "." & objFile.Extension

        strNewFile = "C:\Scripts\" & objFile.FileName & ".doc"

        Set objDoc = objWord.Documents.Open(strFile)

        objDoc.SaveAs strNewFile, wdFormatDocument

        objDoc.Close

    End If

Next



objWord.Quit

Nie będziemy szczegółowo omawiać tego skryptu, zadowolimy się szybkim przeglądem wykonywanych akcji. Najpierw łączymy się z usługą WMI i uzyskujemy listę wszystkich plików w folderze C:\Scripts folder. Tym właśnie zajmuje się to niezgrabne zapytanie:

Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _

        & "ResultClass = CIM_DataFile")

Tworzymy wystąpienie obiektu Word.Application, następnie ustanawiamy pętlę For Each i przechodzimy przez wszystkie pliki, sprawdzając czy ich właściwość Extension (rozszerzenie) równa się RTF (uwaga: chodzi o same litery, bez kropki). Za każdym razem, gdy znaleziony zostanie plik .RTF, stosujemy poniższy wiersz kodu by uzyskać odpowiednią ścieżkę dostępu i zapisać ją w zmiennej strFileName:

strFile = "C:\Scripts\" & objFile.FileName & "." & objFile.Extension

Następnie tworzymy nazwę pliku w wersji Word za pomocą poniższego wiersza:

strNewFile = "C:\Scripts\" & objFile.FileName & ".doc"

Zrozumiano? Jeśli znaleziony został plik Test.rtf, zmienna strFileName uzyskuje wartość: C:\Scripts\Test.rtf. Natomiast wartość zmiennej strNewFile będzie równa: C:\Scripts\Test.doc. Teraz możemy zastosować kod z początku artykułu – ten, który otwiera plik .RTF i zapisuje go w formacie .DOC – z jedną zmianą. Zamiast podawać z osoba nazwę każdego pliku użyjemy zmiennych strFile i strNewFile:

Set objWord = CreateObject("Word.Application")

Set objDoc = objWord.Documents.Open(strFile)

objDoc.SaveAs strNewFile, wdFormatDocument

objDoc.Close

Warto zwrócić uwagę, że po wywołaniu metody SaveAs używamy metody Close do zamknięcia pliku Test.rtf, ale nie programu Word. Następnie robimy pętlę i wyszukujemy kolejnego pliku RTF. Kiedy przejdziemy przez wszystkie pliki, kończymy pętlę i używamy metody Quit aby zamknąć wystąpienie programu Word. Dzięki temu nie musimy stale włączać, wyłączać i znowu włączać programu Word za każdym razem, gdy znaleziony zostanie nowy plik .RTF. Moglibyśmy tak postąpić, ale to zdecydowanie spowolniłoby działanie skryptu.

A skoro już przy tym jesteśmy… Wykonanie skryptu może chwilę potrwać, szczególnie jeśli plików jest dużo i są one znacznych rozmiarów. W przeprowadzanych przez nas testach otwarcie i zapisanie trzech plików .RTF, każdy o rozmiarze ok. 4 MB, zajęło ok. 45 sekund. Tak więc doradzamy odpowiednie planowanie.

 Do początku strony Do początku strony


Centrum skryptów - Microsoft Office