原創(chuàng)|其它|編輯:郝浩|2009-04-27 09:42:25.000|閱讀 3343 次
概述:Excel中有一列數(shù)據(jù)是數(shù)字和文本方式混合排列的,在用ADO導(dǎo)入數(shù)據(jù)時(shí)就會(huì)出現(xiàn)部分?jǐn)?shù)據(jù)不能導(dǎo)入的問(wèn)題
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
Excel中有一列數(shù)據(jù)是數(shù)字和文本方式混合排列的,在用ADO導(dǎo)入數(shù)據(jù)時(shí)就會(huì)出現(xiàn)部分?jǐn)?shù)據(jù)不能導(dǎo)入的問(wèn)題
解決這個(gè)問(wèn)題 首先想到的是常用的數(shù)字轉(zhuǎn)換為文本格式的方法 WorkSheet.Columns[1].NumberFormatLocal:='@';
幾行代碼一敲,測(cè)試發(fā)現(xiàn)沒(méi)效果,就馬上開(kāi)始 baidu,google 鋪天蓋地的搜索。。。
沒(méi)怎么搜索就找到了excel 中有用分列方法將整列數(shù)據(jù)文本格式化的方法:數(shù)據(jù)->分列->列數(shù)據(jù)格式->文本
錄制下的宏代碼如下:
接下來(lái)將VBA宏代碼翻譯成delphi代碼:
一編譯才發(fā)現(xiàn) Array(1,2) 語(yǔ)法錯(cuò)誤,于是將其改成delphi 中的數(shù)組格式 Array[0..1] of Integer=(1,2) ,
編譯還是報(bào)錯(cuò),發(fā)現(xiàn)是因?yàn)槭荄elphi調(diào)用OLE自動(dòng)化控制器操縱Excel,該方法只能出現(xiàn)OleVariant類(lèi)型的參數(shù),馬上找資料看有沒(méi)有OleVariant類(lèi)型的數(shù)組,一下就找到了馬上改了代碼換上去:
滿(mǎn)以為這下問(wèn)題應(yīng)該解決了吧,編譯通過(guò),測(cè)試發(fā)現(xiàn)點(diǎn)都么反應(yīng),郁悶了。。。
到底是哪點(diǎn)的原因呢?開(kāi)始排查問(wèn)題中。。。
第一個(gè)可能的原因,excel 宏寫(xiě)錯(cuò)了?反復(fù)測(cè)試,都能正常運(yùn)行,效果明顯。
第二個(gè)可能的原因,delphi OLE操縱Excel 失效?測(cè)試了其他Ole代碼,都能正常運(yùn)行,沒(méi)有問(wèn)題。
現(xiàn)在就剩下一個(gè)比較確定的問(wèn)題了,WorkSheet.Selection.TextToColumns 這個(gè)方法的問(wèn)題。
搜索引擎中輸入"delphi TextToColumns" 搜出來(lái)的結(jié)果寥寥可數(shù),遇到這個(gè)問(wèn)題的很少,提的問(wèn)題大多都沒(méi)人回答,
許多人甚至不知所云,千辛萬(wàn)苦找到MSDN中的幫助中有 C# 調(diào)用 excel 這個(gè)方法的示例,但是關(guān)鍵地方就是數(shù)組參數(shù)
他用空值代替了:
反復(fù)的看幫助中對(duì) FieldInfo 的描述:
一個(gè)數(shù)組,包含各個(gè)數(shù)據(jù)列的分析信息。解釋取決于 DataType 的值。當(dāng)對(duì)數(shù)據(jù)進(jìn)行分隔時(shí),此參數(shù)是一個(gè)由兩元素?cái)?shù)組組成的數(shù)組,每個(gè)兩元素?cái)?shù)組都指定特定列的轉(zhuǎn)換選項(xiàng)。第一個(gè)元素是列號(hào)(從 1 開(kāi)始),第二個(gè)元素是指定如何分析列的 常數(shù)之一。
可以是下列 值之一:
只有當(dāng)安裝并選擇了臺(tái)語(yǔ)支持時(shí),才能使用 。 指定所使用的臺(tái)語(yǔ)紀(jì)元日期。
列說(shuō)明符可以采用任何順序。如果對(duì)于輸入數(shù)據(jù)中的特定列,給定的列說(shuō)明符不存在,則用 設(shè)置對(duì)列進(jìn)行分析。
如果源數(shù)據(jù)具有固定寬度的列,則每個(gè)兩元素?cái)?shù)組中的第一個(gè)元素都指定該列中的起始字符位置(以整數(shù)形式指定;0(零)是第一個(gè)字符)。兩元素?cái)?shù)組的第二個(gè)元素將該列的分析選項(xiàng)指定為從 1 至 9 的數(shù)字,如上面列出的那樣。
還是不明所以。。。接下來(lái)就是漫長(zhǎng)的碰運(yùn)氣時(shí)間。。。。 改不同的參數(shù)運(yùn)行測(cè)試,反復(fù)N次,每次都是失望的結(jié)果。就這樣被這個(gè)問(wèn)題折磨了3天多的時(shí)間,我絕望了,很想放棄,因?yàn)槲抑辽僬业搅藬?shù)據(jù)導(dǎo)入出現(xiàn)空行的原因和解決方法,只是不能用程序?qū)崿F(xiàn),每次導(dǎo)入數(shù)據(jù)前人工操作excel將數(shù)據(jù)格式化也不是太麻煩。但在花了這么多時(shí)間和精力后我能放得下嗎?就這樣心甘情愿的認(rèn)輸?對(duì)自己說(shuō),我做不到?不!一定能行,我還沒(méi)有失敗,相反已經(jīng)成功了一半了,剩下的那一半只是時(shí)間和靈感問(wèn)題,這時(shí)候放棄了才是真的失敗了。稍微放松下,暫時(shí)什么都不想,等會(huì)一定把你搞定 。打幾盤(pán)魔獸先 這一刻終于來(lái)臨,一段代碼突然給我?guī)?lái)了靈感,我是不是應(yīng)該把參數(shù)類(lèi)型帶進(jìn)去?雖然資料和幫助都沒(méi)提到,但是語(yǔ)法上應(yīng)該是沒(méi)問(wèn)題的,說(shuō)做就做: 運(yùn)行,測(cè)試,通過(guò) !!!喔耶,完美解決,perfect ! 怎一個(gè)爽字了得。。。哈哈哈哈哈哈 編程也需要不拋棄,不放棄,還有一點(diǎn)點(diǎn)靈感。我能!無(wú)所不能!
var a:OleVariant;
a:=VarArrayCreate([0,1],varInteger);
a[0]:=1;
a[1]:=2;
WorkSheet.Columns[4].Select;
WorkSheet.Columns[4].TextToColumns(WorkSheet.Cells[1,4],DataType:=xlDelimited,TextQualifier:=xlDoubleQuote,FieldInfo:=a);
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園