Autor Beitrag
KNafetz
Hält's aus hier
Beiträge: 2

Windows XP
Delphi 7
BeitragVerfasst: Mi 15.03.06 18:39 
Hallo! :)
Ich hoffe, dies ist der richtige Bereich für meine Frage. Wenn nicht, dann einfach verschieben bitte!


Und zwar möchte ich gerne aus einer HTML-Tabelle eine Excel-Tabelle machen, wobei ich gewisse Spalten und Zeilen löschen will, weil sie für mich nicht relevant sind. Es soll eine Art Datenbank werden, weil alle paar Tage (oder welcher Zeitraum nachher benötigt wird), einige neue Spalten hinzukommen, sodass die Veränderungen von gewissen Werten über einen längeren Zeitraum verfolgt werden können.

Da ich mich mit dieser Thematik (noch) nicht auskenne, weil wir das in der Schule nicht gemacht haben, es auch nicht machen werden und der Lehrer keine Ahnung davon hat, habe ich mich in den Weiten des Internets nach Informationen umgeguckt. Dabei bin ich auf Indy-Client-Komponenten gestoßen, mit denen ich mich ein wenig beschäftigt habe.
Meine Idee wäre nun, dass ich per IdHTTP.Get den Quellcode der HTML-Seite auslesen und die mir wichtige Tabelle heraussuchen könnte.

Doch wie bekomme ich die Tabelle nun nach Excel?
Wie kann ich davor (ginge wohl mit einer Suche nach bestimmten HTML-Befehlen und Ausschneiden von Quellcodebereichen), dabei oder danach Spalten und Zeilen löschen?
Wie kann ich später Spalten und Zeilen im Excel-Dokument einfügen?
Ist meine Idee sinnvoll oder nur schwerlich zu realisieren, gibt es also bessere, weil einfachere Wege?


Danke schonmal für hilfreiche Antworten.
Falls etwas unklar sein sollte oder falsch, nachfragen, ich beiße normalerweise nicht... :wink:
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 15.03.06 20:40 
Hallo,

erstmal :welcome: in der Entwickler-Ecke.

Zum Thema Daten aus einer HTML-Tabelle auslesen hilft Dir wahrscheinlich das in der DP weiter:
Wie bekomme ich eine HTMl Tabelle in ein StringGrid
Das bezieht sich zwar auf die Webbrowser-Komponente, kann aber (da du per IdHTTP.Get den Quellcode der HTML-Seite holst) auch mit dem MSHTML Parser umgesetzt werden.
Spalten/Zeilen löschen, einfügen usw. kann man im StringGrid.
Die Daten könntest Du dann in eine EXCEL-Datei schreiben, dazu findest Du bestimmt was hier im Forum oder auf anderen Delphi-Seiten.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 16.03.06 08:41 
Hallo,

ich mache aus den Html Tabellen csv Dateien, die sich auch sehr gut komprimieren lassen.
Dazu muss man natuerlich vorher wissen was man extrahieren will, ob die Tabelle immer dir x.te ist oder durch eine Uebschrift gekennzeichnet ist,etc.

Gruss Horst
KNafetz Threadstarter
Hält's aus hier
Beiträge: 2

Windows XP
Delphi 7
BeitragVerfasst: Do 16.03.06 16:49 
Erstmal danke ich euch für eure Antworten.


Wie gesagt, bin ich Schüler (12. Klasse) und von WebBrowser, Indy-Clients, StringGrid und eigentlich allen Komponenten, mal von einigen aus der Registerkarte "Standard" sowie Timer und Image abgesehen, haben wir in der Schule nichts behandelt. Daher ist dies alles neu für mich, was ich auch überhaupt nicht als Entschuldigung vor mir hertragen möchte, aber dennoch verstehe ich sicherlich von Delphi nicht mal 1% dessen, was ihr so wisst.
Ich habe mich gestern und gerade eben etwas mit StringGrid beschäftigt und komme aber bei ein paar Sachen nicht weiter, weil ich nicht weiß, wie ich herausfinde, ob StringGrid bestimmte Sachen kann oder wie ich das herausfinden soll (Delphi-Hilfe und Google haben nur ein wenig geholfen).


Ich beschreibe am besten noch mal etwas genauer, was ich mir für das Programm vorgestellt habe.
Ich habe eine Excel-Datei nach folgendem Muster, die das Programm auf den neuesten Stand bringen soll:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
ALTE TABELLE
Name   Wert1   Wert2   Wert3   ...
A      10      20      30      ...
B      500     250     500     ...
C      100     90      80      ...
D      4       4       4       ...

NEUE TABELLE
Name   Wert0   Wert1   Wert2   ...
A      25      10      20      ...
B      400     500     250     ...
B1     13      27      86      ...
D      5       4       4       ...

Der aktuellste Wert soll also immer links von den anderen Werten hinkommen. Als "Schwierigkeit" kommt hinzu, dass ggf. neue Zeilen hinzukommen (wie B1), die alphabetisch eingeordnet werden müssen, oder dass ggf. alte Zeilen herauszunehmen sind (wie C).

Für diese Aktualisierung muss nicht nur eine HTML-Tabelle auf einer Seite verarbeitet werden, sondern z.b. je eine HTML-Tabelle auf 50 Seiten.
Nun hatte vor, mir die Tabelle per IdHTTP.Get zu holen und habe ihn mit dem Tipp von Lannes in ein StringGrid gepackt:
ausblenden volle Höhe Delphi-Quelltext
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:
var Quellcode: TStrings;
    i, j: Integer;
    myDocument, Tabelle, Zeile: OleVariant;

begin
  Quellcode := TStringList.Create;
  try

    Quellcode.Text := IdHTTP.Get('www.lustige-URL.de');
    WebBrowser.Navigate('about:blank'); // leere Seite in WebBrowser laden
    myDocument := WebBrowser.Document;
    myDocument.Clear;
    myDocument.Write(Quellcode.Text); // Quellcode in WebBrowser laden
    myDocument.Close;

    Tabelle := WebBrowser.OleObject.Document.All.Tags('table').Item(3); // 4. Tabelle
    StringGrid.RowCount := Tabelle.All.Tags('tr').Length; // Zeilenanzahl im StringGrid
    for i := 0 to (StringGrid.RowCount - 1do begin
      Zeile := Tabelle.All.Tags('tr').Item(i);
      if (Zeile.All.Tags('th').Length > 0then begin // Zellen in StringGrid ausfüllen
        if (Zeile.All.Tags('th').Length > StringGrid.ColCount) then
           StringGrid.ColCount := Zeile.All.Tags('th').Length;
        if (Zeile.All.Tags('th').Item(2).InnerText <> '-'then begin
          for j := 0 to (Zeile.All.Tags('th').Length - 1do
              StringGrid.Cells[j, i] := Zeile.All.Tags('th').Item(j).InnerText;
         end;
      end;
    end;

  finally
    Quellcode.Free;
  end;
end;

Ist mein Weg sehr umständlich? Ich wollte eigentlich auf jeden Fall den idHTTP nehmen, weil ich so die ganzen Internetseiten nicht laden muss, was ja Zeit und Datendownload kostet. Doch habe ich nur den oben "gecodeten" Weg über WebBrowser->OleVariant->StringGrid. Geht das auch direkt idHTTP->StringGrid?
Jetzt habe ich Jannes' Tipp schon etwas modifizert. Es werden im StringGrid nur noch die Zellen mit Inhalt gefüllt, die ich auch brauche. Allerdings heißt das auch, dass ich im StringGrid nun viele leere Zeilen habe und keine einfache Variante zum Löschen dieser gefunden haben.
Kann ich den obigen StringGrid-Füll-Code so abändern, dass er folgendes macht?
ausblenden Delphi-Quelltext
1:
2:
3:
if (Spalte[die, in der sich z.b. Wert3 befindet]_dieser_Zeile <> '-'then
   schreibe_alle_Zellen_dieser_Zeile_voll
else gehe_zur_nächsten_Zeile_über;

Nur kann sich Wert3 in der einen Tabelle mal in Spalte 5 und in einer anderen mal in Spalte 3 oder ganz anders befinden.

Ich hoffe, ihr kommt noch mit, trotzdem um den Ablauf nochmal kurz zu schildern:
- Programm holt sich Tabelle von Internetseite1 und lädt die wichtigen Zeilen in StringGrid
- Programm holt sich Tabelle von Internetseite2 und lädt die wichtigen Zeilen in StringGrid hinzu
- Programm holt sich Tabelle von Internetseite3 und lädt die wichtigen Zeilen in StringGrid hinzu
- usw.
- Programm schreibt neue Spalte (im Beispiel Wert0) links von allen anderen Werten in Exceltabelle, sortiert alte Zeilen aus und neue alphabetisch hinzu


Nur ist mein bisheriger Ansatz dafür in Ordnung oder völlig falsch? Ich bitte euch nicht, mir mein Programm zu schreiben, aber es wäre nett, wenn ihr mir sagen könntet, welchen Weg (also welche Komponenten) ich verwenden sollte und welche Befehle ich mir angucken sollte. Weil es ist alles Neuland für mich und daher weiß ich auch nicht so recht, wonach ich suchen soll :(


[Edit by me]
Achja, zu MSHTML Parser oder wie ich den StringGrid zur Excel-Datei mache, habe ich nichts gefunden.
@Horst_H: Die Tabelle ist immer die 4. auf der Seite, die Überschrift ist immer anders.