DZWONEK

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chciałbyś przeczytać The Bell?
Bez spamu

Kontynuujemy rozpoczęty wcześniej temat pracy z formularzami w programie Word. W poprzednich artykułach przyglądaliśmy się formularzom tylko z perspektywy „zaawansowanego użytkownika”, tj. stworzyliśmy dokumenty, które są wygodne do ręcznego wypełniania. Dziś chciałbym zaproponować rozszerzenie tego zadania i próbę wykorzystania mechanizmu kontroli treści do generowania dokumentów.

Zanim przejdziemy do naszego bezpośredniego zadania, chciałbym powiedzieć kilka słów o tym, jak dane do kontroli treści są przechowywane w dokumentach Word (celowo pominę na razie sposób ich powiązania z treścią dokumentu, ale mam nadzieję, że wrócę do tego kiedyś w następnych artykułach).

Uzasadnione pytanie brzmi: itemProps1.xml i podobne komponenty? Te komponenty przechowują opisy źródeł danych. Najprawdopodobniej, zgodnie z zamysłem deweloperów, oprócz osadzonych w dokumencie plików xml, miał on korzystać z innych, ale do tej pory tylko ta metoda została zaimplementowana.

Co jest dla nas przydatne itemPropsX.xml? Fakt, że wymieniają schematy xml (ich targetNamespace) które są używane w rodzicu itemX.xml. Oznacza to, że jeśli w dokumencie zawarliśmy więcej niż jeden niestandardowy xml, to aby znaleźć właściwy, musimy przejrzeć itemPropsX.xml komponenty i znajdź żądany obwód, a zatem pożądany itemX.xml.

Teraz jeszcze jedna chwila. Nie będziemy ręcznie analizować relacji między komponentami i szukać właściwych, korzystając tylko z podstawowego API Packaging! Zamiast tego użyjemy Open XML SDK (jego kompilacje są dostępne za pośrednictwem NuGet). Oczywiście nie powiedzieliśmy wcześniej ani słowa o tym API, ale do naszego zadania wymaga to minimum, a cały kod będzie dość przejrzysty.

Cóż, główne wprowadzenie jest zrobione, możesz przejść do przykładu.

Zgodnie z ustaloną tradycją skorzystamy z tego samego „Raportu ze spotkania”, który narysowaliśmy w artykule. Przypomnę, że szablon dokumentu wyglądał tak:

A więc XML, z którym powiązane były pola dokumentu

< meetingNotes xmlns ="urn:MeetingNotes" subject ="" date ="" secretary ="" > < participants > < participant name ="" /> < decisions > < decision problem ="" solution ="" responsible ="" controlDate ="" />

Krok 1. Utwórz model danych

Właściwie naszym zadaniem nie jest tylko wygenerowanie dokumentu, ale stworzenie (przynajmniej w wersji roboczej) wygodnego narzędzia do wykorzystania zarówno przez programistę, jak i użytkownika.

Dlatego zadeklarujemy model jako strukturę klas C#:

Klasa publiczna MeetingNotes ( public MeetingNotes() ( Uczestnicy = nowa lista (); Decyzje = nowa lista (); ) ciąg publiczny Subject ( get; set; ) public DateTime Date ( get; set; ) ciąg publiczny Secretary ( get; set; ) public List Uczestnicy ( get; set; ) lista publiczna Decyzje ( get; set; ) ) public class Decision ( public string Problem ( get; set; ) public string Solution ( get; set; ) public string Responsible ( get; set; ) public DateTime ControlDate ( get; set; ) ) public klasa Uczestnik ( ciąg publiczny Nazwa ( get; set; ) )

Ogólnie rzecz biorąc, nic specjalnego, z wyjątkiem tego, że dodano atrybuty do sterowania serializacją XML (ponieważ nazwy w modelu i wymagany kod XML są nieco inne).

Krok 2: Serializuj powyższy model do XML

Zadanie jest w zasadzie banalne. To, co nazywa się „weź nasz ulubiony XmlSerializer i idź”, jeśli nie dla jednego? ale

Niestety w obecnej wersji pakietu Office najwyraźniej występuje błąd, który wygląda następująco: jeśli w niestandardowym xml przód zadeklarowanie głównej przestrzeni nazw (tej, z której Word powinien pobierać elementy do wyświetlenia), deklarujemy trochę więcej, wtedy powtarzające się kontrolki Content zaczynają się wyświetlać niepoprawnie (tylko tyle elementów jest pokazywanych, ile było w samym szablonie - tj. powtarzanie sekcji nie praca ).

Tych. Oto xml, który działa:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

i ten też:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" xmlns:t ="urn:TTT" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

a tego już nie ma:

< test xmlns:t ="urn:TTT" xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

Próbowałem zgłosić błąd do pomocy technicznej Microsoft na Connect , ale z jakiegoś powodu odmówiono mi dostępu do zgłaszania błędów za pośrednictwem pakietu Office. Nie pomogła też dyskusja na forum MSDN.

Ogólnie rzecz biorąc, niezbędny manewr objazdu. Gdybyśmy sami tworzyli XML, nie byłoby problemów - wszystko zrobilibyśmy sami. Jednak w tym przypadku naprawdę chcę użyć standardowego XmlSerializer, który domyślnie dodaje kilka swoich przestrzeni nazw do wyjściowego XML, nawet jeśli te przestrzenie nazw nie są używane.

Zrobimy całkowite pominięcie danych wyjściowych naszych własnych przestrzeni nazw w XmlSerializer. To prawda, że ​​to podejście zadziała tylko wtedy, gdy naprawdę ich nie potrzebuje (w przeciwnym razie nadal będą dodawane i tylko PRZED naszymi).

Właściwie cały kod (pod warunkiem, że zmienna notatki ze spotkania zawiera wcześniej wypełniony obiekt typu MeetingNotes):

var serializer = new XmlSerializer(typeof (MeetingNotes));
var serializedDataStream = new MemoryStream();

var namespaces = new XmlSerializerNamespaces();
przestrzenie nazw.Dodaj(„” , „” );

serializer.Serialize(serializedDataStream, meetingNotes, przestrzenie nazw);
serializedDataStream.Seek(0, SeekOrigin.Begin);

Krok 3. Wprowadzamy wynikowy XML do dokumentu Word.

Tutaj wykonujemy następujące czynności:

  • skopiuj szablon i otwórz kopię
  • znajdź w nim żądany niestandardowy plik xml (szukaj według przestrzeni nazw „urna: Notatki ze spotkania”)
  • zastępujemy zawartość komponentu naszym XML

File.Copy(nazwa szablonu, nazwadokumentu wynikowego, prawda ); using (var document = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.OfType () .Any(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes"!}

A, nazwiska w kolumnie b i zawody w kolumnie C.

2. Utwórz dokument Word (.doc lub .docx)


(A), (B) I (C).

(A), (B) I (C) (A)- imię, (B)- nazwisko, (C)- zawód.

Ustawienia programy.

3. Wybierz ścieżki dla plików i folderów


Wybierz

4. Ustaw arkusze i wiersze żądanych danych


Arkusze danych pliku Excel

Wiersze danych pliku Excel Arkusze danych pliku Excel

1 .

Jeśli chcesz, aby wszystkie arkusze i/lub wiersze Twojego pliku Excela z danymi brały udział w tworzeniu dokumentu, kliknij odpowiedni przycisk po prawej stronie z podpisem liczby(jego napis zmieni się na Wszystko).

5. Ustaw szablon nazw dla nowych plików tekstowych


Ustaw szablon nazw dla nowych plików tekstowych:

Nowy szablon nazw plików tekstowych jest szablonem nazw nowych dokumentów (plików tekstowych) generowanych przez program. Tutaj szablon nazwy zawiera nazwy kolumn pliku Excel, ujęte w nawiasy klamrowe: (A) I (B). Podczas generowania nowego dokumentu program zastąpi wszystkie (A) I (B) odpowiednie wartości komórek z pliku Excel - będzie to nazwa nowego dokumentu (pliku Word).

Możesz ustawić własne znaki graniczne na karcie Ustawienia programy.

6. Kliknij „Generuj”


Naciśnij przycisk Generować a postęp pojawi się na ekranie. Dokumenty (pliki tekstowe) zostaną utworzone dokładnie tyle, ile linii pliku Excel jest zaangażowanych w tworzenie.

7. Wszystko


Wszystkie dokumenty (pliki tekstowe) zostały utworzone i znajdują się w folderze określonym w Folder do zapisywania nowych plików tekstowych. Wszystko:)

Exwog- generator szablonów raportów od Excela do Worda

Darmowy generator plików Word według szablonu (plik Word) na podstawie danych z pliku Excel

Działa na Mac OS, Windows i Linux

Pozwala ustawić nazwy nowych wygenerowanych plików tekstowych

Pozwala ustawić arkusze i wiersze z wymaganymi danymi

Pozwala ustawić znaki obramowania dla nazw kolumn Excel

Łatwy w użyciu

Przechowuj swoje dane w formacie Excel (.xls i .xlsx) i generuj pliki Word (.doc i .docx) kilkoma kliknięciami :)


Jak to działa?

Spójrz na swój plik Excela


W tym przykładzie plik Excel zawiera informacje o klientach. Każda linia odpowiada konkretnemu klientowi. Nazwiska są w kolumnie A, nazwiska w kolumnie b i zawody w kolumnie C.

Kliknij, aby zobaczyć

Utwórz dokument Word (.doc lub .docx)


Kliknij, aby zobaczyć

Utwórz "szablon" (plik tekstowy) do generowania nowych dokumentów (plików tekstowych). Tutaj tekst „szablonu” zawiera nazwy kolumn pliku Excel, ujęte w nawiasy klamrowe: (A), (B) I (C).

Program wygeneruje nowe dokumenty według „szablonu” zastępując wszystkie (A), (B) I (C) odpowiednie wartości komórek z pliku Excel: (A)- imię, (B)- nazwisko, (C)- zawód.

Możesz także ustawić własne znaki graniczne na karcie Ustawienia programy.

Wybierz ścieżki dla plików i folderów


Wybierz ścieżki dla plików i folderów (przyciski oznaczone Wybierz). W programie określasz następujące ścieżki:

Plik Excel z danymi (*.xls, *.xlsx)- jest to ścieżka do Twojego pliku Excela z danymi (informacjami o kliencie);

Plik szablonu programu Word (*.doc, *.docx) jest ścieżką do twojego "szablonu" (pliku słownego utworzonego w poprzednim kroku);

Folder do zapisywania nowych plików tekstowych- jest to ścieżka do folderu, w którym program będzie zapisywał nowo wygenerowane dokumenty.

Kliknij, aby zobaczyć

Ustaw arkusze i wiersze żądanych danych


Kliknij, aby zobaczyć

Ustaw numery arkuszy i wierszy swojego pliku Excel z danymi (informacjami o klientach), na których chcesz generować dokumenty:

Arkusze danych pliku Excel- liczba arkuszy pliku Excel, które będą zaangażowane w tworzenie nowych dokumentów;

Wiersze danych pliku Excel- numery wierszy arkuszy (arkusze określone w Arkusze danych pliku Excel) pliku Excela, które będą zaangażowane w tworzenie nowych dokumentów. Na podstawie danych z każdej określonej linii zostanie utworzony osobny dokument (plik tekstowy).

Numeracja arkuszy i wierszy w programie zaczyna się od 1 .

Żyjemy w świecie, w którym programiści PHP muszą od czasu do czasu wchodzić w interakcje z systemem operacyjnym Windows. WMI (Windows Management Interface, Windows Management Interface) - jednym z takich przykładów jest interakcja z Microsoft Office.

W tym artykule przyjrzymy się prostej integracji między Wordem i PHP: generowaniu dokumentu Microsoft Word na podstawie pól wejściowych w formularzu HTML przy użyciu PHP (i jego rozszerzenia Interop).

Kroki przygotowawcze

Przede wszystkim upewnijmy się, że mamy skonfigurowane podstawowe środowisko WAMP. Ponieważ Interop jest obecny tylko w systemie Windows, potrzebujemy naszego serwera Apache i instalacji PHP na komputerze z systemem Windows. W związku z tym używam EasyPHP 14.1, który jest niezwykle łatwy w instalacji i konfiguracji.

Następnym krokiem jest zainstalowanie pakietu Microsoft Office. Wersja nie jest bardzo ważna. Używam pakietu Microsoft Office 2013 Pro, ale każda wersja pakietu Office starsza niż 2007 powinna działać.

Musimy również upewnić się, że zainstalowaliśmy biblioteki do tworzenia aplikacji Interop (PIA, Primary Interop Assemblies, Primary Interop Assemblies). Możesz się tego dowiedzieć, otwierając Eksploratora Windows i przechodząc do katalogu \assembly , a tam powinniśmy zobaczyć zestaw zainstalowanych zestawów:

Tutaj możesz zobaczyć element Microsoft.Office.Interop.Word (podkreślony na zrzucie ekranu). To będzie kompilacja, której będziemy używać w naszym demo. Zwróć szczególną uwagę na pola „Nazwa zespołu”, „Wersja” i „Token klucza publicznego”. Niedługo użyjemy ich w naszym skrypcie PHP.

Ten katalog zawiera również inne zestawy (w tym całą rodzinę Office) dostępne do wykorzystania w ich programach (nie tylko dla PHP, ale także dla VB.net, C# itp.).

Jeśli lista zestawów nie zawiera całego pakietu Microsoft.Office.Interop, musimy albo ponownie zainstalować pakiet Office, dodając PIA, albo ręcznie pobrać pakiet z witryny firmy Microsoft i zainstalować go. Zobacz tę stronę MSDN, aby uzyskać bardziej szczegółowe instrukcje.

Komentarz Uwaga: Do pobrania i instalacji dostępna jest tylko dystrybucja Microsoft Office 2010. Wersja zestawu w tym pakiecie to 14.0.0, a wersja 15 jest dostarczana tylko z Office 2013.

Na koniec musisz włączyć rozszerzenie php_com_dotnet.dll w php.ini i zrestartować serwer.

Teraz możemy przejść do programowania.

formularz HTML

Ponieważ główna część tego przykładu przypada po stronie serwera, stworzymy prostą stronę z formularzem, który będzie wyglądał tak:

Mamy pole tekstowe na imię, grupę przycisków radiowych na płeć, suwak na wiek i pole wprowadzania tekstu do wpisywania wiadomości, a także niesławny przycisk „Prześlij”.

Zapisz ten plik jako „index.html” w katalogu hosta wirtualnego, aby można było uzyskać do niego dostęp pod adresem URL, takim jak http://test/test/interop .

Część serwerowa

Plik obsługi po stronie serwera jest głównym celem naszej rozmowy. Najpierw podam pełny kod do tego pliku, a następnie wyjaśnię go krok po kroku.

widoczne = prawda; $fn = __KATALOG__ . "\\szablon.docx"; $d = $w->Dokumenty->Otwórz($fn); echo "Dokument jest otwarty.


"; $flds = $d->Pola; $liczba = $flds->Liczba; echo "Dokument zawiera $pola licznika.
"; Echo "
    "; $mapping = setupfields(); foreach ($flds as $index => $f) ( $f->Select(); $key = $mapping[$index]; $value = $inputs[$key]; if ($klucz == "płeć") ( if ($wartość == "(!LANG:m") $value = "Pan."; else $value = "SM."; } if($key=="printdate") $value= date ("Y-m-d H:i:s"); $w->Selection->TypeText($value); echo "!}
  • Przypisywanie indeksu $: $klucz do $wartości
  • "; ) Echo "
"; echo "Przetwarzanie zakończone!

"; echo "Drukowanie, proszę czekać...
"; $d->PrintOut(); sleep(3); echo "Gotowe!"; $w->Quit(false); $w=null; function setupfields() ( $mapping = array(); $mapping = "płeć"; $mapping = "imię"; $mapping = "wiek"; $mapping = "msg"; $mapping = "data wydruku"; return $mapping; )

Po wpisaniu wartości otrzymanych z formularza do zmiennej $inputs, a także utworzeniu pustego elementu z kluczem printdate (dlaczego to zrobiliśmy - omówimy później), przechodzimy do czterech bardzo ważnych wierszy:

$assembly = "Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"; $class = "Microsoft.Office.Interop.Word.ApplicationClass"; $w = nowy DOTNET($zespół, $klasa); $w->widoczne = prawda;

Manipulator COM w PHP wymaga, aby klasa została utworzona w "zestawie". W naszym przypadku pracujemy z Wordem. Jeśli spojrzysz na pierwszy zrzut ekranu, możesz zapisać pełną sygnaturę zestawu dla programu Word:

  • „Nazwa”, „Wersja”, „Token klucza publicznego” są pobierane z informacji, które można wyświetlić w „c:\Windows\assembly”.
  • „Kultura” jest zawsze neutralna

Klasa, do której chcemy się odwoływać, ma zawsze nazwę „nazwa zestawu” + „.ApplicationClass”.

Ustawiając te dwa parametry, możemy sprawić, że obiekt będzie współpracował z Wordem.

Ten obiekt może pozostać w tle lub możemy wprowadzić go do produkcji, ustawiając atrybut visible na true .

Następnym krokiem jest otwarcie dokumentu do przetworzenia i zapisanie instancji „dokumentu” do zmiennej $d .

Istnieje kilka sposobów tworzenia w dokumencie zawartości opartej na formularzu.

Najgorsze, co można zrobić, to zakodować zawartość dokumentu w PHP, a następnie wyprowadzić ją do dokumentu Worda. Zdecydowanie odradzam robienie tego z następujących powodów:

  1. Tracisz elastyczność. Wszelkie zmiany w pliku wyjściowym będą wymagały zmian w kodzie PHP.
  2. To łamie rozdział kontroli i widoku
  3. Stosowanie stylów do treści dokumentu (wyrównanie, czcionki, style itp.) w skrypcie znacznie zwiększy liczbę wierszy kodu. Programowa zmiana stylów jest zbyt uciążliwa.

Inną opcją byłoby użycie funkcji Znajdź i zamień. PHP ma do tego dobre wbudowane narzędzia. Możemy stworzyć dokument Word, w którym umieszczamy etykiety ze specjalnymi separatorami, które później zostaną zastąpione. Na przykład możemy stworzyć dokument, który będzie zawierał następujący fragment:

a przy pomocy PHP w prosty sposób możemy go zastąpić zawartością pola „Nazwa” otrzymaną z formularza.

Jest to proste i chroni nas przed wszystkimi nieprzyjemnymi konsekwencjami, jakie napotykamy w pierwszej metodzie. Musimy tylko zdecydować o właściwym ograniczniku, w takim przypadku korzystamy z szablonu.

Polecam trzecią metodę i opiera się ona na głębszej znajomości Słowa. Wykorzystamy pola jako symbole zastępcze, a za pomocą kodu PHP bezpośrednio zaktualizujemy wartości w polach o odpowiadające im wartości.

Takie podejście jest elastyczne, szybkie i zgodne z najlepszymi praktykami programu Word. Dzięki niemu można również uniknąć wyszukiwania pełnotekstowego w dokumencie, co ma dobry wpływ na wydajność. Zauważ, że to rozwiązanie ma również wady.

Word od samego początku nie obsługiwał indeksów nazwanych dla pól. Nawet jeśli określiliśmy nazwy dla tworzonych pól, nadal musimy używać numerycznych identyfikatorów tych pól. Wyjaśnia to również, dlaczego musimy użyć oddzielnej funkcji (setupfields), aby dopasować indeks pola i nazwę pola z formularza.

W tym demo użyjemy dokumentu z 5 polami MERGEFIELD. Umieścimy dokument szablonu w tym samym miejscu, co nasz program obsługi skryptów.

Należy pamiętać, że pole data wydruku nie ma odpowiadającego pola w formularzu. Dlatego dodaliśmy pusty element printdate do tablicy $inputs. Bez tego skrypt nadal będzie działał, ale PHP wyświetli ostrzeżenie, że w tablicy $inputs brakuje indeksu printdate.

Po zastąpieniu pól nowymi wartościami, dokument drukujemy za pomocą

$d->Wydruk();

Metoda PrintOut przyjmuje kilka opcjonalnych parametrów i używamy jej najprostszej formy. Spowoduje to wydrukowanie jednej kopii dokumentu na domyślnej drukarce podłączonej do komputera z systemem Windows.

Możesz również wywołać PrintPreview, aby zobaczyć wynik przed jego wydrukowaniem. W całkowicie zautomatyzowanym środowisku będziemy oczywiście korzystać z metody PrintOut.

Musisz chwilę poczekać, zanim zamkniesz aplikację Word, ponieważ kolejkowanie zadania drukowania zajmuje trochę czasu. Bez opóźnienia(3), metoda $w->Quit jest wykonywana natychmiast, a zadanie nie jest umieszczane w kolejce.

Na koniec wywołujemy $w->Quit(false) , co zamyka aplikację Word, która została wywołana przez nasz skrypt. Jedynym parametrem przekazywanym do metody jest zapisanie pliku przed zakończeniem. Wprowadziliśmy zmiany w dokumencie, ale nie chcemy ich zapisywać, ponieważ potrzebujemy czystego szablonu do późniejszej pracy.

Gdy skończymy z kodem, możemy załadować naszą stronę formularza, wpisać kilka wartości i przesłać go. Poniższe obrazy przedstawiają dane wyjściowe skryptu oraz zaktualizowany dokument programu Word:

Poprawiona szybkość przetwarzania i trochę więcej o PIA

PHP to luźno typowany język. Obiekt COM typu Object . Podczas pisania skryptu nie mamy możliwości uzyskania opisu obiektu, czy to aplikacji Word, dokumentu, czy pola. Nie wiemy, jakie właściwości ma ten obiekt, ani jakie metody obsługuje.

To znacznie spowolni tempo rozwoju. Aby przyspieszyć rozwój, polecam najpierw napisać funkcje w C#, a następnie przetłumaczyć kod na PHP. Mogę polecić darmowe IDE do programowania w C# o nazwie „#develop”. Możesz ją znaleźć. Wolę go od Visual Studio, ponieważ #develop jest mniejszy, łatwiejszy i szybszy.

Migracja kodu C# do PHP nie jest tak przerażająca, jak się wydaje. Pokażę ci kilka linijek w C#:

Word.Application w=nowy Word.Application(); w.Widoczny=prawda; String path=Aplikacja.StartupPath+"\\template.docx"; Word.Document d=w.Documents.Open(ścieżka) jako Word.Document; Word.Fields flds=d.Fields; intlen=flds.Liczba; foreach (Word.Field f w flds) ( f.Select(); int i=f.Index; w.Selection.TypeText("..."); )

Widać, że kod C# jest bardzo podobny do kodu PHP, który pokazałem wcześniej. C# jest językiem silnie typizowanym, więc w tym przykładzie widać kilka operatorów rzutowania, a także trzeba określić typ dla zmiennych.

Określając typ zmiennej, możesz cieszyć się wyraźniejszym kodem i automatycznym uzupełnianiem, a szybkość tworzenia jest znacznie zwiększona.

Innym sposobem na przyspieszenie rozwoju PHP jest wywołanie makra w programie Word. Wykonujemy tę samą sekwencję działań, a następnie zapisujemy ją jako makro. Makro zostało napisane w języku Visual Basic, który również można łatwo przetłumaczyć na PHP.

A co najważniejsze, dokumentacja Microsoft Office PIA, zwłaszcza dokumentacja przestrzeni nazw każdej aplikacji Office, jest najbardziej szczegółowym odniesieniem. Najczęściej używane trzy aplikacje to:

  • Excel 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
  • Word 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
  • PowerPoint 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

Wniosek

W tym artykule pokazaliśmy, jak wypełnić dokument Worda danymi przy użyciu bibliotek PHP COM i współdziałania Microsoft Office.

Windows i Office są szeroko stosowane w życiu codziennym. Znajomość możliwości Office/Window i PHP przyda się każdemu programiście PHP i Windows.

Rozszerzenie PHP COM otwiera drzwi do korzystania z tej kombinacji.

Wszyscy mamy do czynienia z tekstami w taki czy inny sposób. Czasem jest potrzeba wygenerowania dużej lub niezbyt dużej ilości tekstu do jakiegoś zadania, na przykład pobawić się formatowaniem, ale tekstu nie ma pod ręką, jest zbyt leniwy, aby napisać go samemu. Co robić? Odpowiedź jest prosta: użyj wbudowanego generatora tekstu losowego w programie Word!

W edytorze Microsoft Word możesz szybko i łatwo generować tekst za pomocą specjalnych poleceń. Jako królika doświadczalnego użyję programu Word 2007. Te polecenia powinny działać we wszystkich wersjach programu Word. Opowiem Ci o trzech metodach generowania tekstu.

Metoda 1: za pomocą rand()

Funkcja rand() wstawia zlokalizowaną próbkę tekstu, 3 akapity po 3 zdania. Otwórz swoje słowo, umieść kursor w miejscu, w którym wkrótce pojawi się tekst i wprowadź polecenie:

i naciśnij Enter. Sama funkcja rand zniknie, a zamiast niej pojawią się 3 akapity tekstu:

Ale to nie wszystko. Jeśli potrzebujesz dużo tekstu, możesz użyć funkcji rand z dodatkowymi argumentami, takimi jak:

=rand(x,y)

gdzie " x' oznacza liczbę akapitów, a ' tak» to liczba zdań w każdym akapicie. Na przykład, =rand(20,5) wstawi 20 akapitów po pięć fraz każdy. ALE =rand(7) wstawi 7 akapitów po 3 zdania każdy.

Metoda 2: Używanie lorem()

Aby wstawić stary dobry Lorem Ipsum jako próbkę - użyj funkcji lorem (). Wpisz następujące polecenie i naciśnij Enter:

I dostajemy ten całkowicie łaciński tekst

Funkcja lorem() również chętnie przyjmuje dodatkowe argumenty, takie jak rand(), w postaci kilku akapitów i zdań. Bez argumentów funkcja wstawia domyślnie 3 akapity po 3 zdania każdy.

Metoda 3. Funkcja rand.old()

Użycie jest podobne do poprzednich poleceń:

=rand.stary()

i naciśnij Enter.

Funkcja rand.old() została pozostawiona dla zgodności ze starym biurem, do roku 2003 włącznie. Sposób aplikacji jest taki sam jak w poprzednich dwóch, tylko tekst będzie składał się z tych samych zwrotów „Jedz więcej tych miękkich francuskich bułek i pij herbatę”. To zdanie jest znane każdemu, kto czasami musiał pracować z czcionkami.

Możesz przekazać argumenty jak w pierwszych dwóch metodach.

To wszystko, teksty zostały wygenerowane, teraz możesz jeść więcej tych miękkich francuskich bułek i pić herbatę :)

Czy udało Ci się wstawić tekst za pomocą powyższych funkcji?

W poprzednich artykułach z serii „Automatyzacja wypełniania dokumentów” mówiłem o tym, jak stworzyć interfejs użytkownika aplikacji, zorganizować walidację danych wejściowych i uzyskać liczbę słowną bez użycia kodu VBA. W ostatnim artykule porozmawiamy o magii – przeniesieniu wszystkich niezbędnych wartości ze skoroszytu Excela do dokumentu Worda. Pokażę Ci efekt końcowy:

Opis mechanizmu

Na początek opiszę w sposób ogólny, w jaki sposób dane zostaną przeniesione do dokumentu Word. Przede wszystkim potrzebujemy szablonu dokumentu Word zawierającego wszystkie znaczniki, tabele i tę część tekstu, która pozostanie niezmieniona. W tym szablonie należy zdefiniować miejsca, w których zostaną podstawione wartości ze skoroszytu Excela - najwygodniej to zrobić za pomocą zakładek. Następnie należy ułożyć dane Excela w taki sposób, aby pasowały do ​​szablonu Word, a na koniec napisać samą procedurę przelewu w VBA.

Więc pierwsze rzeczy na początek.

Utwórz szablon dokumentu Word

Tutaj wszystko jest niezwykle proste – tworzymy zwykły dokument, wpisujemy i formatujemy tekst, generalnie osiągamy po to, aby uzyskać niezbędną formę. W tych miejscach, w których konieczne będzie podstawianie wartości z Excela, musisz stworzyć zakładki. Odbywa się to w następujący sposób:

W związku z tym będziesz musiał utworzyć wszystkie zakładki, czyli zaznaczyć wszystkie miejsca, w których zostaną wstawione dane z Excela. Wynikowy plik należy zapisać jako „Szablon MS Word” za pomocą opcji menu „Plik” -> „Zapisz jako...”.

Przygotowanie danych w Excelu

Dla wygody postanowiłem umieścić wszystkie dane, które należy przenieść do dokumentu Worda, w osobnym arkuszu o nazwie Zakładki - zakładki. Ten arkusz ma dwie kolumny: pierwsza zawiera nazwy zakładek (dokładnie tak, jak są one nazwane w dokumencie Word), a druga zawiera odpowiednie wartości do przeniesienia.

Niektóre z tych wartości są uzyskiwane bezpośrednio z arkusza wprowadzania danych, a niektóre z tabel pomocniczych znajdujących się na arkuszu Support. W tym artykule nie będę analizować formuł obliczających pożądane wartości, jeśli coś nie jest jasne, zadawaj pytania w komentarzach.

Na tym etapie ważne jest, aby poprawnie określić wszystkie nazwy zakładek - od tego zależy poprawność transferu danych.

Procedura transferu

Ale to jest najciekawsze. Istnieją dwie możliwości wykonania kodu migracji danych:

  • Kod jest wykonywany w skoroszycie programu Excel, dane są przekazywane do programu Word pojedynczo i natychmiast umieszczane w dokumencie.
  • Kod wykonywany jest w osobnym dokumencie Word, wszystkie dane są przesyłane z Excela w jednej partii.

Z punktu widzenia szybkości wykonania, zwłaszcza przy dużej liczbie zakładek, druga opcja wygląda znacznie atrakcyjniej, ale wymaga bardziej skomplikowanych działań. To ten, którego użyłem.

Oto, co należy zrobić:

  • Utwórz szablon dokumentu programu Word z obsługą makr. Ten szablon będzie zawierał wykonywalny kod VBA.
  • W utworzonym szablonie należy umieścić program napisany w VBA. Aby to zrobić, podczas edycji szablonu naciśnij kombinację klawiszy Alt + F11 i wprowadź kod programu w otwartym oknie edytora Visual Basic.
  • W skoroszycie programu Excel napisz kod, który wywołuje procedurę wypełniania z utworzonego właśnie szablonu programu Word.

Nie będę podawał tekstu procedury w artykule - można go łatwo przejrzeć w pliku FillDocument.dotm znajdującym się w folderze Template w przykładowym archiwum.

Jak możesz wykorzystać to wszystko do rozwiązania swojego konkretnego problemu?

Rozumiem, że w słowach wszystko wygląda bardzo prosto, ale co się dzieje w praktyce? Proponuję po prostu skorzystać z gotowej opcji. Pobierz archiwum z przykładem, w skoroszycie programu Excel naciśnij kombinację klawiszy Alt + F11, aby otworzyć edytor Visual Basic i przeczytać wszystkie moje komentarze dotyczące programu. Aby dostosować program do własnych potrzeb, wystarczy zmienić wartość kilku stałych, które są umieszczane na samym początku programu. Możesz dowolnie skopiować cały tekst programu do swojego projektu.

Struktura archiwum

Archiwum dołączone do tego artykułu zawiera kilka plików.

Głównym plikiem jest skoroszyt programu Excel o nazwie „Generuj potwierdzenia”. W skoroszycie znajdują się 4 arkusze, z których wyświetlane są tylko dwa: „Wprowadzanie” – arkusz wprowadzania danych oraz „Baza danych” – archiwum wszystkich wprowadzonych dokumentów.

Folder Szablony zawiera szablony dokumentów programu Word. Jednym z nich jest szablon zawierający program do wypełniania zakładek, a drugim formularz do wypełnienia. Możesz korzystać z szablonu z programem bez zmian, ale formularz do wypełnienia oczywiście będzie musiał zostać zmodyfikowany zgodnie z Twoimi potrzebami.

Jak przerobić przykład „dla siebie”?

  1. Przygotuj szablon dokumentu Word do uzupełnienia. Utwórz w nim wszystkie niezbędne zakładki i zapisz jako „szablon MS Word”.
  2. Skopiuj plik FillDocument.dotm z archiwum dołączonego do tego artykułu do folderu z przygotowanym szablonem. Ten plik odpowiada za wypełnianie zakładek szablonu i nic w nim nie trzeba zmieniać.
  3. Przygotuj skoroszyt programu Excel do wprowadzania danych. Od Ciebie zależy, czy będzie miał jakiś „zaawansowany” interfejs użytkownika i wykona różne skomplikowane obliczenia. Najważniejsze jest to, że zawiera arkusz roboczy z tabelą korespondencji między nazwą zakładki w szablonie Word a wartością do podstawienia.
  4. Do przygotowanego skoroszytu wstawiamy kod programu VBA z przykładowego pliku. Zamień wszystkie stałe zgodnie ze swoim projektem.
  5. Sprawdź poprawność działania.
  6. Ciesz się aktywnie!

DZWONEK

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Imię
Nazwisko
Jak chciałbyś przeczytać The Bell?
Bez spamu