Och, to wieczny temat - tworzenie arkusza kalkulacyjnego Excel z arkuszy kalkulacyjnych Delphi. Excel jest dziś jednym ze światowych standardów, a w przypadku programów, nawet prostych, często wymagane jest wyprowadzanie danych jako tabel i przenoszenie raportów do arkusza kalkulacyjnego. Jedną z rzeczy warto zauważyć, że format XLS jest już przestarzały i jest to wewnętrzny format Microsoft Excel o nazwie Biff8 (cały świat z własnymi połączeniami między, na pierwszy rzut oka, niepowiązanymi jednostkami, komórkami, niekończącymi się kartami i stronami z sekcjami plików w hardcorowym formacie binarnym). Są jednak firmy, klienci, którzy mają takie wymagania. Dobrze byłoby od razu ich uprzedzić, że ten format NIE jest odpowiedni do naprawdę dużych danych – sprawdź to:
"Program Excel ma ograniczenia ilości danych, które komórka może przechowywać: w przypadku plików programu Excel BIFF 8 limit ten wynosi 32 767 znaków, więc (teoretycznie) 200+ znaków nie powinno stanowić problemu. Jednak w przypadku dłuższych ciągów dane te są przechowywane w pliku BIFF w kilku blokach z rekordami kontynuacji, Dla plików BIFF 5 (Excel 95) limit wynosi 2084 bajtów na blok; w plikach BIFF 8 (Excel 97 i powyżej) limit wynosi 8228 bajtów. Rekordy, które są dłuższe niż te limity muszą być podzielone na bloki CONTINUE."
– liczba kolumn, linii i danych jest ograniczona. Lepiej użyć czegoś nowego, a w innym artykule powiem ci, jak zapisać w formacie XLSX XML z Delphi (znacznie lepsze formaty - choć nadal Excel).
Jeśli jednak masz ochotę na coś niesamowitego i nie zniechęciły cię ograniczenia formatu, oto kilka rozwiązań:
- Arkusz XLS prosto z StringGrid przez OLE / OLE-container – metoda ta ma kilka nieprzyjemnych momentów: na pewno trzeba zainstalować Microsoft Excel na komputerze ( wymagana legalna licencja)! Architektura bitowa systemu, zainstalowany pakiet MS Office i skompilowany program powinny być zgodne (nie można sobie nawet wyobrazić, ile niezapomnianych godzin debugowania może dostarczyć, na przykład 32-bitową wersję pakietu Office w systemie 64-bitowym!); arkusz kalkulacyjny powinien być mały (praca z dużymi zbiorami danych bezpośrednio w pamięci, OLE upaść natychmiast biorąc w dół zarówno Excel i aplikacji, jak również), a nawet dla tego małego programu należy mieć wystarczająco dużo czasu. Proces przesyłania danych z OLE jest medytacyjny i nie lubi pośpiechu. Spędzisz wiele wieczorów googling dla "delphi ole excel kontener zapisać plik".
- Dobrze, wyobraźmy sobie, że chcesz zrobić wszystko w sposób dla dorosłych - i wysłać duże ilości danych do XLS. Następnie wszelkiego rodzaju biblioteki pomagają nam pisać bezpośrednio do XLS - na przykład TXLSFile. Ta metoda ma kilka wad, zbyt. Na przykład, to nie jest tak, że nie można umieszczać obrazów, zdjęć i kodów kreskowych w komórkach lub stosować granic komórek - ale to zajmie, powiedzmy, pewne wysiłki.
- lub TMS FlexCel. Raport można wykonać w programie TMS FlexCel z obrazem i zerowym kodem. Nawet jeśli chcesz to zrobić w kodzie, mają narzędzie, które generuje kod! *
- Więc co mamy zrobić? Jak zwykle na tym blogu, mamy rozwiązanie - i to jest FastReport VCL! Po pierwsze, łatwo za pomocą maksymalnego przyjemnego interfejsu wizualnego stworzyć dokument lub raport (nie krępuj się nazwać go, jak chcesz - nawet katalog dla dealerów - i to nie jest żart, ludzie robią wszelkiego rodzaju rzeczy). Następnie wyeksportuj ostateczny wynik, jak to jest - do Excela! Również skorzystać z zaleceń przygotowania raportu - sprawiają, że tabela od razu, "starannie na linijki" - oczywiście FastReport będzie starał się dopasować nakładające się obiekty do tabeli - ale można uzyskać do 9 (!) komórek z pary obiektów, nie spodoba ci się wynik!
Tworzenie pliku XLS z Delphi za pomocą fastreport
Tak, dokument zawiera duże tabele, listy wielopoziomowe, ilustracje, mapy, kody kreskowe i myślisz, jak przenieść je do programu Excel? Nie będę się rozwodzić nad tworzeniem raportu tutaj ponownie – dodaj komponnety TfrxReport, TfrxPDFExport i TButton do formularza, napisz
1 |
frxReport1.ShowReport();
|
dla przycisku, skompilować raport i uruchomić okno podglądu wyników.
Widzimy okno podglądu i przycisk Zapisz.
Kliknij plik Excel 97/2000/XP (możesz znaleźć inny sposób na wdrożenie tego za pomocą poniższego kodu, jeśli chcesz zapisać, jeśli bezpośrednio jako biff8 i nie chcesz lub nie musisz wyświetlać okna podglądu i dać możliwość wysłania go do drukowania). Pojawi się okno ustawień eksportu do XLS. Pamiętamy, że raporty w FastReport są podzielone na strony, prawda? Co powinniśmy z nim zrobić w programie Excel? I oto co!
Narzędzia FastReport pomagają wybrać strony naszego dokumentu do wysłania do programu Excel, niektórych stron lub zakresu.
I, w zasadzie, jak będzie wyglądał wynik: podziel na strony, pozostaw oryginalny formularz, ułóż wszystko na jednej stronie lub podziel na części z daną liczbą linii.
Można określić, gdzie zapisać plik programu Excel (magazyn lokalny, wysłać go jako e-mail lub przekazać do chmury).
Otwórz po wyeksportowaniu — wynikowy plik zostanie otwarty przez program Microsoft Excel natychmiast po wyeksportowaniu.
Możesz zapisać go jako plik z rozszerzeniem .xls w magazynie lokalnym, wysłać go jako e-mail lub przesłać do chmury (Dropbox, OneDrive, Box.com, GoogleDrive).
Informacje o usłudze, które również trafią do pliku Excel: tytuł, autor, słowa kluczowe, wersja dokumentu, aplikacje, kategoria, menedżer i komentarz do pliku.
Ochrona – ochrona hasłem dokumentu (opcjonalnie można ustawić potwierdzenie).
Jeśli ustawisz niepusty ciąg hasła, wygenerowany plik będzie chroniony hasłem. Hasło jest zawsze zapisywane w znakach Unicode i musi być krótsze niż 256 znaków Unicode.
Opcje – konfigurowanie dokumentu w celu większej wizualnej korespondencji z oryginalną wersją (WYSIWYG), eksportowanie obrazów i obrazów do arkusza kalkulacyjnego, wyświetlanie obramowań komórek, dostosowywanie rozmiaru strony, usuwanie pustych wierszy (bardzo ważna opcja dla zaoszczędzenia miejsca), eksportowanie formuł.
Jeśli nie musisz ustawiać takich szczegółowych parametrów, możesz po prostu zostawić wszystko domyślnie.
Wyślij do excel(Biff8) z Delphi / Lazarus kod
Bezpośrednie zapisywanie Biff8 XLS z Delphi/Lazarus | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
procedury TForm1. Button1Click(Nadawca: TObject); zaczynać {Generowanie raportu. Raport musi zostać wygenerowany przed wyeksportem} frxReport1. PrepareReport(); {Ustaw zakres stron do wyeksportowania. Domyślnie eksportowane są wszystkie strony wygenerowanego raportu} frxBIFFExport1. Liczba stron := '2-3'; {Ustaw kolejność podziału: z opcją SingleSheet na, wszystkie strony dokumentu będą znajdować się na jednym arkuszu frxBIFFExport1.SingleSheet := Prawda; Jeśli ustawisz wartość ChunkSize, każdy arkusz będzie miał określoną liczbę wierszy. W takim przypadku arkusz SingleSheet powinien być ustawiony na frxBIFFExport1.ChunkSize := 50; Ustawimy kolejność domyślną, gdy każdy arkusz wygenerowanego raportu odpowiada arkuszowi książki} frxBIFFExport1. SingleSheet := False; frxBIFFExport1. Rozmiar fragmentu := 0; {Ustaw, czy plik wynikowy ma być otwarty po wyeksportowaniu} frxBIFFExport1. OpenAfterExport := Fałsz; {Ustawianie, czy ma być wyświetlany postęp eksportu (pokaż, która strona jest obecnie eksportowana)} frxBIFFExport1. ShowProgress := Fałsz; {Ustawianie, czy ma być wyświetlane okno dialogowe z ustawieniami filtru eksportu} frxBIFFExport1. ShowDialog := Fałsz; {Ustaw nazwę wynikowego pliku.} {Należy pamiętać, że jeśli nazwa pliku nie zostanie ustawiona i wyłączysz okno dialogowe filtru eksportu,} {on plik nazwa wybór dialog będzie nadal wyświetlany} frxBIFFExport1. Nazwa pliku := 'C:\Output\test.xls'; {Wypełnij odpowiednie pola na karcie Informacje} frxBIFFExport1. Tytuł := 'Twój tytuł'; frxBIFFExport1. Autor := 'Twoje imię'; frxBIFFExport1. Słowa kluczowe := "Twoje słowa kluczowe"; frxBIFFExport1. Wersja := 'Twoja wersja'; frxBIFFExport1. AppName := 'Twoja aplikacja'; frxBIFFExport1. Temat := 'Twój temat'; frxBIFFExport1. Kategoria := "Nazwa kategorii"; frxBIFFExport1. Firma := "Nazwa firmy"; frxBIFFExport1. Menedżer := 'Nazwa menedżera'; frxBIFFExport1. Komentarz := 'Twój komentarz'; {Wypełnij pole hasła na karcie Ochrona} frxBIFFExport1. Hasło := 'Hasło użytkownika'; {Ustawianie właściwości dokumentu (karta Opcje)} {Właściwość WYSIWYG jest włączona z niedokładnością <= 2, wartość domyślna to 10} frxBIFFExport1. Niedokładność := 10; {Ustaw, czy mają być eksportowane obrazy} frxBIFFExport1. Zdjęcia := Prawda; {Ustaw, czy mają być wyświetlane linie siatki} frxBIFFExport1. GridLines := Prawda; {Ustaw, czy chcesz skalować strony, aby pasowały} frxBIFFExport1. FitPages := False; {Ustaw, czy usunąć puste wiersze} frxBIFFExport1. DeleteEmptyRows := False; {Ustaw, czy formuły mają być eksportowane} frxBIFFExport1. ExportFormulas := Prawda; {Eksportowanie raportu} frxReport1. Eksport(frxBIFFExport1); koniec; |
Jakie są efekty korzystania z tej opcji tworzenia arkuszy Excel z Delphi? Przede wszystkim jest to znacznie szybsze i bardziej niezawodne niż pisanie XLS Biff8 z OLE-container (możesz porównać sam/sama); ma więcej możliwości (o ile oczywiście nie chcesz jedynie wyeksportować StringGrid 100x100 do Excela, który na pewno będzie zainstalowany na komputerze bez możliwości aktualizacji);
Jest niezależny od platformy (aplikacje Linuksa wykonane w Lazarusie z łatwością wygenerują XLS - a następnie możesz je otworzyć w czymś takim jak Open Office / Libre Office); formatowanie, właściwości tekstu, kolory, obrazy, kody kreskowe, mapy, prymitywy graficzne eksportowane z raportu do wynikowego arkusza kalkulacyjnego Programu Excel zostaną zapisane (ale należy pamiętać, że Libre Office nie pokazywał obrazów, w przeciwieństwie do MS Excel).
Nasz dokument demonstracyjny ze zdjęciami (rybami) w Biff8 XLS. Każde zdjęcie jest umieszczone we własnej komórce.
Raport z mapami w programie Excel XLS (biff8). Niektóre komórki zostały scalone.
Są jednak ograniczenia – spowodowane przez sam wybrany format! Liczba wierszy i kolumn, które można wyeksportować na jednej stronie arkusza kalkulacyjnego programu Excel — oto fragment kodu:
1 2 |
BiffMaxRow = $fffe; BiffMaxCol = $fe; |
W przeciwnym razie mogłoby dojść do uszkodzenia podczas otwierania w PROGRAMIE MS Excel, plik nie zostałby otwarty. Pozwolę sobie przypomnieć, że ten format nie jest już obsługiwany. Na szczęście Microsoft poszedł dalej i ( jednak nieco późnej niż FastReport) zdał sobie sprawę z zalet XML jako podstawy formatu przechowywania. W następnym artykule opowiemy, jak zapisać plik XML Excel z Delphi / Lazarus.
*Podziękowania dla naszego dobrego przyjaciela Bruno Fierens z zespołu oprogramowania TMS za pomoc i korektę tego artykułu!
Codeless fishfacts demo, generuje obrazy fishfacts w plikach Excel
http://www.tmssoftware.biz/flexcel/doc/vcl/samples/delphi/reports/range-reports/index.html
Aby to zrobić z kodem, należy użyć APIMate jak wspomniano tutaj:
http://www.tmssoftware.biz/flexcel/doc/vcl/guides/getting-started.html#2-creating-a-more-complex-file-with-code