Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi via OLE Excel auslesen - Feld ist double und nicht Variant? (https://www.delphipraxis.net/91492-via-ole-excel-auslesen-feld-ist-double-und-nicht-variant.html)

hronny 5. Mai 2007 21:32


via OLE Excel auslesen - Feld ist double und nicht Variant?
 
Hi, ich will via OLE eine ExcelDatei auslesen. Öffnen Schließen usw geht auch tadellos. Nun will ich verschiedene Exceldateien einlesen wo die Spalten bzw Felder unterschiedlich sein können. Dazu versuche ich über die erste Zeile zu prüfen wann ein Feld leer ist (bei Listen ist das meist so).
Delphi-Quellcode:
j:=1;
repeat
  if (Excel.Cells[1, j].Value<>'') then begin
    s_tmp:=Excel.Cells[1, j].Value;
    Memo1.Lines.Add('Line: '+IntToStr(j)+' - '+s_tmp);
  end;
  Inc(j);
until (Excel.Cells[1, j].Value='');
Geht tatellos. In der Länge würde ich dann prüfen ob alle Felder leer sind, wenn ja dann ist die Exceldatei am Ende. Nun ist es aber so das meine Variable s_tmp vom Typ Variant ist, da ich dachte es nimmt alles auf. Leider muckt er bei Zahlenfeldern rum:
Zitat:

Variante des Typs (String) konnte nicht in Typ (Double) konvertiert werden.
Ja aber wie soll ich denn beim einlesen wissen was das für ein Feld ist? Ich dachte er liest immer String aus. Wie kann man das denn wieder anstellen?

marabu 6. Mai 2007 11:03

Re: via OLE Excel auslesen - Feld ist double und nicht Varia
 
Hallo,

bist du sicher, dass der Fehler im gezeigten Code auftritt? Bei welcher Zeile?

Dein Code geht durch die Zellen der ersten Zeile eines WorkSheets, überspringt einzelne Leerzellen und stoppt, wenn zwei aufeinander folgende leere Zellen gefunden werden. Willst du das wirklich?

Wenn eine einzelne Leerzelle das Abbruchkriterium darstellt, dann ist eine kopfgesteuerte Schleife (while) passender:

Delphi-Quellcode:
const
  FMT = 'Line %d: %s';
var
  iCol: Integer;
  s: string;
begin
  iCol := 1;
  while Sheet.Cells.Item[1, iCol].Value <> Null do
  begin
    s := Sheet.Cells.Item[1, iCol].Value;
    Memo.Lines.Add(Format(FMT, [iCol, s]));
    Inc(iCol);
  end;
end;
Getippt und nicht getestet. Insbesondere den Test zum Abbruch der Schleife kann ich nicht überprüfen, da ich kein Excel installiert habe.

Ansonsten gibt es da noch Cells.SpecialCells(xlCellTypeLastCell, EmptyParam). Damit kannst du die letzte verwendete Zeile und Spalte feststellen.

Grüße vom marabu

hronny 6. Mai 2007 11:50

Re: via OLE Excel auslesen - Feld ist double und nicht Varia
 
Zitat:

Zitat von marabu
Dein Code geht durch die Zellen der ersten Zeile eines WorkSheets, überspringt einzelne Leerzellen und stoppt, wenn zwei aufeinander folgende leere Zellen gefunden werden. Willst du das wirklich?

Jein. Also der Code den ich gepostet habe ist ja der den ich für die erste Zeile verwende. Die Repeatschleife wird sich nur beenden, wenn er eine Zelle hat die leer ist. Bei den Preislisten die ich bekomme ist das immer so, 1. Zeile immer Kopf, Rest sind die Daten. Das klappt auch. Probleme bereitet ja nur das auslesen der Daten. Sobald eine Zahl in der Zelle vorkommt, ist die OLE Schnittstelle der Meinung das ist ein Double-Feld und kann das logischerweise nicht direkt nach String kopieren. Dabei spielt es keine Rolle ob das Feld mit Excel als Zahlenfeld definiert ist, oder nicht.
Nach langer Suche hier im Forum hab ich die Lösung gefunden mit
Delphi-Quellcode:
s_tmp:=VarToStr( Excel.Cells[1, j].Value );
Die Funktion konvertiert den Wert einer Variante in einen String, egal ob Zahl oder nicht. Damit klappt es jetzt super! Aber wie ich feststellen muss ist diese "Export" Funktion nicht gerade die schnellste. Werd mir wohl dochne Komponente kaufen die das schneller und ohne installierten Excel kann. Kennt jemand die SMImportSuite von Scalabium?
http://www.scalabium.com/smi/index.htmWenn jemand eine andere Idee hat, kann er die gerne posten. Danke für die Hilfe!


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