Чтение файла excel с использованием поставщика данных OLEDB

Я использую поставщика данных OLEDB для чтения файла excel, но проблема в том, что в excel файле у некоторого cloumn есть недопустимое значение, например, вместо числовой строки, Когда я прочитаю это недопустимое значение, я получаю пустую строку вместо фактического значения.

enter image description here

для скриншота выше, когда я читаю значение 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;
            }

        }
    }
}

Ответ 1

Вам нужно установить значение для ключа TypeGuessRows Registry на 0, таким образом драйвер установит тип данных на основе всех значений столбцов вместо первого 8 (по умолчанию).

Расположение ключа отличается от версии до версии драйвера, вы можете легко использовать Google на своей конкретной версии. Например, для Access Connectivity Engine 2007 это будет

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

Кстати, вам не нужно, чтобы Jet читал файлы XLS, ACE отлично справляется с этим.

Ответ 2

Это сработало для меня

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

Но это работает, когда есть оба.

Ответ 3

та же проблема, с которой я столкнулся, но в столбце данных есть дата, но при чтении из Excel значение в наборе данных равно нулю для определенных записей даты, я пробовал возможные методы, ни один из них не работал, такой же код