當我們設置IMEX=1時將強制混合數據轉換為文本,但僅僅這種設置並不可靠,IMEX=1只確保在某列前8行數據至少有一個是文本項的時候才起作用,它只是把查找前8行數據中數據類型占優選擇的行為作了略微的改變。例如某列前8行數據全為純數字,那麼它仍然以數字類型作為該列的數據類型,隨後行裡的含有文本的數據仍然變空。
另一個改進的措施是IMEX=1與注冊表值TypeGuessRows配合使用,TypeGuessRows 值決定了ISAM 驅動程序從前幾條數據采樣確定數據類型,默認為“8”。可以通過修改“HKEY_LOCAL_MacHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的該注冊表值來更改采樣行數。但是這種改進還是沒有根本上解決問題,即使我們把IMEX設為“1”, TypeGuessRows設得再大,例如1000,假設數據表有1001行,某列前1000行全為純數字,該列的第1001行又是一個文本,ISAM驅動的這種機制還是讓這列的數據變成空。
4 解決方法
從以上的分析中可以得知,當某列數據中含有混合類型時,在.Net中使用Microsoft.Jet.OLEDB.4.0來讀取Excel文件造成數據丟失是不可避免的,要解決這個問題只能考慮采用其它數據讀取方法。
在.Net中讀取Excel文件的另外一種方法是回到使用傳統COM組件,這種方法在很多技術文章或論文中都有涉及,本文不作贅述。需要指出的是,使用COM組件來讀取Excel文件數據的效率較低,在作釋放的時候有可能碰到不可預知的錯誤,特別開發Web應用的程序應該慎重使用。
本文提出另外一種利用讀取CSV純文本格式解決此問題的方法。
(1)在讀取Excel的.xls類型的文本數據之前,先將其轉換為.csv格式,在Excel中直接另存為這種格式就可以達到轉換的目的。CSV文件又稱為逗號分隔的文件,是一種純文本文件,它以“,”分隔數據列,本文表1的數據表用CSV格式存儲後用純文本編輯器打開的表現形式如表3所示。
表3 采用CSV格式保存的表1數據
需要指出的是,CSV文件也可以用Ole DB或ODBC的方式讀取,但是如果采用這些方式讀取其數據又會回到丟失數據的老路上,ISAM機制同樣會發揮作用。
(2)采用普通的讀取文本文件的方法打開文件,讀取第一行,用“,”作為分隔符獲得各字段名,在DataTable中創建對應的各字段,字段的類型可以統一創建成“String”。
本文原文
(3)逐行讀取數據行, 用“,”作為分隔符獲得某行各列的數據並填入DataTable相應的字段中。
實現的簡化代碼如下:
String line;
String [] split = null;
DataTable table=new DataTable("auto");
DataRow row=null;
StreamReader sr=new StreamReader("c:/auto.csv",System.Text.Encoding.Default);
//創建與數據源對應的數據列
line = sr.ReadLine();
split=line.Split('','');
foreach(String colname in split){
table.Columns.Add(colname,System.Type.GetType("System.String")); }
//將數據填入數據表
int j=0;
while((line=sr.ReadLine())!=null){
j=0;
row = table.NewRow();
split=line.Split('','');
foreach(String colname in split){
row[j]=colname;
j++;}
table.Rows.Add(row);}
sr.Close();
//顯示數據
dataGrid1.DataSource=table.DefaultVIEw;
dataGrid1.DataBind();
5 結語
在應用程序的設計中,需要訪問Excel數據的情況非常普遍,文章整理:學網 http://www.xue5.com (本站) [1] [2] [3]
本文以在.NET中對訪問含有混合類型數據的Excel表格擬采取的方法進行探討。當然,如果不存在混合類型的數據使用Microsoft.Jet.OLEDB為較佳方案。對於不是使用.Net開發的情況,本論文的分析和所提供的方法亦可參考。
參考文獻:
[1]Linuxmine.利用ASP.Net來訪問Excel文檔[EB/OL]. http://www.Linuxmine.com/77726.Html,2007-1-22.
[2]劉洪成.C#高級編程[M]. 北京:清華大學出版社,2003. 187-200.
[3]肖正宏,曹元大,韓秋風.數據訪問技術——DAO、ADO、RDO的比較[J].電腦與信息技術,2001,(1):31-32.
[4]PBR.Excel使用DAO OpenRecordset NULL作為返回值[EB/OL].http://support.microsoft.com/kb/194124,2004-6-24.
本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。