【问题标题】:Reading excel file using OLEDB Data Provider使用 OLEDB 数据提供程序读取 excel 文件
【发布时间】:2013-08-29 12:53:03
【问题描述】:

我正在使用 OLEDB Data Provider 来读取 excel 文件,但问题是在 excel 表中某些 cloumn 具有无效值,例如,而不是数字字符串, 当我读取这个无效值时,我得到一个空字符串而不是实际值。

对于上面的截图,当我读取值 john 得到空字符串时。

那么有什么方法可以读取这个无效值吗?

任何帮助将不胜感激。

代码是读取excel文件

private DataTable ReadExcelFile(string sheetName, string path)
{

    using (OleDbConnection conn = new OleDbConnection())
    {
        DataTable dt = new DataTable();
        string Import_FileName = path;
        string fileExtension = Path.GetExtension(Import_FileName);
        if (fileExtension == ".xls")
            conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'";
        if (fileExtension == ".xlsx")
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'";
        using (OleDbCommand comm = new OleDbCommand())
        {
            comm.CommandText = "Select * from [" + sheetName + "$]";

            comm.Connection = conn;

            using (OleDbDataAdapter da = new OleDbDataAdapter())
            {
                da.SelectCommand = comm;
                da.Fill(dt);
                return dt;
            }

        }
    }
}

【问题讨论】:

    标签: c# .net excel oledb


    【解决方案1】:

    这对我有用

            using (OleDbConnection conn = new OleDbConnection())
            {
                DataTable dt = new DataTable();
                conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
                + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'";
                using (OleDbCommand comm = new OleDbCommand())
                {
                    comm.CommandText = "Select * from [" + sheetName + "$]";
                    comm.Connection = conn;
                    using (OleDbDataAdapter da = new OleDbDataAdapter())
                    {
                        da.SelectCommand = comm;
                        da.Fill(dt);
                        return dt;
                    }
                }
            }
    

    MAXSCANROWS=0 覆盖注册表默认值并在确定类型之前扫描所有行。 IMEX=1 仍然需要包含在内。

    例如,给定这张表:

    Header | Header
    ------ | ------
    Cell1  | 2456354
    Cell2  | 2456354
    Cell3  | 2456354
    Cell4  | 2456354
    Cell5  | 2456354
    Cell6  | 2456354
    Cell7  | 2456354
    Cell8  | 2456354
    Cell9  | A5341
    

    以下连接字符串将丢失 A5341

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path 
       + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'"
    
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
       + ";Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'"
    

    但当两者兼有时,它会起作用。

    【讨论】:

      【解决方案2】:

      您需要将TypeGuessRows注册表项的值设置为0,这样驱动程序将根据所有列值而不是前8个(默认)设置数据类型。

      密钥的位置因驱动程序版本而异,您可以根据您的特定版本轻松谷歌它。例如,对于 Access Connectivity Engine 2007,它将是

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
      

      顺便说一句,您不需要 Jet 来读取 XLS 文件,ACE 也完全可以做到这一点。

      【讨论】:

      • 我认为你可以通过在HDR=YES之后的连接字符串中设置;IMEX=1"来完成同样的事情。
      • @DougGlancy 我记得这种方法存在问题,但绝对值得一试,如果可行,它比注册表编辑更好。
      • IMEX=1 不影响这一点。看到这个话题stackoverflow.com/questions/10102149/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多