![]() |
Re: Excel und Delphi
Hallo p80286,
wenn Du folgendes Modul in EXCEL anlegst: Sub DatumZeitSchreiben() Debug.Print #12/31/2010# Debug.Print #6:15:00 AM# Debug.Print #6:15:00 PM# Debug.Print CDate("31.12.2010") End Sub Dann werden die Daten so ausgegeben: 31.12.2010 06:15:00 18:15:00 31.12.2010 Bis bald Chemiker |
Re: Excel und Delphi
hallo Chemiker,
entschuldige das ich nochmals widerspreche, du übergibst Zeit-Werte in einem bestimmten Format (US-amerikanisch?) aber die interne Berechnung sollte wohl nicht in diesem Format erfolgen. Wenn ich der Excel-Hilfe folge, können belibige numerische Werte als Datum angezeigt (interpretiert) werden: Zitat:
Gruß K-H |
Re: Excel und Delphi
Hallo David,
sehr interessant Dein Projekt, sowas könnte ich auch gebrauchen. Meines Wissens wandelt Excel die eingegebenen bzw. aus csv-Dateien importierten Werte entweder implizit oder explizit um. Excel-intern wird dabei immer mit Real-Zahlen (Tage und Bruchteile davon seit dem Basisdatum) gearbeitet. Implizit: Kann aus der Schreibweise des Wertes auf ein Datum/Uhrzeit oder beides geschlossen werden, wird der Wert in eine Tageszahl umgerechnet und das Format der Zelle auf Datum/Uhrzeit gesetzt. Explizit: Wird eine Spalte komplett als Datum definiert, werden alle Werte als Datum/Uhrzeit interpretiert, soweit dabei ein gültiger Wert ermittelt werden kann. Fazit: Da man nie sicher sein kann, welches Datum als Nullpunkt definiert ist, sollte man Datumswerte und Uhrzeiten immer als in internationaler Schreibweise/ISO 8601 formatierten Wert angeben (z.B. "2010-02-08 20:30") und vorher der entsprechenden Spalte das gewünschte Datumsformat zuweisen. Funktioniert mit Excel-V7 (1995) genauso wie mit Open Office V3 . Können wir Deine Funktion dann irgendwann mal als Unit bewundern? bit4bit |
Re: Excel und Delphi
ich war so frei und hab ein wenig getestet:
Delphi-Quellcode:
folgende Werte wurden übergeben:
....
{ Datumsformat "erzwingen" } excel.activesheet.Cells.NumberFormat := 'TT.MM.JJJJ'; { Werte schreiben } excel.activesheet.cells(ez+1,j+1):=zelle; {cells1..x/1..y } .... Memo1 0001 19770602 20170 22.03.1955 123456 und das hat Excel daraus gemacht:
Code:
Wenn man erreichen will, das Excel ein Datum als Datum erkennt, sollte man es tunlichst vermeiden, es in einem "Datumsformat" zu übergeben.
Memo1 <-- Text
01.01.1900 <-- Datum ######################### <-- negativer Datumswert 22.03.1955 <-- Datum 22.03.1955 <-- Text 03.01.2238 <-- Datum Gruß K-H |
Re: Excel und Delphi
@Amateurprofi:
Das habe ich bei beiden getestet: heutiges Datum angeben -> im "Delphiformat" and Exfel übergeben -> in Excel steht das heutige Datum. Bei beiden die 0 angegeben -> bei beiden steht das gleiche Datum ____________________________ Ja Excel und Delphi haben den gleichen Stichtag @bit4bit: Das explizite Angeben des Formates mach ich schon und habe damit ab Version 2003 mein Problem. Aber ich probier mal die ISO8601 schreibweise, leuchtet ein. Noch kurz zum Projekt: Der Export-teil ist ja nur ein ganz Kleiner. Wenn ich mehr Zeit hätte, würde ich den "Excel-Server" neu schreiben. Momentan ist ALLES in einer Klasse. Viel eleganter wäre ein Aufteilung in die Excel-OLE-Klassen, aber darauf habe ich sowas von keine Lust, weil MS NULL Information darüber rausgibt. Siehe mein 2. Problem. Aber wenn du interesse hast, PM an mich. @all: Es geht auch eigentlich nicht um die interne Berechnung, sondern vielmehr um die "Sprache" der OLE-Schnittstelle. Als Indiz habe ich ja die Zahlen mit angeführt, aber ich kann mir nicht sicher sein, ob das italienische Excel das auch hat, oder ob das nur ein Bug der deutschen Version ist. @Chemiker und p80286: VBA rechnet intern nicht mit dem amerikanischen Format, wohl aber die OLE-Schnittstelle seit Version 2003. Intern wird logischer weise mit Zahlen (Tage seit Stichtag) gerechnet. Weil Excel da einen Unterschied macht kommt man mit VBA da auch nicht mehr weiter. |
Re: Excel und Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo David Martens,
ich habe da meine eigenen Erfahrungen. Wenn nach einem Datum filtriert wird, muss das US-Datumsformat berücksichtigt werden, sonst kommt da Unsinn raus. Wenn an Excel Daten übertragen werden sollen, sollte man Excel auch mitteilen um welche Daten es sich handelt, und nicht wundern wenn Text übertragen wird das Excel auch Text in den Zellen rein schreibt. Mit diesem Code lassen sich Problemlos die Daten aus einem StringGrid nach EXCEL übertragen:
Delphi-Quellcode:
Bis bald Chemiker
procedure TForm1.btnExcelExportClick(Sender: TObject);
var i, j:integer; Text: String; Zahl : Extended; Datum: TDateTime; begin for i:=0 to StringGrid1.rowcount-1 do begin for j:=0 to StringGrid1.colcount-1 do begin Text:=StringGrid1.cells[j,i]; if TryStrToFloat(Text, Zahl) then begin olevEXCEL.cells[i+1,j+1].Value:= Zahl end else begin if TryStrToDate(Text,Datum) then begin olevEXCEL.cells[i+1,j+1].Value := Date; end else begin olevEXCEL.cells[i+1,j+1].Value := Text; end; end; end; end; end; |
Re: Excel und Delphi
@Chemiker:
1. Ich benutze early binding um wenigstens etwas Kontrolle zu behalten. Dein Beispiel ist late binding. 2. Im Endeffekt mach ich auch genau das was du vorgeschlagens hast:
Delphi-Quellcode:
Data wird dann direkt an Excel übergeben. Wenn ich jede Zelle einzeln nach Excel schreiben würde dauert das bei 10000 Werten mal locker 5 Minuten (abhänig von System). Das ist einfach inakzeptabel.
Data := VarArrayCreate([0, TDataSource.DataSet.RecordCount - 1, 0, i - 1], varVariant);
... Data[iRow, iCol - i] := TDataSource.DataSet.Fields.Fields[iCol].AsDateTime; Hast du deinen Code mal mit Excel 2003 aufwärs probiert. Ich glaube da hast du auch ein Problem. Gruß David |
Re: Excel und Delphi
Hallo David Martens,
1. Dir ist aber bewusst das manche Befehle dann unter verschieden EXCEL-Versionen unterschiedliche Parameteranzahl haben und nicht ohne weiteres kompatibel sind. 2. Wenn es sich um 10000 Werte handelt würde ich sie in eine BIFF-Datei ablegen und anschließend mit EXCEL laden(selber übertrage ich damit ca. 100.000 Datensätze aus einer Firebird Datenbank in eine EXCEL-Datei täglich). 3. Der Code ist mit Excel 2007 und 2010 getestet dort gibt es damit keine Probleme. Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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