AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel und Delphi

Ein Thema von David Martens · begonnen am 4. Feb 2010 · letzter Beitrag vom 12. Feb 2010
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Excel und Delphi

  Alt 6. Feb 2010, 11:13
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#12

Re: Excel und Delphi

  Alt 8. Feb 2010, 10:21
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:
Code:
Format Beschreibung
General Date Zeigt ein Datum und/oder eine Zeit an. Bei reellen Zahlen werden Datum und Uhrzeit angezeigt
             (zum Beispiel 4.3.93 05:34). Werden keine Nachkommastellen angegeben, so wird nur ein Datum
             (zum Beispiel 4.3.93) angezeigt. Enthält der Wert ausschließlich Nachkommastellen, so wird nur eine
              Uhrzeit ausgegeben (zum Beispiel 05:34).
              Die Anzeige von Datum und Zeit wird durch die Systemeinstellungen festgelegt.
Long Date    Zeigt ein Datum im langen Datumsformat entsprechend den Systemeinstellungen an.
Medium Date  Zeigt ein Datum im mittleren Datumsformat an, das von der Sprachversion der Host-Anwendung
              bestimmt wird.
Short Date   Zeigt ein Datum im kurzen Datumsformat entsprechend den Systemeinstellungen an.
Long Time    Zeigt eine Zeit entsprechend der Einstellung für das lange Zeitformat an, einschließlich
              Stunden, Minuten und Sekunden.
Medium Time  Zeigt eine Zeit im 12-Stunden-Format mit Stunden, Minuten und einer AM/PM-Kennung an.
Short Time   Zeigt eine Zeit im 24-Stunden-Format an (zum Beispiel 17:45).
Man muß Excel also nur dazu bringen die übergebenen Werte richtig zu interpretieren.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#13

Re: Excel und Delphi

  Alt 8. Feb 2010, 21:12
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

Re: Excel und Delphi

  Alt 9. Feb 2010, 10:48
ich war so frei und hab ein wenig getestet:
Delphi-Quellcode:
....
   { Datumsformat "erzwingen" }
  excel.activesheet.Cells.NumberFormat := 'TT.MM.JJJJ';
   { Werte schreiben }
  excel.activesheet.cells(ez+1,j+1):=zelle; {cells1..x/1..y }
....
folgende Werte wurden übergeben:

Memo1
0001
19770602
20170
22.03.1955
123456

und das hat Excel daraus gemacht:
Code:
Memo1                           <-- Text
    01.01.1900                  <-- Datum
#########################       <-- negativer Datumswert
    22.03.1955                  <-- Datum
22.03.1955                      <-- Text
    03.01.2238                  <-- Datum
Wenn man erreichen will, das Excel ein Datum als Datum erkennt, sollte man es tunlichst vermeiden, es in einem "Datumsformat" zu übergeben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#15

Re: Excel und Delphi

  Alt 11. Feb 2010, 21:41
@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.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Excel und Delphi

  Alt 12. Feb 2010, 00:44
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:
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;
Bis bald Chemiker
Miniaturansicht angehängter Grafiken
datumformatiertnachexcel_192.png  
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#17

Re: Excel und Delphi

  Alt 12. Feb 2010, 01:54
@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 := VarArrayCreate([0, TDataSource.DataSet.RecordCount - 1, 0, i - 1], varVariant);
...
Data[iRow, iCol - i] := TDataSource.DataSet.Fields.Fields[iCol].AsDateTime;
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.

Hast du deinen Code mal mit Excel 2003 aufwärs probiert. Ich glaube da hast du auch ein Problem.

Gruß David
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Excel und Delphi

  Alt 12. Feb 2010, 07:03
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz