Entwickler-Ecke
Dateizugriff - Excel SLK (SYLK) einlesen
Stecky2000 - Fr 23.04.10 08:11
Titel: Excel SLK (SYLK) einlesen
Ich hab mal ne Frage zum Einlesen von Daten.
ich hab ja bereits Daten von csv nach Delohi ins Stringgrid eingelesen mittels
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
Delphi-Quelltext
1:
| StringGrid.Rows[i].CommaText := StringList[i]; |
Stecky2000 - 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 - 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:
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 try excel := CreateOleObject('Excel.Application'); excel.visible := TRUE; except ShowMessage('Excel konnte nicht gestartet werden !'); end; end; |
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.
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 - Do 20.05.10 00:37
Hallo Stecky2000,
bei mir funktioniert das so:
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 end; olevEXCEL.DisplayAlerts:=FALSE; olevEXCEL.Workbooks.Open(Filename:=DateiName); olevEXCEL.DisplayAlerts:=TRUE; end; |
Bis bald Chemiker
Stecky2000 - 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....
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!