• 转:C#读取Excel文件 (2009年9月28日) 拓荒者


    原文:刘武|c#如何读取excel文件

    使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作为数据源即可。

    一 在D盘创建excel文件test.xls:

    二 将工作表Sheet1的内容读取到DataSet

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
        "Extended Properties='Excel 8.0'";
    DataSet ds = new DataSet();
    OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
    oada.Fill(ds);

    读取的DataSet为:

    从图中可以看出excel文件中的第一行变成了DataSet中的列名,这正是系统的默认设置。

    三 如果想把第一行也作为数据行,那我们可以给连接字符串添加一个HDR=No属性

    如:

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
        "Extended Properties='Excel 8.0;HDR=No'";
    DataSet ds = new DataSet();
    OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
    oada.Fill(ds);

    结果也许会让你有点想不到:

    第一行的第一列和第三列都变成空的了,这是因为系统把第一列识别成了数字,把第三列识别成了日期,而第一行的数据不符合格式的要求,所以就变成空的了。

    四 我们还可以把所有列都做为字符串来读取,只要添加属性IMEX=1即可

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
        "Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
    DataSet ds = new DataSet();
    OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
    oada.Fill(ds);

    结果又会如何呢?

    是不是再次出乎你的意料,第三行的日期怎么变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧。

    五 也许你并不想读取整个excel的内容

    如果只想读取前两列可以用:select * from [Sheet1$A:B]

    如果只想读取A1到B2的内容,就用:select * from [Sheet1$A1:B2]

    六 如果不知道工作表的名字或名字被人为修改了该怎么办呢?

    我们可以通过索引来获取指定工作表的名字,以下方法可以用来获取工作表名称的数组:

    ArrayList al = new ArrayList();
    string strConn;
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
        "Extended Properties=Excel 8.0;";
    OleDbConnection conn = new OleDbConnection(strConn);
    conn.Open();
    DataTable sheetNames = conn.GetOleDbSchemaTable
        (OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    conn.Close();
    foreach (DataRow dr in sheetNames.Rows)
    {
        al.Add(dr[2]);
    }
    return al;
    2021年9月 北京、西安两地,高薪诚聘 .NET工程师,请私信联系!
    如果认为此文对您有帮助,别忘了支持一下哦!
    声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。
  • 相关阅读:
    大宗商品经营管理特点与风险节点
    大宗商品企业风险管理与套期会计课程
    推荐一个php7+ mongodb三方类
    利用Redis锁解决高并发问题
    PHP socket初探 --- 关于IO的一些枯燥理论
    Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化
    PHP利用Mysql锁解决高并发
    PHP AES cbc模式 pkcs7 128加密解密
    PHP 利用文件锁处理高并发
    Redis 应用场景【商品拼团抢购】
  • 原文地址:https://www.cnblogs.com/youring2/p/1575399.html
Copyright © 2020-2023  润新知