国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Excel讀取數(shù)據(jù)丟失解決方案?博啦軟件

Excel讀取數(shù)據(jù)丟失解決方案 博啦軟件

(2010-12-25 22:17:54)

改成1000十進(jìn)制)修改注冊(cè)表HKEY_LOCA L_MA CHINE\SOFTWA RE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRow改為更大的值就可以了.

 

摘要:研究了ISA M驅(qū)動(dòng)限制,<摘要:研究了ISA M驅(qū)動(dòng)限制。分析了.NET中采用Microsoft.Jet.OLEDB讀取Excel文件發(fā)生數(shù)據(jù)丟失的原因,給出了解決此問(wèn)題的方法。

關(guān)鍵詞:Excel;數(shù)據(jù)訪問(wèn);OleDB;ISA M

中圖分類(lèi)號(hào):TP311.1文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044200704-10937-02

 

 

1引言

經(jīng)常需要讀取Excel數(shù)據(jù)或?qū)xcel數(shù)據(jù)導(dǎo)入轉(zhuǎn)換到其他數(shù)據(jù)載體中,應(yīng)用順序的設(shè)計(jì)中。例如將Excel數(shù)據(jù)通過(guò)應(yīng)用順序?qū)隨QLSever等數(shù)據(jù)庫(kù)中以備使用。筆者在開(kāi)發(fā)“汽車(chē)產(chǎn)業(yè)鏈ASP協(xié)同商務(wù)平臺(tái)”中遇到類(lèi)似需求。某汽車(chē)整車(chē)生產(chǎn)企業(yè)需要將其車(chē)輛發(fā)車(chē)信息發(fā)布到汽車(chē)產(chǎn)業(yè)鏈平臺(tái)上去,其數(shù)據(jù)為內(nèi)部ERP系統(tǒng)生成的Excel數(shù)據(jù)表,用戶首先將該數(shù)據(jù)表上傳至汽車(chē)產(chǎn)業(yè)鏈平臺(tái),平臺(tái)將此Excel數(shù)據(jù)讀取導(dǎo)入到平臺(tái)內(nèi)部的SQLSever數(shù)據(jù)庫(kù)中,以供其它應(yīng)用使用。汽車(chē)產(chǎn)業(yè)鏈平臺(tái)的開(kāi)發(fā)使用的開(kāi)發(fā)工具為VS.NET使用的語(yǔ)言是C#開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)使用Microsoft.Jet.OLEDB.4.0讀取數(shù)據(jù)會(huì)出現(xiàn)當(dāng)某一字段內(nèi)分別含有文本和數(shù)字的混合數(shù)據(jù)時(shí),某一類(lèi)型的數(shù)據(jù)會(huì)產(chǎn)生丟失。本文就對(duì)此問(wèn)題發(fā)生的根源進(jìn)行了分析并給出了相應(yīng)的解決方法。

 

2問(wèn)題描述

現(xiàn)代辦公及企業(yè)信息化的應(yīng)用中使用非常廣泛,ExcelMicrosoft公司的電子表格處置軟件。正因如此,順序設(shè)計(jì)中我經(jīng)常要通過(guò)訪問(wèn)Excel文件來(lái)獲得數(shù)據(jù),但Excel文件不是規(guī)范數(shù)據(jù)庫(kù)[1]

作為.NETFrameWork框架中的一個(gè)重要組成局部,ASP.NET也是Microsoft公司的產(chǎn)品。其主要用于Web設(shè)計(jì)。.NET中訪問(wèn)讀取Excel數(shù)據(jù)時(shí)一般采用Microsoft.Jet.OLEDB.4.0[2]現(xiàn)以讀取一個(gè)Excel文件auto.xl中sheet1工作表為例,工作表的內(nèi)容如表1所示。

表1sheet1表的數(shù)據(jù)內(nèi)容

簡(jiǎn)化的代碼如下:現(xiàn)將該表的數(shù)據(jù)內(nèi)容讀取并顯示到DataGrid中。

StringConnStr=Provid=Microsoft.Jet.OLEDB.4.0;DataSource=c:/auto.xls;ExtendProperties=Excel8.0;HDR=YES;;

OleDbConnectConn=newOleDbConnectConnStr;

Conn.Open;

stringSQL=select*from[sheet1$];

ConnStrOleDbDataA daptda=newOleDbDataA daptSQL.;

DataSetds=newDataSet;

da.Filds;

DataGrid1.DataSource=ds;

DataGrid1.DataBind;

Conn.Clos;

但是運(yùn)行以上代碼的結(jié)果并不是期望的將顯示為表2所示的內(nèi)容??梢园l(fā)現(xiàn)第一個(gè)字段中為“1042兩個(gè)數(shù)據(jù)項(xiàng)變?yōu)榭铡?/p>

表2DataGrid1所顯示的數(shù)據(jù)內(nèi)容

ExtendProperties=Excel8.0;HDR=NO;IMEX=1認(rèn)為可以解決此問(wèn)題。由于在開(kāi)發(fā)“汽車(chē)產(chǎn)業(yè)鏈協(xié)同商務(wù)平臺(tái)”中碰到過(guò)類(lèi)似問(wèn)題,有順序設(shè)計(jì)人員將以上代碼OleDbConnect連接字符串中的ExtendProperti一項(xiàng)作了如下改動(dòng)。作了大量的測(cè)試后發(fā)現(xiàn),添加IMEX=1后并未實(shí)質(zhì)上解決此問(wèn)題。表示為:如果某字段前8條記錄中全部為純數(shù)字的話,那么在該字段隨后的記錄中含有字母或漢字的項(xiàng)將仍然變?yōu)榭?,但是如果該字段?條記錄中有一條不為純數(shù)字,將能得到預(yù)期想要的結(jié)果。

 

3問(wèn)題分析

ExcelISA M驅(qū)動(dòng)順序通過(guò)檢查前幾行中實(shí)際值確定一個(gè) Excel列的類(lèi)型,發(fā)生這種問(wèn)題的根源與ExcelISA M[3]IndexSequentiAccessMethod即索引順序存取方法)驅(qū)動(dòng)順序的限制有關(guān)。然后選擇能夠代表其樣本中大部分值的數(shù)據(jù)類(lèi)型[4]也即ExcelISA M查找某列前幾行(默認(rèn)情況下是8行)把占多的類(lèi)型作為其處理類(lèi)型。例如如果數(shù)字占多,那么其它含有字母等文本的數(shù)據(jù)項(xiàng)就會(huì)置空;相反如果文本居多,純數(shù)字的數(shù)據(jù)項(xiàng)就會(huì)被置空。

YES代表是NO代表不是即也為數(shù)據(jù)內(nèi)容;IMEX用來(lái)告訴驅(qū)動(dòng)順序使用Excel文件的模式,現(xiàn)具體分析在第1節(jié)程序代碼ExtendProperti項(xiàng)中的HDR和IMEX所代表的含義。HDR用來(lái)設(shè)置是否將Excel表中第一行作為字段名。其值有012三種,分別代表導(dǎo)出、導(dǎo)入、混合模式。當(dāng)我設(shè)置IMEX=1時(shí)將強(qiáng)制混合數(shù)據(jù)轉(zhuǎn)換為文本,但僅僅這種設(shè)置并不可靠,IMEX=1只確保在某列前8行數(shù)據(jù)至少有一個(gè)是文本項(xiàng)的時(shí)候才起作用,只是把查找前8行數(shù)據(jù)中數(shù)據(jù)類(lèi)型占優(yōu)選擇的行為作了略微的改變。例如某列前8行數(shù)據(jù)全為純數(shù)字,那么它仍然以數(shù)字類(lèi)型作為該列的數(shù)據(jù)類(lèi)型,隨后行里的含有文本的數(shù)據(jù)仍然變空。

TypeGuessRow值決定了ISA M驅(qū)動(dòng)順序過(guò)去幾條數(shù)據(jù)采樣確定數(shù)據(jù)類(lèi)型,另一個(gè)改進(jìn)的措施是IMEX=1與注冊(cè)表值TypeGuessRow配合使用。默認(rèn)為“8可以通過(guò)修改“HKEY_LOCA L_MA CHINE\SOFTWA RE\Microsoft\Jet\4.0\Engines\Excel下的該注冊(cè)表值來(lái)更改采樣行數(shù)。但是這種改進(jìn)還是沒(méi)有根本上解決問(wèn)題,即使我把IMEX設(shè)為“1TypeGuessRow設(shè)得再大,例如1000假設(shè)數(shù)據(jù)表有1001行,某列前1000行全為純數(shù)字,該列的第1001行又是一個(gè)文本,ISA M驅(qū)動(dòng)的這種機(jī)制還是讓這列的數(shù)據(jù)變成空。

4解決方法

當(dāng)某列數(shù)據(jù)中含有混合類(lèi)型時(shí),從以上的分析中可以得知。.NET中使用Microsoft.Jet.OLEDB.4.0來(lái)讀取Excel文件造成數(shù)據(jù)丟失是不可防止的要解決這個(gè)問(wèn)題只能考慮采用其它數(shù)據(jù)讀取方法。

這種方法在很多技術(shù)文章或論文中都有涉及,.NET中讀取Excel文件的另外一種方法是回到使用保守COM組件。本文不作贅述。需要指出的使用COM組件來(lái)讀取Excel文件數(shù)據(jù)的效率較低,作釋放的時(shí)候有可能碰到不可預(yù)知的錯(cuò)誤,特別開(kāi)發(fā)Web應(yīng)用的順序應(yīng)該慎重使用。

本文提出另外一種利用讀取CSV純文本格式解決此問(wèn)題的方法。

先將其轉(zhuǎn)換為.csv格式,Excel中直接另存為這種格式就可以達(dá)到轉(zhuǎn)換的目的CSV文件又稱(chēng)為逗號(hào)分隔的文件,一種純文本文件,以“,1讀取Excel.xl類(lèi)型的文本數(shù)據(jù)之前。分隔數(shù)據(jù)列,本文表1數(shù)據(jù)表用CSV格式存儲(chǔ)后用純文本編輯器打開(kāi)的表示形式如表3所示。

表3采用CSV格式保管的表1數(shù)據(jù)

但是如果采用這些方式讀取其數(shù)據(jù)又會(huì)回到丟失數(shù)據(jù)的老路上,需要指出的CSV文件也可以用OleDB或ODBC方式讀取。ISA M機(jī)制同樣會(huì)發(fā)揮作用。

讀取第一行,用“,2采用普通的讀取文本文件的方法打開(kāi)文件。作為分隔符獲得各字段名,DataT中創(chuàng)建對(duì)應(yīng)的各字段,字段的類(lèi)型可以統(tǒng)一創(chuàng)建成“String

 

用“,3逐行讀取數(shù)據(jù)行。作為分隔符獲得某行各列的數(shù)據(jù)并填入DataT相應(yīng)的字段中。

實(shí)現(xiàn)的簡(jiǎn)化代碼如下:

Stringline;

String[]split=null;

DataTtable=newDataTauto;

DataRowrow=null;

System.Text.Encoding.DefaultStreamReadsr=newStreamReadc:/auto.csv.;

//創(chuàng)建與數(shù)據(jù)源對(duì)應(yīng)的數(shù)據(jù)列

line=sr.ReadLin;

'split=line.Split.;

foreachStringcolnaminsplit{

System.Type.GetTypSystem.Str;table.Columns.A ddcolname.}

//將數(shù)據(jù)填入數(shù)據(jù)表

intj=0;

whileline=sr.ReadLin!=null{

j=0;

row=table.NewRow;

'split=line.Split.;

foreachStringcolnaminsplit{

row[j]=colname;

j++;}

table.Rows.A ddrow;}

sr.Close;

//顯示數(shù)據(jù)

dataGrid1.DataSource=table.DefaultView;

dataGrid1.DataBind;

 

5結(jié)語(yǔ)

需要訪問(wèn)Excel數(shù)據(jù)的情況非常普遍,應(yīng)用順序的設(shè)計(jì)中。本文以在.NET中對(duì)訪問(wèn)含有混合類(lèi)型數(shù)據(jù)的Excel表格擬采取的方法進(jìn)行探討。當(dāng)然,如果不存在混合類(lèi)型的數(shù)據(jù)使用Microsoft.Jet.OLEDB為較佳方案。對(duì)于不是使用.NET開(kāi)發(fā)的情況,本論文的分析和所提供的方法亦可參考。

參考文獻(xiàn):

2007-1-22[1]Linuxmine.利用ASP.NET來(lái)訪問(wèn)Excel文檔[EB/OL].http://www.linuxmine.com/77726.html..

2003.187-200[2]劉洪成.C#高級(jí)編程[M].北京:清華大學(xué)出版社..

曹元大,[3]肖正宏.韓秋風(fēng).數(shù)據(jù)訪問(wèn)技術(shù)—DA OADORDO比擬[J].電腦與信息技術(shù),2001,1:31-32.

2004-6-24[4]PBR.Excel使用DA OOpenRecordsetNULL作為返回值[EB/OL].http://support.microsoft.com/kb/194124..

 

總結(jié)一句話搞定上面一大段都是來(lái)沖場(chǎng)面的.

轉(zhuǎn)自:http://www.bolaing.com/BoLA!-Studio/index.php?option=com_k2&view=item&id=415

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
徹底解決Oledb連接Excel數(shù)據(jù)類(lèi)型不統(tǒng)一的問(wèn)題
ADO訪問(wèn)Excel數(shù)據(jù)
Excel的連接字符串參數(shù)詳解
Excel中的數(shù)據(jù)讀取到內(nèi)存
Excel的連接字符串參數(shù)
SQL語(yǔ)句應(yīng)用基礎(chǔ) | VBA實(shí)例教程
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服