Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel und Delphi (https://www.delphipraxis.net/91236-excel-und-delphi.html)

Maa83 2. Mai 2007 07:55


Excel und Delphi
 
Hi,

ich exportiere Daten von Delphi nach Excel. Nun gibt es Fälle in denen ich 10-stellige Nummern die in Delphi als String gelesen werden übergeben möchte. Diese Nummern haben führende 0en. Diese Nummer wird in Excel als Zahl erkannt und die führenden 0en werden abgeschnitten.

z.B.
0000123789 in Delphi wird zu 123789 in Word

Die Methode
"ExcelApplication.Workbooks.OpenText"

hat als Parameter auch die Datentypen der einzelnen Spalten. Dies scheint Excel bei der Übergabe jedoch zu ignorieren.

Ich habe auch versucht ein ' vor die Zahl zu hängen damit Excel es als Text erkennt. In Excel direkt sieht man das ' dann ja nicht mehr. Bei der Übergabe zeigt er es aber an. Dies darf natürlich nicht sein.

Das selbe Problem habe ich mit Feldern die mit + oder - Anfangen. Hier kommt dann in Excel #NAME?

Delphi 6 Enterprise
Excel97 oder Excel2000 (hab schon beides probiert, kommt aber aufs gleiche raus)

ich hoffe es kann mir jemand helfen.

Andidreas 2. Mai 2007 08:19

Re: Excel und Delphi
 
wie arbeitest du mit excel, also über ole oder etwas anderem???

wie ist das feld/spalte in excel definiert, als text oder zahl???

hflick 2. Mai 2007 09:22

Re: Excel und Delphi
 
Zitat:

Zitat von Maa83
Hi,

ich exportiere Daten von Delphi nach Excel. Nun gibt es Fälle in denen ich 10-stellige Nummern die in Delphi als String gelesen werden übergeben möchte. Diese Nummern haben führende 0en. Diese Nummer wird in Excel als Zahl erkannt und die führenden 0en werden abgeschnitten.

Wenn Du '00003 sendest, sollte das Problem behoben werden, da Strings mit ' in Excel gekennzeichnet werden.

Maa83 2. Mai 2007 13:05

Re: Excel und Delphi
 
@hflick: das funktioniert, wie ich etwas weiter unten geschrieben habe, leider nicht. Das ' wird mit angezeigt. Es steht dann in der Zelle '0003. Erst wenn ich manuell dieses Feld in Excel bearbeite und wieder verlasse (mit Enter) dann merkt Excel das er das Hochkomma nicht mit anzeigen soll.

@Andidreas: ja, mit OLE. Excel erkennt den übergebenen Wert als Zahl obwohl ich ihm bei der Methode ExcelApplication.Workbooks.OpenText mitgeben das es ein Text ist.

hflick 2. Mai 2007 13:06

Re: Excel und Delphi
 
Zitat:

Zitat von Maa83
@hflick: das funktioniert, wie ich etwas weiter unten geschrieben habe, leider nicht. Das ' wird mit angezeigt. Es steht dann in der Zelle '0003. Erst wenn ich manuell dieses Feld in Excel bearbeite und wieder verlasse (mit Enter) dann merkt Excel das er das Hochkomma nicht mit anzeigen soll.

Hmm... probiere mal " in der deutschen Version. Ich weiss, dass ich das vor Jahren mal aus Lotus Notes heraus so gemacht habe...

Maa83 2. Mai 2007 13:14

Re: Excel und Delphi
 
klappt leider auch nicht.

wenn ich den Wert in "" stelle, also "0003" dann ignoriert er das einfach. Macht daraus also auch einfach 3

Wenn ich nur ein " davor Stelle klappt das ganze auch nicht.

hflick 2. Mai 2007 15:23

Re: Excel und Delphi
 
Zitat:

Zitat von Maa83
klappt leider auch nicht.

wenn ich den Wert in "" stelle, also "0003" dann ignoriert er das einfach. Macht daraus also auch einfach 3

Wenn ich nur ein " davor Stelle klappt das ganze auch nicht.

Also Delphi/Win32? Ich schaue mal...

Maa83 2. Mai 2007 15:33

Re: Excel und Delphi
 
ja, Delphi6/Win32

wär super wenn du mir helfen könntest :)

hflick 2. Mai 2007 17:31

Re: Excel und Delphi
 
Zitat:

Zitat von Maa83
ja, Delphi6/Win32

wär super wenn du mir helfen könntest :)

Ja, gerne. Breche mir gerade nur unter Win32 die Finger. Werde das wohl mit .NET machen, um rauszubekommen, was nun erforderlich ist....

hflick 2. Mai 2007 20:20

Re: Excel und Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Maa83
ja, Delphi6/Win32

wär super wenn du mir helfen könntest :)

So, habe mir das mal angesehen. Das Property der Zelle heisst "Value2" -- warum auch immer. Dem weise ich einfach '00003 zu und es geht. Ich habe hier nen englisches Excel, das einzige was noch sein kann, dass Du " benutzen musst. Ich denke jedoch, das Property ist wichtig...

Hier der komplette Code meiner Unit. Das Formular ist nur nen Button... Ich habe das gesamte Projekt angehängt.

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls,
  Microsoft.Office.Interop.Excel, System.Reflection;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.nfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  lApp: ApplicationClass;
  empty: System.&Object;

begin
  lApp := ApplicationClass.Create;

  empty := System.&Type.Missing;

  lApp.Workbooks.Add(empty);
  lApp.Visible := True;
  lApp.ActiveCell.Value2 := '''000000003';
end;

end.

Chemiker 2. Mai 2007 23:08

Re: Excel und Delphi
 
Hallo Maa83,

man kann in Excel benutzerdefinierte Zahlenformate zuweisen. Dies kann man sowohl für Text, als auch zum Beispiel für ein Datum verwenden.

Die Funktion in Excel ist: NumberFormat

Delphi-Quellcode:
unit excelzahlUnit1;


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 //   Button1: TButton;
 //   procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
var Excel : Variant;
{$R *.dfm}
{------------------------------------------------------------------------------}
{ EXCEL starten                                                               }
{------------------------------------------------------------------------------}
function f_EXCEL (var m_EXCEL : Variant): boolean;
begin
   try
    m_EXCEL := CreateOleObject('Excel.Application');
    Result := TRUE;
  except
    ShowMessage('Excel konnte nicht gestartet werden!');
    Result := FALSE;
    Exit
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);

var zahl : string;
begin
  if f_Excel(Excel)then  // Excel startet
    ShowMessage('MSExcel ist erfolgreich gestartet worden!!')
   else
     ShowMessage('MSExcel konnte nicht gestartet werden!!');

  Excel.Visible := TRUE; // TRUE = Excel sichtbar.

  Excel.Application.Workbooks.Add; // Neue Arbeitsmappe öffnen in EXECL

  Excel.Worksheets ['Tabelle1'].Activate;


  zahl:= '0000123789';
  Excel.cells[2,2].select;            // Zelle wählen
  Excel.Selection.numberFormat:= '@'; // benutzerdefiniertes Zahlenformat zuweisen
  Excel.Cells[2,2]:= zahl;            // String in die Zelle schreiben.

  Excel.Workbooks.Close; // Excel wieder schliessen.

end;

end.
Das sollte Dein Problem lösen.

Bis bald Chemiker

Andidreas 3. Mai 2007 07:08

Re: Excel und Delphi
 
meiner meinung nach müsste es eigentlich schon reichen wenn du denn zellen das gewünschte format mitgibst, also in deinem fall wäre das z.b.:

Delphi-Quellcode:
    oleExcelSheets1.Columns[1].NumberFormat := '@';

hflick 3. Mai 2007 07:17

Re: Excel und Delphi
 
Zitat:

Zitat von Chemiker
Hallo Maa83,
Delphi-Quellcode:
  Excel.Worksheets ['Tabelle1'].Activate;
end.
Das sollte Dein Problem lösen.

Wie kann man "Tabelle1" eigentlich so implementieren, dass sowohl deutsche als auch englische Versionen funktionieren? Bei mir geht das so nämlich nicht, weil die Sheet1 usw. heissen...

Maa83 3. Mai 2007 07:53

Re: Excel und Delphi
 
vielen Dank erst mal :)

mit
ExcelWS.Columns.NumberFormat := '@';

funktioniert es. Jetzt hab ich das selbe Problem noch wenn ich über eine CSV-Datei gehen möchte. Hier schreibe ich die Werte in eine CSV Datei und öffne diese mit der Funktion

ExcelApp.Workbooks.OpenText

Diese Methode ist viel schneller als direkt über Excel (und bei mehreren 10.000 Datensätze auch mehr als nötig). Wenn ihr mir hier auch noch helfen könntet wie ich hier die führenden Nullen behalte wäre ich wunschlos glücklich ;)

Andidreas 3. Mai 2007 08:17

Re: Excel und Delphi
 
@maa83
also bei der csv datei kann ich dir leider nicht helfen...
aber wenn du einen lösungsweg gefunden hast, könntest du mir evtl. ein bsp. zukommen lassen wie man daten in eine csv
datei exportiertiert und dann anschließend nach excel exportiert???

weil ich muss 1 mal im viertel jahr eine text datei in excel exportieren... und wie lang das dauert bei mehr als 100.000
Datensätzen kannst du dir bestimmt vorstellen ;)

Maa83 3. Mai 2007 08:29

Re: Excel und Delphi
 
@Andidreas:

die csv Datei besteht aus der Kopfzeile dort sind die Überschriften mit ; getrennt aufgezählt.
Die Werte sind jeweils in einer Extrazeile ebenfalls durch ; getrennt.

Beispiel:

Identnummer;Nachname;Vorname;Ort
0001234;Fritzbert;Hugo;Hasenheim
0004567;Funky;Brother;Quarkhausen

Diese Datei kann man dann einfach mit
ExcelApplication.Workbooks.OpenText
aufrufen.

Komplett:

Delphi-Quellcode:
    ExcelApp.Workbooks.OpenText(//Pfad
                                Datei,

                                //woher (xlMacintosh, xlWindows, xlMSDOS)
                                xlWindows,

                                //Start-Row
                                1,

                                //DataType
                                //Bestimmt das Spaltenformat der Daten in der Datei.
                                //Zulässig ist eine der folgenden XlTextParsingType-Konstanten:
                                //xlDelimited, xlFixedWidth.
                                //Default: xlDelimited.
                                xlDelimited,

                                //TextQualifier legt den Textkennzeichner fest.
                                //Zulässig ist eine der folgenden XlTextQualifier-Konstanten:
                                //xlTextQualifierDoubleQuote, xlTextQualifierSingleQuote,
                                //xlTextQualifierNone.
                                //Default: xlTextQualifierDoubleQuote.
                                xlTextQualifierDoubleQuote, //xlTextQualifierSingleQuote,

                                //ConsecutiveDelimiter:
                                //True, falls aufeinander folgende Trennzeichen als ein
                                //Zeichen interpretiert werden sollen.
                                //Default: False.
                                False,

                                //Tab: True = Tabulatorzeichen ist Trennzeichen
                                //(DataType muss den Wert xlDelimited haben).
                                //Die Voreinstellung ist False.
                                False,

                                //Semicolon: True = Semikolon ist Trennzeichen
                                //(DataType muss den Wert xlDelimited haben).
                                //Die Voreinstellung ist False.
                                True,

                                //Comma: True = Komma ist Trennzeichen
                                //(DataType muss den Wert xlDelimited haben).
                                //Die Voreinstellung ist False.
                                False,

                                //Space: True = Leerzeichen ist Trennzeichen
                                //(DataType muss den Wert xlDelimited haben).
                                //Die Voreinstellung ist False.
                                False,

                                //Other: True, falls das durch das Argument
                                //OtherChar angegebene Zeichen das Trennzeichen ist
                                //(DataType muss den Wert xlDelimited haben).
                                //Die Voreinstellung ist False.
                                False,

                                //OtherChar (erforderlich, falls Other den Wert True hat).
                                //Gibt das Trennzeichen an, falls Other den Wert True hat.
                                //Wird mehr als ein Zeichen angegeben,
                                //wird nur das erste Zeichen verwendet und die restlichen
                                //Zeichen werden nicht beachtet.
                                '',

                                //FieldInfo (Variant): Eine Matrix mit Informationen zur Analyse
                                //           der einzelnen Datenspalten. Die Deutung
                                //           hängt vom Wert von DataType ab.
                                //
                                //           Wenn die Daten getrennt sind, ist dieses
                                //           Argument eine Matrix von aus zwei Elementen
                                //           bestehenden Matrizen. Jede Matrix aus
                                //           zwei Elementen gibt die Umwandlungsoptionen
                                //           für eine bestimmte Spalte an. Das erste
                                //           Element ist die Spaltennummer (beginnend mit 1)
                                //           und das zweite Element ist eine der in der
                                //           folgenden Tabelle aufgeführten
                                //           xlColumnDataType-Konstanten, die angeben,
                                //           wie die Spalte analysiert wird.
                                FieldInfo,

                                //TextVisualLayout
                                TextVisualLayout,
                                //Nur für Excel 2000
                               {$IFDEF USE_EXCEL2000}
                                //DecimalSeparator
                                DecimalSeparator,
                                //ThousandsSeparator
                                ThousandSeparator,
                                {$ENDIF}
                                //lcid
                                lcid
                                );
FieldInfo kann NULL enthalten. Ich habe alles möglich laut Hilfe versucht aber bin bisher noch nicht dahinter gekommen wie ich den Typ übergebe damit Excel es anerkennt
lcid ist ein Integer. Diesen auf 0 initialisieren.

DecimalSeparator und ThousandSeparator sind Variablen aus der SysUtil Unit.
Diese benötigt man nur bei Excel 2000 (dafür hab ich den Schalter {$IFDEF USE_EXCEL2000} einfach deier Version anpassen)


hoffe das hilft dir erst mal weiter. Aber wie gesagt schneidet er so die Nullen ab.

Andidreas 3. Mai 2007 09:17

Re: Excel und Delphi
 
@maa83

cool, danke für die info, werd ich bei gelegenheit ausprobieren :)

Chemiker 3. Mai 2007 21:03

Re: Excel und Delphi
 
Hallo Maa83,

Delphi-Quellcode:
//FieldInfo (Variant): Eine Matrix mit Informationen zur Analyse
                                //           der einzelnen Datenspalten. Die Deutung
                                //           hängt vom Wert von DataType ab.
                                // 
                                //           Wenn die Daten getrennt sind, ist dieses
                                //           Argument eine Matrix von aus zwei Elementen
                                //           bestehenden Matrizen. Jede Matrix aus
                                //           zwei Elementen gibt die Umwandlungsoptionen
                                //           für eine bestimmte Spalte an. Das erste
                                //           Element ist die Spaltennummer (beginnend mit 1)
                                //           und das zweite Element ist eine der in der
                                //           folgenden Tabelle aufgeführten
                                //           xlColumnDataType-Konstanten, die angeben,
                                //           wie die Spalte analysiert wird.
                                FieldInfo,

Das Problem scheint mir an FieldInfo zu liegen, denn dort wird auch der DataType übergeben und dieser muss xlTextFormat sein. Du muss dabei den Datentype mit angeben sonst analysiert Excel in als Standard und es werden keine führenden Nullen ausgegeben. Wenn Du es als Index übergeben hast wird wahrscheinlich 1 als zweite Variable übergeben worden sein, setze dort eine 2 ein und es werden auch führende Nullen in Excel ausgegeben.
Eine Bemerkung noch am Rande, warum benutzt Du nicht eine Datenbank für 10.000 Datensätze?

Bis bald Chemiker

-platon- 3. Mai 2007 21:24

Re: Excel und Delphi
 
Wenn man z.B. Messdaten hat, ist die graphische Auswertung evtl. besser als in einer DB !?
Mmh...klar eine Adressenverwaltung like Telefonbuch ist wohl in DB besser...zumindest das Suchen-Finden-Problem :roll:

Er wird schon seine Gründe haben...

@Andidreas

Man kann aber die Felder auch mit "Tabs" trennen, müssen jetzt nicht unbedigt ";" sein... :gruebel:

Ich meine zu wissen, dass csv auch für irgendwas steht, woraufhin das mit den Trennzeichen zwecks Excel einleuchtend wird...hab das aber irgendwie nicht mehr so richtig bei sammen...

@Edit

tata..gefunden..."Character Separated Values"
http://de.wikipedia.org/wiki/CSV-Datei

Maa83 4. Mai 2007 08:40

Re: Excel und Delphi
 
als Trennzeichen kann jedes beliegige Zeichen benutzt werden. Dies kann man dann als Parameter unter OtherCahr mitgeben. ; ist halt der Standard.

Die Daten befinden sich auch in einer Datenbank. Es gibt in dem Programm aber die Möglichkeit alle Selektierten Daten mitsamt aufbereiteten Adressen nach Excel zu exportieren.

Das mit den Datentypen an Excel übergeben hab ich schon probiert. Es funktioniert aber leider nicht. Zumindest nicht so wie ich es getestet habe...

Chemiker 7. Mai 2007 06:51

Re: Excel und Delphi
 
Hallo Maa83,

mit OpenText ist es nicht möglich die Datei als Text einzulesen. Was man machen könnte ist die csv-Datei zu importieren, dann ist es auch möglich die einzelnen Spalten in ein Text-Format zu formatieren.

Der andere Weg ist die csv-Datei in eine txt-Datei umzubenennen. Dann ist es auch möglich mit OpenText die einzelnen Spalten als Text zu formatieren.

In FieldInfo müssen diese Spalten dann als Text-Format angegeben werden.

Delphi-Quellcode:
DateiName:= 'F:\Excel-ProgammOrdner\Beispiel Daten\kopie von Mappe1.txt';

 Excel.Workbooks.OpenText (DateiName, Origin:=xlwindows, StartRow:=1,
                          DataType:=xlDelimited,
                          TextQualifier:=xlTextQualifierDoubleQuote,
                          ConsecutiveDelimiter:=False,Tab:=True,
                          Semicolon:=True,Comma:=False,Space:=False,
                          Other:=True,
                          FieldInfo:= ExcelArr);
In ExcelArr werden die Formtierungen der Spalten angegeben.

Delphi-Quellcode:
  var ExcelArr: Variant;
begin

  ExcelArr := VarArrayCreate([0,4,0,1], varVariant);    //

  ExcelArr[0,0]:= 1;                // Spalte
  ExcelArr[0,1]:= xlTextformat;     {entpricht = 2}
  ExcelArr[1,0]:= 2;
  ExcelArr[1,1]:= 2;
  ExcelArr[2,0]:= 3;
  ExcelArr[2,1]:= 2;
  ExcelArr[3,0]:= 4;
  ExcelArr[3,1]:= 2;
  ExcelArr[4,0]:= 5;
  ExcelArr[4,1]:= 2;
end;
Damit werden die ersten 5 Spalten als Text formatiert.

Bis bald Chemiker

Maa83 7. Mai 2007 07:33

Re: Excel und Delphi
 
@Chemiker: es klappt!!! VIELEN DANK! Ich wäre nie darauf gekommen das es an der Dateiendung liegt. Wenn du mal in der Nähe bist geb ich ein :cheers: aus :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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