При использовании .Net 4.0 и чтении файлов Excel у меня была похожая проблема с OleDbDataAdapter
- то есть чтение в смешанном типе данных в столбце «PartID» в MS Excel, где значение PartID может быть числовым (например, 561)или текст (например, HL4354), даже если столбец Excel был отформатирован как «Текст».
Из того, что я могу сказать, ADO.NET выбирает тип данных на основе большинства значений в столбце (с привязкой к числовому типу данных).т.е. если большинство PartID в наборе образцов являются числовыми, ADO.NET объявит столбец числовым.Поэтому ADO.Net будет пытаться привести каждую ячейку к числу, что приведет к ошибке «текстовых» значений PartID и не импортирует эти «текстовые» PartID.
Мое решение состояло в том, чтобы установить OleDbConnection
строку подключения, чтобы использовать Extended Properties=IMEX=1;HDR=NO
, чтобы указать, что это импорт, и что таблица (таблицы) не будет включать заголовки.Файл Excel имеет строку заголовка, поэтому в этом случае скажите ado.net, чтобы он не использовался.Затем в коде удалите эту строку заголовка из набора данных и вуаля, у вас есть смешанный тип данных для этого столбца.
string sql = "SELECT F1, F2, F3, F4, F5 FROM [sheet1$] WHERE F1 IS NOT NULL";
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PrmPathExcelFile + @";Extended Properties=""Excel 8.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text""");
OleDbCommand cmd = new OleDbCommand(sql, connection);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
ds.Tables.Add("xlsImport", "Excel");
da.Fill(ds, "xlsImport");
// Remove the first row (header row)
DataRow rowDel = ds.Tables["xlsImport"].Rows[0];
ds.Tables["xlsImport"].Rows.Remove(rowDel);
ds.Tables["xlsImport"].Columns[0].ColumnName = "LocationID";
ds.Tables["xlsImport"].Columns[1].ColumnName = "PartID";
ds.Tables["xlsImport"].Columns[2].ColumnName = "Qty";
ds.Tables["xlsImport"].Columns[3].ColumnName = "UserNotes";
ds.Tables["xlsImport"].Columns[4].ColumnName = "UserID";
connection.Close();
// теперь вы можете использовать LINQ для поиска в полях
var data = ds.Tables["xlsImport"].AsEnumerable();
var query = data.Where(x => x.Field<string>("LocationID") == "COOKCOUNTY").Select(x =>
new Contact
{
LocationID= x.Field<string>("LocationID"),
PartID = x.Field<string>("PartID"),
Quantity = x.Field<string>("Qty"),
Notes = x.Field<string>("UserNotes"),
UserID = x.Field<string>("UserID")
});