Autor Beitrag
Stecky2000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Fr 23.04.10 08:11 
Ich hab mal ne Frage zum Einlesen von Daten.

ich hab ja bereits Daten von csv nach Delohi ins Stringgrid eingelesen mittels
ausblenden Delphi-Quelltext
1:
StringGrid.Rows[i].CommaText := StringList[i];					


nur wollte ich nun die Daten aus einem Excel *.SLK Format einlesen (SYLK).
Um Ehrlich zu sein, nachdem ich mir eine *.slk Datei im Editor geöffnet habe, hab ich gleich aufgegeben, sprich, ich habe keinen blassen Dunst wie ich das machen könnte.

Die Daten sehen so aus (Ausschnitt):

ID
P;Pdd/mm/yyyy
P;Phh:mm
F;P0;Y2;X1
C;Y2;X1;K40287
F;P1;Y2;X2
C;Y2;X2;K0.000000000000
F;P0;Y3;X1
C;Y3;X1;K40287
F;P1;Y3;X2
C;Y3;X2;K0.000694444447
F;P0;Y4;X1
C;Y4;X1;K40287
F;P1;Y4;X2
C;Y4;X2;K0.001388888886

Der einzige Weg der mir einfallen würde, wäre Excel von Delphi aus öffnen und Excel die *.slk Datei einlesen lassen und danach die Daten per OLE in StringGrid zu übertragen (hab ich schon mal mir *.xls gemacht).
Aber das dürfte recht langsam sein.
Deshalb frage ich euch ob es ggf. einen direkten Weg gibt, ähnlich dem
ausblenden Delphi-Quelltext
1:
StringGrid.Rows[i].CommaText := StringList[i];					
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Do 29.04.10 21:00 
So, 100 Clicks und keine Idee..!!??

Mir ist noch eine weitere Idee gekommen, die wahrscheinlich schneller ist als die OLE Übertragung.

Da ja das Sylk Format laut Wikipedia ein Microsaft Format ist für das es keine offiziel Daten gibt, so hab ich es verstanden, werde ich eben Microsaft damit arbeiten lassen, sprich:

Ich lade von Delphi aus Excel, lasse die Sylk-Datei laden und speichere sie einfach von Excel aus, ferngesteuert, als csv-Datei.
Die kann ich mit delphi recht schnell lesen.

Das mit dem OLE teste ich evtl. trotzdem noch.
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Mi 19.05.10 19:29 
Hallo Ihr alle....

Ich flippe bald aus, ich schaffe es nicht :-((

Ich konnte lange nicht an dem Thema arbeiten, nun bin ich seit 3 Tagen dran, google wie blöd, schaue in alle möglichen Foren, zeiche mit Excel VBA Code auf..

Es klappt einfach nicht.

Mal von Vorne:

Ich habe jetzt den Weg gewählt, da ich das sylk-Format nicht direkt importieren kann, die Sylk-Datei mit Excel zu öffnen um sie dann mit Excel als csv wieder zu speichern.

Ich habe schon öfter xls-Files mit Excel geöffnet und wieder gespeichert, ist kein Hexenwerk.
Aber nun, mit Sylk, verhält sich Excel komplett anders!

Also, wenn ich Excel manuell, also ohne Delphi, starte, dann den Öffnendialog wähle und den Filter auf *.* setze, wähle ich die Sylk-Datei an und sie wird korrekt mit 8 Spalten eingelesen.

Gehe ich jedoch von delphi aus, öffne Excel, dann nutze ich die Delphi VCL OpenDialog mit Filter auf *.* oder *.slk, dann finde ich ebenfalls das sylk-File
und versuche es mittels dieser Zeilen in Excel einzulesen, wie ich es auch bei xls-files tue:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
with OpenDialog1 do
  begin
    InitialDir := sRootDir + SelectedSaison + '\Bedarf\';
    DefaultExt := 'slk';
    Filter := 'SYLK-Dateien (*.slk)|*.slk';

    if Execute then
      begin
        //Excel öffnen
        try
          excel := CreateOleObject('Excel.Application');
          excel.visible := TRUE;   //zum debuggen auf TRUE setzen
        except
          ShowMessage('Excel konnte nicht gestartet werden !');
        end;
        // Excel geöffnet
      end;



ausblenden Delphi-Quelltext
1:
2:
Excel.DisplayAlerts:=True;
Excel.Workbooks.Open(OpenDialog1.Filename);


Die Alerts habe ich auf True gesetzt und siehe da, ständige Fehlermeldungen "der Datensatz Nr.xyz konnte nicht gelesen werden"
Setze ich die Alerts auf false habe ich als resultat ein in Excel eingelesenes Sylk-file welches aber nicht in 8 Spalten getrennt ist sonder ich finde nur irgendwelche zahlen in der ersten Spalte, immer identische.

Ich hatte einen VBA Code aus dem Excel Makroeditor bei dem ich den Excelinternen Opendialog nutze aber den weis ich nicht in Delphi zu nutzen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Sub Makro1()

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogOpen)

With fd
.Filters.Clear
.Filters.Add "SYLK", "*.slk"
.InitialFileName = "D:\"
End With
fd.Show
fd.Execute

End Sub



Ich hab auch schon mit

Excel.Workbooks.Open
Excel.Workbooks.OpenText

versucht, beides mit Fülle an Parametern, immer das selbe resultat.

Wenigstens einen Tipp, welchen Weg ich einschlagen soll...bitte!
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Do 20.05.10 00:37 
Hallo Stecky2000,
bei mir funktioniert das so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.btnSYLK_DateiformatLadenClick(Sender: TObject);
var
  DateiName: TFileName;
begin
  if SYLK_OpenDialog.Execute then
  begin
    DateiName:= SYLK_OpenDialog.FileName
//    Workbooks.Open Filename:= _
//        "C:\Users\Internet1\Documents\Daten und Programme\Auftragszeilen Übersicht.slk"
  end;
  olevEXCEL.DisplayAlerts:=FALSE;
  olevEXCEL.Workbooks.Open(Filename:=DateiName);
  olevEXCEL.DisplayAlerts:=TRUE;
end;

Bis bald Chemiker
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Do 20.05.10 06:56 
Vielen Dank Chemiker ;-)

Aber leider ist das Problem immer noch nicht gelöst.
Ich habe zunächst deinen Code in Delphi7 in ein neues Form einzugeben, es ist ja fast das gleiche was ich schon mal hatte, wenn auch stark verkürzt.
Das Resultat war das gleiche, die Daten landen alle als eine Zahl in der ersten Spalte!

Nun hab ich mir gesagt "der Chemiker weiß wovon er spricht" und habe einfach manuell in Excel meine Sylk-Datei geöffnet und sie nochmal als TestSYLK in ein anderes Laufwerk gespeichert. Dabei hat Excel gemeldet, dass eventuell Merkmale enthalten sind die nicht mit dem Sylk-Format kompatibel sind!
Deshalb habe ich die neue Sylk-Datei mit dem Notepad geöffnet und sie sieht tatsächlich anders aus!
Man erkennt klar das Sylk-Format aber es sind andersartige Elemente drin.

Wie auch immer, diese neue Sylk lässt sich mit deinem Code richtig öffnen, ich nehme an mit meinem bisherigen auch.

Das bedeutet, evtl. gibt es verschiedene Sylk-Formate (neuere, ältere).

Da ich diese Sylk-Dateien immer von einem Planungssystem bekomme, würde ich mir schon gerne sparen, erst manuell die Sylk-Datei mit Excel2007 neu zu speichern.
Excel2007 beweist ja auch, dass es dieses, vielleicht alte, Sylk-Format manuell richtig öffnet.

Hast Du ggf. noch eine Idee, wie ich Excel2007 bewegen kann die Datei richtig zu öffnen?

Hier mal die zwei Sylk-Dateiformate:

Format alt:

ID
P;Pdd/mm/yyyy
P;Phh:mm
F;P0;Y2;X1
C;Y2;X1;K40287
F;P1;Y2;X2
C;Y2;X2;K0.000000000000
F;P0;Y3;X1
C;Y3;X1;K40287
F;P1;Y3;X2
C;Y3;X2;K0.000694444447
F;P0;Y4;X1
C;Y4;X1;K40287
F;P1;Y4;X2
C;Y4;X2;K0.001388888886
F;P0;Y5;X1
C;Y5;X1;K40287
F;P1;Y5;X2
C;Y5;X2;K0.002083333333

Und hier die gleiche Datei neu mit Excel2007 gespeichert:

ID;PWXL;N;E
P;PGeneral
P;P0
P;P0.00
P;P#,##0
P;P#,##0.00
P;P#,##0\ _(0;;\-#,##0\ _(0
P;P#,##0\ _(0;;[Red]\-#,##0\ _(0
P;P#,##0.00\ _(0;;\-#,##0.00\ _(0
P;P#,##0.00\ _(0;;[Red]\-#,##0.00\ _(0
P;P#,##0\ "$";;\-#,##0\ "$"
P;P#,##0\ "$";;[Red]\-#,##0\ "$"
P;P#,##0.00\ "$";;\-#,##0.00\ "$"
P;P#,##0.00\ "$";;[Red]\-#,##0.00\ "$"
P;P0%
P;P0.00%
P;P0.00E+00
P;P##0.0E+0
P;P#\ ?/?
P;P#\ ??/??
P;Pdd/mm/yyyy

Sieht also irgendwie anders aus.

Ist schon seltsam....