Avatar billede the_party_dog Nybegynder
25. oktober 2004 - 16:06 Der er 10 kommentarer og
2 løsninger

Excel og Select bestemt range

Hej alle

Jeg er total ny til delphi, men har et større projekt for, som skal udlæse date fra en excel fil.


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.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('Unable to connect to Excel, make sure the workbook ' + Edit1.Text + ' exist!');
    raise;
  end;
end;(*ConnectToExcel*)

procedure TForm1.FetchData;
begin
StatusBar1.SimpleText:='';

  ConnectToExcel;

  AdoQuery1.Close;
  AdoQuery1.SQL.Text:=Edit2.Text;
  try
    AdoQuery1.Open;
  except
    ShowMessage('Unable to read data from Excel, make sure the query ' + Edit1.Text +
                ' is meaningful!');
    raise;
  end;

end;

I min Edit2, skriver jeg min select command, som jeg får data ind med. Den ser således ud:
SELECT * FROM [Sheet1$]

Det virker også ved små filer, men jeg har et sheet med over 250 kolonner i breden, og nok 1000 rows nedaf.

Jeg leder efter en måde at bede om et bestemt område, f.eks
A21:D21, eller hele A-D og bare indtil slut af sheet'et.

Nogen som kan hjælpe?
Avatar billede borrisholt Novice
26. oktober 2004 - 09:04 #1
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 09:06 #2
Linket virker desværre ikke...
Avatar billede borrisholt Novice
26. oktober 2004 - 09:08 #3
Jeg troede ikke du ville være så hurtig .. Prøv igen om 30 minutter ....
;)

Jens B
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 09:09 #4
Sidder skam og venter... Har bare ikke fattet det folk skriver på nettet... :(
Avatar billede borrisholt Novice
26. oktober 2004 - 09:17 #5
har lavet et temporært link til dig :

http://www.borrisholt.com/www/eksperten/excel.zip
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 09:20 #6
WOW!!!! Det var advanceret... Damn.... Det ser cool nok ud...

Men skal slet ikke bruge alt det der smarte designet noget lige pt.. Jeg er i test fase, og skal først lære en masse om hvordan data kommer ind og ud igennem excel...

Kan du give mig en lille hurtig forklaring? Når jeg skriver min select kommando, hvordan beder jeg den så om at tage et bestemt range?
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 09:26 #7
kort fortalt, så du måske kan hjælpe mig på rette vej, uden at spilde for meget af din egen tid :)

Jeg har en excel fil, den skal jeg bare åbne, behøver slet ikke starte excel op i baggrunden eller noget. I den fil, er der et sheet, og kun et sheet til rådighed. Der skal jeg f.eks. selecte A21:D21, altså det data som ligger i de 4 rækker, og udskrive dem i det DBgrid, ved hjælp af et DataSource objekt...

Har ingen idé om hvordan jeg gør... Har jeg søgt og søgt og søgt....
Avatar billede borrisholt Novice
26. oktober 2004 - 09:58 #8
uses
  EXCELS;
procedure TForm1.Button1Click(Sender: TObject);
var
  Excel: TExcel;
  MacroFile: TFileName;
  i: Integer;
  Reply: string;
  RowStart, ColStart, RowEnd, ColEnd: Integer;
  Range: TStringList;
begin
  Excel := TExcel.Create(Self);

  Screen.Cursor := crHourGlass;
  try

    Excel.Connect; { Same as Excel.Connected := True; }
    MacroFile := ExtractFilePath(ParamStr(0)) + 'Mappe2.xls';
    (*
    Filen der skal åbnes og læses fra
    *)
    if FileExists(Macrofile) then
      Excel.OpenMacroFile(MacroFile, False);

    RowStart := 1;
    ColStart := 1;
    RowEnd := 11;
    ColEnd := 4;

    Excel.Exec(Format('[SELECT("R%dC%d:R%dC%d")]', [RowStart, ColStart, RowEnd, ColEnd]));

    (*
      Ex. [SELECT("R1C1:R11C4")]
      Læses som
      Select
        FRA : Row 1, Cell 1
        TIL : ROW 11, Cell 4
    *)

    Memo.Lines.Clear;
    Reply := Excel.Request('Selection');
    i := Pos(#9, Reply);

    while i > 0 do
    begin
      Memo.Lines.Add(Copy(Reply, 1, i - 1));
      Delete(Reply, 1, i);
      i := Pos(#9, Reply);
    end;

    Memo.Lines.Add(Reply);
    (*
      Tilføj HVAD der er selected !
    *)
    Range := TStringList.Create;
    Excel.GetRange(Rect(ColStart, RowStart, ColEnd, RowEnd), Range);
    Memo.Lines.AddStrings(Range);
    (*
      Tilføj DATA fra hvadder er selected !
    *)

    Excel.CloseMacroFile;
    Excel.Disconnect;
  finally
    FreeAndNil(Range);
    FreeAndNil(Excel);
    Screen.Cursor := crDefault;
  end;

end;

end.
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 13:10 #9
Min compiler laver en fejl, den siger: Excels.dru - file not found.

De tutorials jeg har prøvet på nettet, har de brugt ADOQuery, og ADOConnection. Er det den helt forkerte måde at gå frem? Fordi det eneste jeg faktisk mangler, er bare hvordan jeg i min Query får et bestemt range selected...
Avatar billede the_party_dog Nybegynder
26. oktober 2004 - 13:11 #10
ups..

Excels.dcu - file not found...

Kører Delphi 7.0...
Avatar billede borrisholt Novice
26. oktober 2004 - 14:02 #11
Fra min demo fra før skal du ligge Excels.pas sammen med dit nye projekt ... Jeg har bare vist hvordan man får fat i det tekst der er selected. Du må selv komme det i databasen.

Jens B
Avatar billede the_party_dog Nybegynder
27. oktober 2004 - 08:16 #12
okay... Jeg takker... Må se om jeg kan få det til at virke... Mange mange tak for din tid... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester