Чтение файла 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 значение в наборе данных равно нулю для определенных записей даты, я пробовал возможные методы, ни один из них не работал, такой же код