zoukankan      html  css  js  c++  java
  • C#读取Excel表中的数据时,为何有些行的字段内容读取不到

    转载:http://bbs.csdn.net/topics/360220285

    1、当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可避免的,要解决这个问题只能考虑采用其它数据读取方法。
    2、在.NET中读取Excel文件的另外一种方法是回到使用传统COM组件,但使用COM组件来读取Excel文件数据的效率较低,在作释放的时候有可能碰到不可预知的错误,特别开发Web应用的程序应该慎重使用
    3、一种有效的方法可以是,在读取Excel的.xls类型的文本数据之前,先将其转换为.csv格式,在Excel中直接另存为这种格式就可以达到转换的目的。CSV文件又称为逗号分隔的文件,是一种纯文本文件,它以“,”分隔数据列
    4、对csv文件不要采用ole db或odbc方法读取,这样还会出现同样问题。要采用普通的读取文本文件的方法打开文件,读取第一行,用“,”作为分隔符获得各字段名,在DataTable中创建对应的各字段,字段的类型可以统一创建成“string”。
    参考代码(demo)如下:
       
       1:  String line; 
       2:    String [] split = null; 
       3:    DataTable table=new DataTable("auto"); 
       4:    DataRow row=null; 
       5:    StreamReader sr=new StreamReader("c:/auto.csv",System.Text.Encoding.Default); 
       6:    //创建与数据源对应的数据列 
       7:    line = sr.ReadLine(); 
       8:    split=line.Split(','); 
       9:    foreach(String colname in split){ 
      10:    table.Columns.Add(colname,System.Type.GetType("System.String")); } 
      11:    //将数据填入数据表 
      12:    int j=0; 
      13:    while((line=sr.ReadLine())!=null){ 
      14:     j=0; 
      15:     row = table.NewRow(); 
      16:     split=line.Split(','); 
      17:     foreach(String colname in split){ 
      18:     row[j]=colname; 
      19:     j++;} 
      20:     table.Rows.Add(row);} 
      21:     sr.Close(); 
      22:    //显示数据 
      23:    dataGrid1.DataSource=table.DefaultView; 
      24:    dataGrid1.DataBind(); 

    无法读取EXCEL中的数据单元格。有数据,但是读出来全是空值。
    解决方法:
    1.在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; ”,这样就可以。
    注:
    “HDR=Yes;”指示第一行中包含列名,而不是数据;
    “IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取。两者必须一起使用。本以为这样就OK了。但在实际使用过程中,这样设置还是不行,查阅了不少资料才发现,原来还有一个注册表里的信息需要修改,这样带能让excel不再使用前8行的内容来确定该列的类型。
    注册表修改内容如下:
    在HKEY_LOCAL_MACHINESoftwareMicrosoftJet4.0EnginesExcel有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这个问题了。
     
  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3459037.html
Copyright © 2011-2022 走看看