views:

37

answers:

0

I'm opening an Excel worksheet into a DataTable using OleDb like this:

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;
}

Then I loop through the rows of the DataTable reading various bits of data like this:

decimal charge;
bool isChargeReadable = 
    decimal.TryParse(row["Charge"].ToString(), out charge);

I discovered just now that my code was choking on cells with dollar amounts such as "$1100.00", which it can't parse to decimal. Not so surprising...except that this is code that was working perfectly before just now.

Further investigation revealed that if I run this code while the workbook is open, it sees one of those cells as "1100". If I run it while the workbook is closed, it sees "$1100.00".

Why is this happening? Obviously I'll have to rework my code to function while the workbook is closed, but why would it make a difference? I would've thought it would just be reading the saved workbook.

The connection string I'm using is this...

"Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source={0};
    Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"";"

...where {0} is replaced by the Excel file name, of course.