2017-08-28 59 views
0

Delphi XE10。我需要從Excel工作表中逐行讀取(製表符分隔)字符串。當您使用'選擇一行 - 複製 - 粘貼到記事本'時會得到什麼。工作表包含各種格式的字符串,數字和日期。 什麼工作是這樣的:獲取excel行作爲TXT字符串

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; 

,其中板材是引用到Excel工作表(VAR變):

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

然而,這是不可接受的慢。我試圖導入整個工作表中的一階段的陣列和陣列讀取:

sheetData:=Sheet.UsedRange.Value; 

這是速度不夠快,但我不能讓所有sheetData [行,列]作爲一個字符串值。它返回帶有字符串值的單元格,但在具有整數值的單元格處停止,錯誤爲'無法將類型變體(UnicodeString)轉換爲類型(Double)'。 (該元素的VarType似乎是vtPointer - 我不明白;我也不明白這個錯誤。)

我也試過通過Delphi剪貼板複製和粘貼。有一段時間,然後剪貼板變得不可用。無論如何,這不是我喜歡的一個操作系統的方法。

我很樂意提供有關如何以可接受的性能讀取工作表行的建議。

+0

哪個Excel版本? – MartynA

+0

有沒有這樣的事情,XE10,FWIW –

回答

0

閱讀一氣呵成的範圍是做到這一點的方式(因爲你已經嘗試了):

sheetData := Sheet.UsedRange.Value; 

,如果我直接在環路串聯的sheetData元素我可以重現你的錯誤。我沒有調查錯誤的原因。

但是,如果每個元素首先分配給一個string變量,然後將該變量連接起來,則不會出現錯誤。因此,與一個臨時字符串變量,tmpstr以下解決方法,適用於各種數值:

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; 

「更清潔」的方式任意單元格的值轉換爲字符串,是使用VarToStr()功能,其中有至少存在於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

令人驚歎。這按預期工作,速度足夠快。 – user3212191