29.12.2019, Vladimír Klaus, navštíveno 2915x
V diskuzních skupinách na Facebooku jsem narazil na dotaz, jak zpracovat Excel soubory v Delphi. V komentářích se objevilo neskutečné množství různých metod, většinou nefunkčních nebo příliš komplikovaných. Překvapivě tam nikdo neuvedl přímé databázové řešení, které bude popsáno v tomto článku. Navíc se jedná o elegantní a velice účinné řešení.
Jaké jsou tedy možnosti, jak se dostat k datům v Excelu z Delphi:
- přeuložte XLS(X) do CSV a pak zpracujte jako textový soubor (pozor na kódování)
- použijte například DevEx komponentu TdxSpreadSheet, která umí soubory nativně načíst, ale i zobrazit a provádět s nimi spoustu dalších operací, takže jde vlastně o takový vestavěný "Excel"
- propojte se přes OLE přímo s nainstalovaným Excelem, otevřete v něm soubor a používejte další OLE funkce (odpovídající příkazům z Visual Basicu)
- přistupte k souboru databázově
Pro databázový přístup budeme potřebovat klasické ADO komponenty, tedy TADOConnection, TADOTable a samozřejmě TDataSource a pro tyto účely i jednoduchý DBGrid. Aby bylo možné se napojit na MS Excel, je třeba mít tzv. zprostředkovatele, což je v tomto případě Microsoft Office 12.0 Access Database Engine OLE DB Provider.
Pokud tohoto poskytovatele nemáte, je třeba nainstalovat Microsoft Access Database Engine 2010 Redistributable.
Pak už jen vyplníte cestu k souboru, tedy zdroji dat a otestujete připojení.
Pokud je vše OK, nastavíte u tabulky Connection a vyberete TableName, což je v tomto případě název listu v Excelu. A také je třeba nastavit TableDirect:=true.
Do tabulky přidáte všechny sloupce a nastavíte, že je tabulka aktivní. Informace z Excelu by měly být ihned vidět.
A takto vypadají data v Excelu. Všimněte si, že i jinak formátované datumy (když to jsou opravdu datumy) se v předchozí mřížce zobrazí s odpovídajícím (zde českým) formátem a že se tedy s nimi opravdu pracuje jako s datumy, nikoliv jako s textovými řetězci.
Další práce s daty je už vlastně zcela jasná – pracuje se s nimi jako s normální databází/tabulkou, a to, že jde o data z Excelu, je vlastně úplně skryté.
Přístě si ukážeme, jak stejnou věc řešit ve Visual Studiu resp. v C#.
Zdroje:
- https://www.connectionstrings.com/ace-oledb-12-0/
- https://blogs.msdn.microsoft.com/farukcelik/2010/06/04/accessing-excel-files-on-a-x64-machine/
- https://stackoverflow.com/questions/18952420/connect-to-excel-2007-file-using-adoconnection-in-delphi7
- https://www.microsoft.com/en-us/download/details.aspx?id=13255