-1
Tags:
delphi
Skrevet af
Bruger #4179
@ 22.02.2006
Indhold:Denne 1 del af ”Databaser i Delphi 7” kommer til at handle om Excel databaser. Jeg vil prøve og beskrive dette emne så selv nybegyndere kan følge med. Jeg har valgt at kalde denne artikel ”Databaser i Delphi 7” da jeg ikke er sikker på i hvilke andre versioner af Delphi dette kan bruges, men det burde kunne gå fra version 5 til 8.
I vil komme til at læse om hvordan man connecter til en Excel fil fra delphi så I kan hente, gemme og slette data fra filen. Alt der behøves til denne artikel er: Delphi 7 og Microsoft Office. Dette er måske ikke den bedste måde at bruge en database på, men det er en start og det er så nemt at selv nybegyndere i Delphi kan følge med.
Start:For at kunne connecte til en excel fil skal vi jo lige have en først, så lad os starte med det. Vi gør det ikke ret kompliceret, så vi laver kun 2 tabeller og 3 records. Tabeller er de lodrette med overskrift som fortæller os hvad der skal stå i den tabel. Records er de vandrette med data, deraf kommer ordet ”Records”. Nå men, lad os komme i gang så vi kan se noget resultat.
Åbn Excel.
I A1 skal der stå: ”Navn”
I A2 skal der stå: ”Tlf”
Derefter laver du 3 records med navn og nummer, f.eks.
Mor: 99999999
Far: 88888888
Keld: 12345678
Efter at du har gjordt dette færdigt, gem da filen som: ”Tlf.xls” på dit C:\\ i mappen Tlf. Hvad er så det næste skridt? Jo, nu skal vi til at lave programmet.
Åbn Delphi.
Vælg Filer og derefter Close All.
Vælg Filer igen og derefter New>Application.
Nu er vi sikre på at vi har et helt nyt projekt. Bare for at være på den sikre side.
Du har nu en helt ren Form og på den skal du smide,
1x Button (Standard) (Caption: Hent)
1x Combobox (Standard)
1x Label (Standard) (Caption: Angiv Adresse: )
2x Edit (Standard) (Text edit1: C:\\Tlf\\Tlf.xls - Text edit2: SELECT * FROM [Sheet1$] )
1x Statusbar (Win32)
1x DbGrid (Data Controls)
1x DbNavigator (Data Controls)
1x ADOConnection (ADO)
1x DataSource (Data Access)
1x ADOQuery (ADO)
Dette skal du så sætte op så det ligner det jeg har lavet.
[img id="1036"]
Når du har gjort det går vi i gang med noget kode.
Vi starter med at programmere FormCreate.
Vælg Form1 i Object Treeview.
Vælg derefter fanen “events” i vinduet nedenunder, Object Inspector.
Så skal du finde den rubrik der hedder ”OnCreate” og dobbeltklikker på det tomme felt som er ud for.
Nu kan du se at selve Source-koden kommer frem og markere der hvor du skal skrive.
Nu skal du så skrive følgende kode:
procedure TForm1.FormCreate(Sender: TObject);
begin
AdoConnection1.LoginPrompt := False;
AdoQuery1.Connection := AdoConnection1;
DataSource1.DataSet := AdoQuery1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
Application.OnException := DisplayException;
end;
Det denne kode gør, er at så snart programmet starter bliver disse indstillinger indlæst i programmet. AdoConnection1.LoginPrompt giver den en indstilling at den ikke vil spørge om brugernavn og pass da vi ikke har noget på vores excel fil. Derfor er den sat til False.
AdoQuery1.Connection giver den indstilling at den spørger om hvordan den skal forbinde til vores excel fil, dette skal den få fra ADOConnection, derfor skriver vi AdoConnection1.
DataSource1.DataSet siger en smule om sig selv, den spørger hvor data kilden skal hentes, og derfor skriver vi simpelthen AdoQuery1 da den får excel filen ind i vores program.
DBGrid1.DataSource og DBNavigator1.DataSource spørger hvor de kan hente deres data/records, der skriver vi DataSource1 da den sørger for kilden.
Application.OnException giver den indstilling at når programmet kommer med en fejl vil den blive vidergivet til DisplayException.
Du kan allerede nu prøve og ”Run” dit program. Men det eneste der sker er at den kommer med en fejl om at den ikke ved hvad DisplayException er. Dette er selvfølgelig fordi der mangler noget kode endnu. Lad os rette op på det og skrive koden til DisplayException. Men dette kan ikke gøres ved hjælp af Object Inspector, du skal her skrive hele koden selv.
Find din Source kode frem og vælg et tom linie, for nu skal du skrive denne kode ind:
procedure TForm1.DisplayException(Sender: TObject; E: Exception);
begin
StatusBar1.SimpleText := E.Message;
end;
Denne kode smider simpelthen fejlen videre til vores StatusBar1 i bunden af programmet og vil blive vist der.
Efter dette er du stadig ikke færdig med denne kode, for hvis du prøver at køre programmet nu, vil du bare få flere problemer. Det der mangler, er ganske enkelt at du trykker på Ctrl+Shift+C - dette gør således at denne procedure bliver oprettet i programmet så den bliver set når programmet starter. Hvis du prøver at ”Run” programmet nu, kan du se at det kører, men der er stadig ingen data. Hvorfor? Jo, vi har jo stadig ikke fortalt programmet hvor det skal lede efter excel filen. Lad os komme i gang med det.
Du skal nu ligesom ved DisplayException finde en tom linie og skrive denne kode ind:
procedure TForm1.ConnectToExcel;
var strConn : widestring;
begin
strConn:='Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Extended Properties=Excel 8.0;';
AdoConnection1.Connected:=False;
AdoConnection1.ConnectionString:=strConn;
try
AdoConnection1.Open;
AdoConnection1.GetTableNames(ComboBox1.Items,True);
except
ShowMessage('Kan ikke forbinde til excel fil, tjek om '
+ Edit1.Text + ' eksisterer!');
raise;
end;
end;
Når du har skrevet hele denne kode skal du igen trykke på Ctrl+Shift+C - for at oprette proceduren i programmet.
Alt hvad der står efter strConn:= fortæller hvilken slags connection der skal bruges, hvor den skal finde filen (i dette tilfælde ved hjælp af Edit1) og hvilken excel man har benyttet. Der skal stå Excel 8.0 når du benytter Excel 97, Excel 2000, Excel 2002 eller ExcelXP, og Excel 5.0 når du bruger Excel 95. Derefter resetter Adoconnection ved at lukke for databasen og derefter åbne den igen. Efter alt dette er sket åbner den selve filen ”Tlf” og henter dens tabeller. Men det er ikke det sidste der sker, hvis den ikke kan finde filen vil den komme med en fejl om at man skal tjekke om excel filen eksisterer.
Men dette er simpelthen ikke nok. Vi skal ikke kun connecte, vi skal også hente den data som er i excel filen. Dette gøres med denne kode som skal arbejde sammen med vores Button. Du skal nu igen finde en tom linie og skrive hele denne kode, når det er sket skal du igen trykke på Ctrl+Shift+C - for at oprette proceduren. Skriv følgende:
procedure TForm1.FetchData;
begin
StatusBar1.SimpleText:='';
ConnectToExcel;
AdoQuery1.Close;
AdoQuery1.SQL.Text:=Edit2.Text;
try
AdoQuery1.Open;
except
ShowMessage('Kan ikke læse data fra excel filen, tjek om '
+ Edit1.Text + ' eksisterer!');
raise;
end;
end;
Denne kode fortæller programmet at den ved hjælp af ConnecToExcel proceduren skal åbne databasen og derefter hente de records som er i excel filen.
Det sidste vi mangler for at have et brugbart program er simpelthen at lave den kode som skal få FecthData i funktion. Dette skal gøres i knappens OnClick.
Dobbeltklik på vores ”Hent” knap og skriv følgende:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
FetchData;
end;
Nu kan du så prøve at ”Run” programmet. Problemet er bare at der ikke sker noget. Det er her Edit1 kommer ind, der skal du skrive stien hvor din excel fil ligger og derefter går det som en leg. Men dette er ikke slutningen. Du kan lave en masse om i disse koder! F.eks. kan ved at lave nogle ændringer fjerne Edit1, Edit2 og Button1. Som du kan se når du henter de records der er, så er DBGrid´en for lille, men dette kan også ændres med nogle ændringer i ADOQuery1. Men alt dette er gør det selv!
[img id="1037"]
Hvis det er at nogen ikke kan finde ud af det vil jeg med glæde skrive det i min forhåbentlig næste artikel Del 2 som kommer til at handle om Microsoft Access og Delphi 7.
Men indtil da er i velkommen til at sende mig en mail eller smide en kommentar!
Jeg håber denne artikel er bare en smule værd så den kan give nogen en smule inspiration.
Komplet Sourcekode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure DisplayException(Sender: TObject; E: Exception);
procedure ConnectToExcel;
procedure FetchData;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
AdoConnection1.LoginPrompt := False;
AdoQuery1.Connection := AdoConnection1;
DataSource1.DataSet := AdoQuery1;
DBGrid1.DataSource := DataSource1;
DBNavigator1.DataSource := DataSource1;
Application.OnException := DisplayException;
end;
procedure TForm1.DisplayException(Sender: TObject; E: Exception);
begin
StatusBar1.SimpleText := E.Message;
end;
procedure TForm1.ConnectToExcel;
var strConn : widestring;
begin
strConn:='Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Extended Properties=Excel 8.0;';
AdoConnection1.Connected:=False;
AdoConnection1.ConnectionString:=strConn;
try
AdoConnection1.Open;
AdoConnection1.GetTableNames(ComboBox1.Items,True);
except
ShowMessage('Kan ikke forbinde til excel fil, tjek om '
+ Edit1.Text + ' eksisterer!');
raise;
end;
end;
procedure TForm1.FetchData;
begin
StatusBar1.SimpleText:='';
ConnectToExcel;
AdoQuery1.Close;
AdoQuery1.SQL.Text:=Edit2.Text;
try
AdoQuery1.Open;
except
ShowMessage('Kan ikke læse data fra excel filen, tjek om '
+ Edit1.Text + ' eksisterer!');
raise;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FetchData;
end;
end.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (11)
Enlig en delphi artikel
Og så et udmærket emne som man kan bruge
Dánjal: Ja, det er den guide som jeg har formidlet på, synes jeg, en bedre og mere brugervenlig måde. Men det er jo kun jer som bestemmer.
// Benz
hey har du en kerste
kasper
Super god artikel! Men hvor er 2'eren, som lovet?
Eller... Destår del 1..
Der står*
Ser fed ud
Men er der et link hvor man kan downloade programmet?
Ser fed ud
Men er der et link hvor man kan downloade programmet?
Ser fed ud
Men er der et link hvor man kan downloade programmet?
Du skal være
logget ind for at skrive en kommentar.