2017-08-28 13 views
0

Delphi XE10. Ich muss Zeile für Zeile aus einem Excel-Arbeitsblatt als (durch Tabulatoren getrennte) Zeichenfolge lesen. Was Sie erhalten, wenn Sie 'Zeile auswählen - kopieren - einfügen im Editor' verwenden. Das Arbeitsblatt enthält Zeichenfolgen, Zahlen und Daten in verschiedenen Formaten. Was funktioniert, ist dies:Holen Sie Excel-Zeile als TXT-Zeichenfolge

function TexcelSource.nextRow: string; 
var k : integer; 
begin 
    result:=sheet.cells.items[currentRow,1].text; 
    for k:=2 to maxCol do 
     result:=result+tab+sheet.cells.items[currentRow,k].text; 
    inc(currentRow) 
end; 

wo Blatt ist der Verweis auf ein Excel-Arbeitsblatt (var Variant):

XLApp:=createOLEobject('excel.application'); 
XLApp.Workbooks.open(filename) ; 
Sheet:=XLApp.WorkSheets[1] ; 
MaxRow:=Sheet.Usedrange.EntireRow.count ; 
MaxCol:=sheet.Usedrange.EntireColumn.count; 

Allerdings ist es inakzeptabel langsam. Ich habe versucht, in einem Schritt das ganze Blatt als ein Array zu importieren und aus dem Array lesen:

sheetData:=Sheet.UsedRange.Value; 

Das ist schnell genug, aber ich kann nicht alle sheetData [Zeile, Spalte] als String Wert. Sie gibt Zellen mit Zeichenfolgenwert zurück, stoppt jedoch bei einer Zelle mit einem ganzzahligen Wert mit dem Fehler 'Konnte Variante des Typs (UnicodeString) nicht in Typ (Double) konvertieren'. (VarType dieses Elements scheint vtPointer zu sein - was ich nicht verstehe; auch verstehe ich den Fehler nicht.)

Ich habe auch versucht, Kopieren und Einfügen über die Delphi-Zwischenablage. Funktioniert für eine Weile und dann ist die Zwischenablage nicht mehr verfügbar. Wie auch immer, das ist kein Ansatz, den ich für ein funktionierendes System mag.

Ich würde Vorschläge zum Lesen einer Arbeitsblattzeile als Zeichenfolge mit akzeptabler Leistung begrüßen.

+0

Welche Excel-Version? – MartynA

+0

Es gibt keine XE10, FWIW –

Antwort

0

einen Bereich in einem Rutsch zu lesen, ist die Art und Weise, es zu tun (wie Sie bereits versucht haben):

sheetData := Sheet.UsedRange.Value; 

ich den Fehler reproduzieren kann, wenn ich die sheetData Elemente direkt in einer Schleife verketten bekommen. Ich habe die Ursache des Fehlers nicht untersucht.

Es gibt jedoch keinen Fehler, wenn jedes Element zuerst einer string-Variablen zugewiesen wird und diese Variable dann verkettet wird. So ist die folgende Problemumgehung mit einem temporären String-Variable, tmpstr, für verschiedene Zahlenwerte funktioniert:

for row := ... 
begin 
    rowstr := sheetData[row, 1]; 
    for col := 2 to ... 
    begin 
    tmpstr := sheetData[row, col]; 
    rowstr := rowstr + tab + tmpstr; 
    end; 
    // use rowstr as needed 
end; 

Ein „saubere“ Art und Weise beliebige Zelle Wert Zeichenfolge zu konvertieren, ist die VarToStr() Funktion zu nutzen, was hat gab es mindestens von Delphi 7.

for row := ... 
begin 
    rowstr := sheetData[row, 1]; 
    for col := 2 to ... 
    rowstr := rowstr + tab + VarToStr(sheetData[row, col]); 
    // use rowstr as needed 
end; 
+0

Erstaunlich. Dies funktioniert wie vorgesehen und ist schnell genug. – user3212191

Verwandte Themen