Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi mit ADO XML-Datei in Tabelle kopieren! Hilfe (https://www.delphipraxis.net/98868-mit-ado-xml-datei-tabelle-kopieren-hilfe.html)

legionen 3. Sep 2007 10:13

Datenbank: ADO • Zugriff über: AdoConnection

mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hallo,

Ich habe ein (für mich als Anfänger) großes Problem:

Ich muss Excel XLS-Dateien in eine Tabelle vom Typ TSringGrid bringen. Die Excel Dateien haben zwar Grundsätzlich eine Struktur, aber fehlen manchmal Daten (gerade zum Ende der Spalten). Ich brauche auch nur einige Daten aus der Excel Tabelle, genauer einige Spalten. Mein Program soll dann die Daten benutzen um Rechnungen mit Ihnen anzustellen. Bei den auszulesenen Daten handelt es sich um Datumsdaten, Integer und Strings.

Ich kann jetzt schon die Daten aus der Excel Datei in Delphi übernehmen und (so glaube ich) das für mich richtige Tabellenfenster öffnen:

if opendialog1.Execute then
begin
AdoConnection1.Close;
AdoConnection1.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + opendialog1.FileName + ';' +
'Mode=Read;Extended Properties=''Excel 8.0'';' +
'Persist Security Info=False';
AdoConnection1.Open;
end;

AdoTable1.Active := false;
AdoTable1.Connection := AdoConnection1;
AdoTable1.TableName := '[Tabelle1$]';
AdoTable1.Active := true;

Jetzt kenne ich aber keinen Befehl, wie ich eine specielle Zelle (Spalten - und Zeilen Nummer) auslesen kann, der Befehl:

cells [1,i] := AdoTable1.Fields.FieldByNumber(i).text;

macht mir große Probleme, da er irgentwie nur die vollen Zellen anzeigen kann, aber sobald eine leere Zelle oder ein Zeilenumbruch kommt Fehlermeldungen anzeigt.

Habe auch gesehen, dass viele die Exceldateien über TDBGrid und TDataSource anzeigen lassen, aber wie ich die Daten gezielt auslesen und vor allem dann auch bearbeiten kann weiss ich nicht.

Schon mal vielen vielen Dank für die Hilfe!!!!!!!!!!!

Stephan

legionen 3. Sep 2007 11:43

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Ich weiß, für euch scheint diese Frage hier sicherlich trivial, aber ich habe damit wirklich ein großes Problem!


Noch eine weitere Frage am Rande: Welche Option muss ich bei TStringGrid aktivieren werden, damit ich mehrere Zellen aufeinmal kopieren, aber besonders (z.B. aus Excel) einfügen kann?

Vielen Dank nochmal!

marabu 3. Sep 2007 13:25

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Herzlich willkommen in der Delphi-PRAXiS, Stephan.

Wenn dein Excel-Sheet nicht tabellarisch ausgefüllt ist, dann ist der Zugriff über ADO nicht besonders geschickt. Auf eine spezielle Zelle über ADO zugreifen ist auch etwas von hinten durch die Brust ins Auge, wie mir scheint. Sicher, du kannst den Record-Pointer (RecNo) der ADOTable enstprechend setzen und über Fields[] auf die Zelle zugreifen, aber bei vielen leeren Zellen und angesichts deines Problems solltest du vielleicht besser über OLE Automation auf die Excel.Cells zugreifen.

Freundliche Grüße

legionen 3. Sep 2007 13:52

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hallo, also schon einmal danke für die Hilfe!

Also Grund für meine Frage lautet, dass ich ein Programm schreiben muss, das Rechnungen ausführen soll, die unter Excel selber nicht möglich sind. Da aber die Daten in einer Excel-Datei sind, und es mit einigen 1000. Daten einfach viel zu viele sind zum abschreiben, wollte ich mir die Tabelle durch ADO ins Programm übertragen.

Zu deiner Antwort: Doch die Tabelle hat schon eine feste Struktur: Je "Fall" werden 20 verschiedene Daten erfasst, aber oft fehlen Daten, so zu jedem "Fall" nicht alle 20 Daten erfasst werden. Ich selber brauche daraus auch nur 7 verschiedene Daten, die vollständig vorhanden sind, ich weiss nur nicht, wie ich die Tabelle nach dem einlesen durch ADO genauer durchsuchen kann. (Wenn ich mir die Ausgabe über TDBGrid und TDataSource angucke, dann sind die Daten schon in einem Spalten/Zeilen Schema abgespeichert, ich weiß halt nur nicht, wie ich in ADOTable auch nach Zeile/Spalte abfragen ausführen kann und mir Werte aus der Tabelle ausgeben lassen kann: z.B. alle Werte Spalte 5, Zeile 2 bis 100 .....

Wie mir deine antwort helfen soll weiß ich leider auch nicht, da ich eigentlich nicht extra Excel starten will um die Werte in mein Programm zu übernehmen.

marabu 3. Sep 2007 14:40

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Was mögen das für Berechnungen sein, die du nicht in Excel selbst programmieren kannst? Weißt du sicher, dass Excel das nicht kann, oder kannst du es dir nur nicht so richtig vorstellen?

Wenn man Berechnungen in Excel nicht durch Zellformeln abdecken kann, dann verwendet man VBA. Hilft auch das nicht weiter, so kann man (auch mit Delphi) ein Excel-Add-In schreiben. Erst wenn das alles nicht die Lösung ist exportiert man die Daten und versucht es außerhalb von Excel zu lösen.

Zu deinem ADO-Zugriff: Wenn du statt der ADOTable ein ADODataset verwendest, dann solltest du gezielt die sieben Spalten anfordern können, die dich interessieren. Die Syntax ist dann: SELECT [Spaltenname1$], [Spaltenname2$] FROM [TAbelle1$] oder ähnlich. Die Spaltennamen lassen sich eventuell auch einfach durch Spaltennummern ersetzen: SELECT 1,2,3,4 FROM [Tabelle1$]. Statt des WorkSheet-Namens kann auch ein Bereichsname angegeben werden, die Syntax ist mir gerade nicht geläufig, da ich selbst nicht mit Excel arbeite. Probiere mal selbst ein wenig.

Freundliche Grüße

legionen 3. Sep 2007 14:49

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Also erstmal RIESIG VIEL DANKE für die Hilfe, werde es sofort ausprobieren!

Ich weiss nicht, ob es sich mit Excel umsetzen kann, aber ich muss eine Datenmenge in meherer Intervalle aufspalten, wobei jeder Intervall eine eigene Kurvenfunktion bekommen soll. Das läuft mit vielen Schleifen und beliebig vielen Daten und am Ende sollen diese in einer Tabelle dargelegt werden.

Aber ich kann mit Excel vielleicht kleine Formeln schreiben, aber nicht visualbasic :( daher scheint für mich Delphi die Beste Lösung, da ich (abgesehen von ADO etc.) doch ein klein wenig Erfahrung habe.......

legionen 4. Sep 2007 08:36

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Ich muss leider wieder um Hilfe bitten!!!

Ich verstehe nicht wie ich genau die ADODataSet ansprechen kann?

Wie muss der Befehl aussehen, um in meine Zelle der Tabelle genau einen bestimmten Wert aus der Excel Datei auszulesen:

Bsp: Aus Excel Datei : Spalte B; Zeile 10
In Delphi Tabelle: Spalte 3; Zeile 5

Table1.cells[3,5] := ????????????

und falls es mit DataSet funktioniert, wie kann ich dann die ADODataSet aktivieren/deaktiveren und die Daten aus ADOCOnnection auf ADODataSet rüberbekommen???

Bei ADOTable habe ich den Befehl AdoTable1.Fields.FieldByName('NAME').text gefunden, aber wie heißt der Tabellen Name? Als ich es mit B10 probiert habe, lautete die Fehlermeldung, dass dieses Feld nicht vorhanden sei......

Ich Bitte um schnelle Hilfe!!!!!!!!!!

legionen 4. Sep 2007 11:56

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Ich weiß, dass ich euch sicherlich mit diesen Fragen nerve, aber ich brauche diese Informationen für meine Diplomarbeit.
Ich sehe keine andere Möglichkeit die Excel-Dateien über mein Delphi-Programm zu bearbeiten. Das Programm ist soweit auch schon fertig, das einzige was mir eben fehlt ist das Importieren der Daten aus der Excel-File.... da es sich um mehrere Tausende Daten handelt kann ich diese auch nicht eben so abtippen..... ich bitte euch um Hilfe! Wenn, und das sehe ich ja, ihr soviel Ahnung von Datenbanken habt, und auch eine Ahnung habt, wie man sich diese Daten angucken und bearbeiten kann, dann sollte es doch kein Problem für euch sein...

PS: Falls das gar nicht gehen sollte... und das kann ich mir nicht Vorstellen, da ich ein anderes Program hier im Forum gesehen habe, das die Tabelle unter Delphi mit allen Spalten und Zeilen perfekt wiedergeben konnte, aber halt nicht einzelne Zellen.... würde ich mich freuen, wenn ihr mir das auch sagen könntet und mir dann vielleicht eine andere Lösung geben könntet, den soetwas muss ja schaffbar sein, aber wenns mit ADO gehen würde wäre mir das am liebsten, da ich dort ja wenigstens einen teil schon programmiert habe.

marabu 4. Sep 2007 13:27

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hallo, keine Panik!

Ich habe testweise ein WorkSheet angelegt:

Code:
        A      B
        Name   Height
     1  AAAA   10
     2  BBBB   20
     3  CCCC   30
                =Sum(B1:B3)
Folgende Zugriffe habe ich beispielhaft implementiert:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  DataSource.DataSet := ADODataSet;
  ADODataSet.Connection := ADOConnection;
  ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'
      + 'Data Source="test.xls";Extended Properties="Excel 8.0;HDR=Yes";'
      + 'Persist Security Info=False';
  ADOConnection.LoginPrompt := False;
  with ADODataSet do
  begin
    CommandType := cmdTable;
    CommandText := '[data$]'; // Worksheet: data
    Open;
    // Lookup von Wert "BBBB" in Spalte "Name"
    if Locate('Name', 'BBBB', []) then
    begin
      Edit;
      ShowMessage(VarToStr(FieldValues['Height']));
      FieldValues['Height'] := self.Edit.Text;
      Post;
      ShowMessage(VarToStr(FieldValues['Height']));
    end;
    // Zugriff über Zeilenindex (Eins-basiert)
    RecNo := 1;
    ShowMessage(FieldValues['Name']); // AAAA
    // Zugriff über Spaltenindex     // 10
    ShowMessage(Fields[1].Value);
    Connection.Close;
  end;
end;
Kommst du zurecht?

Freundliche Grüße

legionen 30. Sep 2007 23:09

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Sorry,

das ich erst jetzt wieder frage:

bezogen das gennante beispiel von marabu und auch danke (auch wenns zu spät kommt):

nehmen wir an ich habe nur die zwei spalten "name" und "height". aber ich kenne nicht den inhalt der spalten.
weder werte noch anzahl. also nicht das da AAAA, BBBB, CCCC, bzw. 10, 20 u. 30 steht und auch nicht, das es 3 zeilen mit daten sind.

Ich will jetzt aber mit einem Algorithmus diese beiden Spalten auslesen und auch mit der zugehörigkeit der zeilen.
Also soll AAAA und 10 zusammengehören; BBBB und 20 .....
und das halt bis zum Ende, hier CCCC und 30.....

wie kann ich die jetzt so auslesen, egal ob es 3 zeilen oder 1000 zeilen sind. wie ich die daten speichere weiss ich, aber nicht wie ich sie auslese!

ich probiere es mal mit meinen worten auf den punkt zu bingen:
- Unbekannter Inhalt der Tabelle, nur die erste Spalte ist immer gleich (Name, Height etc.)
- Keine extra Spalte für Nummerierung (ist leider so vorgegeben und kann nicht geändert werden)
- Brauche Algorithmus, der ALLE relevanten Spalten ausliest, aber die Daten der Spalten immer Zeilenweise ausliest.
- Dazu braucht man sicher einen Befehlt der weiss wann in einer Spalte die letzte Zeile erreicht ist.

BITTE helft mir, bisher muss ich die daten per hand eingeben... bei 3000 werten viel arbeit :'(


SCHONMAL GANZ VIELEN DANK und sorry, dass ich mich einfach nicht gut (eher gar nicht ;) ) in der informatik-fachsprache ausdrücken kann......

marabu 1. Okt 2007 06:10

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Guten Morgen,

schau mal in diesen Thread - da findest du die Methode SpecialCells und auch noch eine Alternative.

Freundliche Grüße

EDIT: es hat das l am Ende von .html gefehlt...

legionen 1. Okt 2007 06:38

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hi! wieder mal DANKe für deine schnelle Antwort.... sieht so aus, als wärst du hier eine echt ständige Größe :)

aber :( wenn ich dem Link folgen will, dann kommt immer die Meldung:

Fehler: 404 - Datei nicht gefunden

Die Seite, die Du aufrufen wolltest, ist auf diesem Server nicht vorhanden.
Du kannst das Forum über einen der Links im Seitenkopf ansteuern.

......... ich werde es heute abend nochmal probieren, aber sieht erstmal so aus, als würde das nicht funktionieren :(

Über einen schon funktionierenden Algorithmus *räusper* würde ich mich aber auch freuen :P

Bis dann!

peschai 1. Okt 2007 06:53

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hallo,
Mich würde noch eine Kleinigkeit am Rande hier interessieren:
Wäre die ursprüngliche Fehlermeldung eventuell nicht aufgetreten wenn er anstelle
Delphi-Quellcode:
AdoTable1.Fields.FieldByNumber(1).Text;
das folgende benutzt hätte
Delphi-Quellcode:
AdoTable1.Fields.FieldByNumber(1).AsString;

marabu 1. Okt 2007 08:28

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
Hallo Peter,

Zitat:

Zitat von peschai
... Wäre die ursprüngliche Fehlermeldung eventuell nicht aufgetreten ...

der Zugriff über Text ist äquivalent zu AsString, solange kein event handler für OnGetText() bereit gestellt wird.

Ich habe ein wenig getestet und festgestellt, dass der Treiber einem fast die ganze Arbeit abnimmt:

Delphi-Quellcode:
procedure ReadCells(grid: TStringGrid; xlData: TDataSet);
var
  i: Integer;
begin
  with xlData do
    while not Eof do
    begin
      for i := 0 to Pred(xlData.FieldCount) do
        grid.Cells[i, Pred(RecNo)] := Fields[i].AsString;
      Next;
    end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  DataSource.DataSet := ADODataSet;
  ADODataSet.Connection := ADOConnection;
  ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="test.xls";'
      + 'Extended Properties="Excel 8.0;HDR=Yes";Persist Security Info=False';
  ADOConnection.LoginPrompt := False;
  ADODataSet.CommandType := cmdTable;
  ADODataSet.CommandText := '[data$]'; // Worksheet: data
  ADODataSet.Open;
  StringGrid.RowCount := ADODataSet.RecordCount;
  StringGrid.ColCount := ADODataSet.FieldCount;
  ReadCells(StringGrid, ADODataSet);
  ADOConnection.Close;
end;
Wenn das WorkSheet nur eine Tabelle enthält, dann war es das schon. Andernfalls kann man einfach auf das erste Auftreten einer leeren Zelle reagieren.

Freundliche Grüße

legionen 3. Okt 2007 10:53

Re: mit ADO XML-Datei in Tabelle kopieren! Hilfe
 
VIELEN VIELEN DANK!!!!!!! Es hat endlich funktioniert und ich kann die Excel-Tabelle in meine Delphi-Tabelle übernehmen!!!!! Ich weiß gar nicht was ich sagen soll, aber ihr habt mir den arsch gerettet!!! DANKE!!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz