26

我正在使用OLEDB 数据提供程序来读取 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;
            }

        }
    }
}
4

2 回答 2

14

这对我有用

        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'"

但是,当它同时具备两者时,它就可以工作。

于 2016-10-20T20:59:50.897 回答
12

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

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

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

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

于 2013-08-29T12:58:40.850 回答