Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CSV Datei in Excel importieren (https://www.delphipraxis.net/87417-csv-datei-excel-importieren.html)

DelphiManiac 28. Feb 2007 13:09


CSV Datei in Excel importieren
 
Hallo,

ich habe zurzeit folgendes Problem:

Ich lese aus einem Gerät Datensätze aus (max 277.000). Diese Datensätze beinhalten bestimmte Infos:
-Uhrzeit
-Datum
-Messwert

Diese Daten will ich in eine Vorlage laden und diese dann unter anderem Namen abspeichern.
Um die Daten zwischen zu speicher (und da Excel pro Sheet ja die 65535 Zeilen Begrenzung hat,
teile ich meine Datensätze auf max. 5 CSV Dateien auf. Diese will ich nun in Excel importieren, weiss aber nicht
wie ich da vorgehen kann?

Evtl habt ihr ja den Tipp der mich weiterbringt!!
Danke euch

mkinzler 28. Feb 2007 13:30

Re: CSV Datei in Excel importieren
 
Du könntest mit TextFiles oder CSVDataSets arbeiten.

madtom 28. Feb 2007 13:32

Re: CSV Datei in Excel importieren
 
Hallo,

1.) kannst Du die CSV-Datei nicht einfach mit Excel öffnen. Excel speichert doch auch
auf Wunsch im CSV-Format ab.

2.) Über Daten / Externe Daten / Textdatei importieren (als Filter "alle Dateien" solltest
Du eine CSV-Datei auch einlesen können

MfG

madtom

mkinzler 28. Feb 2007 13:52

Re: CSV Datei in Excel importieren
 
Sein Problem ist nur, das die Datei mehr Zeilen hat, als Excel maximal erlaubt (65535) und er die Datei in mehrere CSV-Dateien splitten will.

DelphiManiac 28. Feb 2007 15:09

Re: CSV Datei in Excel importieren
 
Das Splitten der Datein in 5-6 csv Dateien habe ich hinbekommen,
will aber über Delphi die Dateien (die ich zwischgespeichert in den CSV Dateien abgelegt habe)
nun in meine Vorlage importieren und dann unter anderem Namen abspeichern.

also ungefährt so

Daten1.csv --> Sheet 1 Vorlagendatei
Daten2.csv --> Sheet 2 Vorlagendatei
Daten3.csv --> Sheet 3 Vorlagendatei
Daten4.csv --> Sheet 4 Vorlagendatei

Danke

ibp 28. Feb 2007 15:54

Re: CSV Datei in Excel importieren
 
schreib dir doch einfach ne vba-makro dafür!

DelphiManiac 28. Feb 2007 16:10

Re: CSV Datei in Excel importieren
 
Hi,

mit Visual Basic bin ich nicht so bewandert...
Ausserdem weiß ich dann gar nicht, wie ich das Makro dann aufrufe und die Datei übergebe :(

ibp 28. Feb 2007 17:19

Re: CSV Datei in Excel importieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab dir mal ein kleines beispiel angehängt

1. makros aktivieren natürlich

2. in modul1 musst du nur noch die anzahl zeilen je sheet eintragen.

3. du kannst dann deine ganzen daten in einer datei belassen, es werden dann immer wieder sheets angefügt!

DelphiManiac 1. Mär 2007 08:39

Re: CSV Datei in Excel importieren
 
Hallo,

hey danke für deine Beispiel VBA Modul.
Kann ich diese Modul auch von Delphi aus ansprechen, ich will ja über Delphi meine Daten aus der CSV in die Excelvorlage
bekommen und diese unter anderem Namen abspeichern (ohne Excel anzuzeigen + ohne Benutzerinteraktion)

Danke.

mkinzler 1. Mär 2007 08:48

Re: CSV Datei in Excel importieren
 
Dann wäre es doch besser, das ganze direkt in Delphi zu erledigen.
1.Laden der Datei in einem CSV-DataSet
2.OLE-Verbindung zu Excel erstellen
3.Durch das DataSet gehen
4.Alle 65535-Datensätze ein neues Sheet erzeugen
5.Daten in Excelzellen kopieren.
6.datei Speichern (Excel)
7.Excel schließen.

DelphiManiac 1. Mär 2007 09:00

Re: CSV Datei in Excel importieren
 
@mkinzler:

Hi ich denke auch das das der beste Weg ist.
Zitat:

1.Laden der Datei in einem CSV-DataSet
hier weiss ich nicht so genau wie ich da vorgehe, bzw. was ist genau ein CSV Dataset?
Zitat:

2.OLE-Verbindung zu Excel erstellen
3.Durch das DataSet gehen
4.Alle 65535-Datensätze ein neues Sheet erzeugen
5.Daten in Excelzellen kopieren.
6.datei Speichern (Excel)
7.Excel schließen.
Die anderen Punkte sollte ich hinbekommen, jedoch werde ich mich dann nochmal hier melden, und ihr könnt mir
sagen ob, das OK ist bzw, was man dann noch verbessern kann.

Vielen Dank schonmal

mkinzler 1. Mär 2007 09:03

Re: CSV Datei in Excel importieren
 
Eine Komponente, die eine CSV-Datei als TDataSet kapselt, zB. TJvCSVDataSet aus der JVCL. Auf dieses kannst du dann mit .First, .Next, ... usw navigieren.

DelphiManiac 1. Mär 2007 09:07

Re: CSV Datei in Excel importieren
 
Hallo, und danke,

ich habe die Jedis installiert und gucke mir das gleich mal an, das heißt ich kann zeileweise navigieren und ein
Datensatz ist eine Zeile?

Melde mich dann später nochmal :)

mkinzler 1. Mär 2007 09:33

Re: CSV Datei in Excel importieren
 
Zitat:

Das heißt ich kann zeileweise navigieren und ein
Datensatz ist eine Zeile?
Ja und wenn die CSV einen Hedaer hat, legt er die Felder im DataSet auch automatisch aan, sonst muß man das manuell machen.

ibp 1. Mär 2007 09:39

Re: CSV Datei in Excel importieren
 
darf die kompo was kosten? dann schau dir die advstringgrid-kompo von tms-software an. die macht das alles von alleine, da reichen dann ca 3 zeilen code!

DelphiManiac 1. Mär 2007 16:14

Re: CSV Datei in Excel importieren
 
@mkinzler:

Was meinst du genau mit Header?

Datum;Uhrzeit;Messwert //--> Meinst du so einen Header?
22.01.2007;12:33;3424

Gruß

mkinzler 1. Mär 2007 16:15

Re: CSV Datei in Excel importieren
 
Ja.

DelphiManiac 1. Mär 2007 16:19

Re: CSV Datei in Excel importieren
 
@mkinzler:

Kannst du mir ein Beispiel (am besten ein paar Zeilen Code) nennen,
wie das CSVDataset verwende?

Danke dir!

mkinzler 1. Mär 2007 16:29

Re: CSV Datei in Excel importieren
 
Kannt du komplett in der IDE erledigen.
1.)Separator setzen
2.)Filename auswählen
3.)Active auf true Setzen.

Nun kann du wie auf eine Table zugreifen.

DelphiManiac 2. Mär 2007 09:45

Re: CSV Datei in Excel importieren
 
Ok danke, das probiere ich mal aus.

Gruß
DelphiManiac

DelphiManiac 2. Mär 2007 10:00

Re: CSV Datei in Excel importieren
 
@mkinzler:

Wie greife ich denn nun auf die einzelnen Daten des Datesets zu?
Was macht denn genau .First und .Next?

mkinzler 2. Mär 2007 10:06

Re: CSV Datei in Excel importieren
 
Es ist ja ein DataSet also
Delphi-Quellcode:
CSV.First;
while not CSV.Eof do
begin
     ... := CSV.FieldByName('<feldname').Value; // Zugriff über Feldnamen oder
     ... := CSV.Fields[<pos>].Value; // Zugriff über Feldposition

    CSV.Next;
end;

DelphiManiac 2. Mär 2007 10:45

Re: CSV Datei in Excel importieren
 
Hallo, danke,

probiere das gleich mal,

habe nur irgendwie das Problem, dass das zeilenweise Einfügen der Werte in die Excelvorlage bei einem
Sheet (~65500 DS) mehr als 30 sec dauert,

das mal 5 würde dann insgesamt fast 4 min daueren, deswegen such ich einen weg die CSV Dateien zu importieren,
anstatt sie zeilenweise einzufügen, so wie es bisher mache:

Delphi-Quellcode:
rocedure WriteDataToExcel(Vorlage:String;Filename:string);
var Excel: Variant;
  I: Integer;
begin
  try
    // Ole Objekt erstellen und öffnen
    Excel:=CreateOleObject('Excel.Application');
    // Excel Fenster sichtbar machen
    Excel.Visible:=true;
  //  Excel.SaveData := False;
    // Neue Arbeitsmappe erstellen
    Excel.Workbooks.Open(Vorlage);
    // In Zelle A1 schreiben
//    Excel.Cells[1,1].Value:='!!!!!!!!!!!!!!!!!!!!!!!!!!!!';
    try
//      Excel.activesheet.name := 'Datalogging1';
      for I := 0 to 65531 do
      begin
        Excel.Cells[i+3,1].Value:=IntToStr(i);
        Application.ProcessMessages;
      end;

      // Testen ob das Excelsheet 'Übergabedaten' vorhanden ist
//      Excel.Sheets('Übergabedaten').Select;

    except
//      Exception.Create('<Tabelle Übergabgedaten existiert nicht>');
    end;
    Excel.DisplayAlerts:=false;
  finally
    Excel.Quit;
  end;
end;
...
Vielen Dank!

mkinzler 2. Mär 2007 10:50

Re: CSV Datei in Excel importieren
 
Soll die Datei, die erzeugt wird umbedingt ne Excel-datei sein, oder würde der Umweg über mehrere CSV-Dateien auch gehen?

DelphiManiac 2. Mär 2007 10:55

Re: CSV Datei in Excel importieren
 
Hallo,

also ich erzeuge bisher ja schon bis zu 5 CSV -Dateien.

Die nur die eigentlichen Datensätze beinhalten,

Jede CSV bildet den Inhalt eines Sheets ab.
Nun will ich diese CSV in die Sheets der Vorlagendatei (Excel) laden und unter anderem Namen speichern
also ungefähr so:

Vorlagendatei[Sheet1] <-- CSVDatei1
Vorlagendatei[Sheet2] <-- CSVDatei1
Vorlagendatei[Sheet3] <-- CSVDatei1
Vorlagendatei[Sheet4] <-- CSVDatei1
Vorlagendatei[Sheet5] <-- CSVDatei1

Gruß

DelphiManiac 2. Mär 2007 11:33

Re: CSV Datei in Excel importieren
 
Ich habe jetzt mal die CSV-Datei in Excel importiert und davon ein Makro erzeugt,

habe aber Probleme das in Delphi zu übersetzen :???:

Folgendes Makro:

Delphi-Quellcode:
'
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\daten1.csv", _
        Destination:=Range("A3"))
        .Name = "daten1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
Vielleicht ist ja jemand hier, der Excel und VBA Profi ist, der mir das in Delphi übersetzen kann.

Gruß und Dank
DelphiManiac

DelphiManiac 6. Mär 2007 10:50

Re: CSV Datei in Excel importieren
 
Hallo,

wenn ich das oben genannte Makro (das ich in Delphi umgesetzt habe) nutze um 65535 Zeilen zu importieren,
und dann das Sheet wechslen will und die nächsten 65535 Zeilen importieren will, dann kommt die Meldung,
dass für diese Aktion zu wenig Speicher vorhanden ist, woran liegt das.
Und wie kann ich das umgehen?

Gruß
DelphiManiac


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.

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