Я открываю рабочий лист Excel в DataTable с помощью OleDb следующим образом:
string select = string.Format("SELECT * FROM [{0}$]", worksheetName);
using (var con = new OleDbConnection(connectionString))
using (var adapter = new OleDbDataAdapter(select, con))
{
con.Open();
var dt = new DataTable();
adapter.Fill(dt);
con.Close();
return dt;
}
Затем я просматриваю строки DataTable, читая различные биты данных следующим образом:
decimal charge;
bool isChargeReadable =
decimal.TryParse(row["Charge"].ToString(), out charge);
Я только что обнаружил, что мой код задыхался от ячеек с долларовыми суммами, такими как "$ 1100,00", которые он не может разделить на десятичные. Не так удивительно... кроме того, что это код, который работал отлично до этого момента.
Дальнейшие исследования показали, что если я запустил этот код , в то время как рабочая книга открыта, она видит одну из этих ячеек как "1100". Если я запустил его, пока книга закрыта, она увидит "1100,00 долларов".
Почему это происходит? Очевидно, мне придется переработать мой код, чтобы работать, пока рабочая книга закрыта, но почему это имеет значение? Я бы подумал, что это будет просто чтение сохраненной книги.
Строка подключения, которую я использую, это...
"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source={0};
Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"";"
... где {0} заменяется именем файла Excel, конечно.
Я обнаружил, что мои операции с oledb работают лучше в excel без указания IMEX = number. Возможно, ваша проблема существует?