Date: 15.03.2019 3:27:36
OLE DB ориентирован на работу с реляционными БД, где каждый столбец таблицы имеет определенный тип. Однако, документы Excel не являются реляционными БД; ячейки в столбце могут иметь смешанные типы, а формат отображения является вообще отдельным атрибутом, не имеющим отношение к данным. Когда вы подключаетесь к Excel-документу через OLE DB с параметром IMEX=0, драйвер БД пытается угадать тип столбца, анализируя некоторое количество начальных строк и выбирая тот, который встречается чаще. Если же IMEX=1, то драйвер должен воспринимать все как текст (но из-за бага в Jet это в действительности не работает, пока не установить определенные ключи в реестре). Способа принудительно воспринимать все как число нет.
Словом, если вам нужен продвинутый контроль над типами данных, OLE DB - неподходящее средство. Используйте вместо него:
Office Automation - для клиентских приложений, запускаемых на компьютерах с установленным Office
Open XML SDK - для серверных приложений, или для приложений, запускаемых на компьютерах без Office
Date: 15.03.2019 5:12:08
Date: 15.03.2019 14:12:01
Если вы файл заполняете с нуля, можно попробовать создавать таблицы SQL-запросом с явным указанием типов, а не использовать то, что создано самим Excel. Как-то так:
CREATE TABLE [Table] ([Column1] TEXT, [Column2] FLOAT)
Date: 15.03.2019 17:01:45
Ага, увидел. Сейчас попробовал сам, у меня вроде отображает как число
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = \"D:\\Test\\book.xlsx\"; Extended Properties=Excel 12.0 Xml";
conn.Open();
OleDbCommand cmd = new OleDbCommand("Create table [Test](A TEXT,B FLOAT)", conn);
var res = cmd.ExecuteNonQuery();
Console.WriteLine("Create table " + res.ToString());
cmd = new OleDbCommand("Insert into [Test] (A,B) Values ('hello',1.1)", conn);
res = cmd.ExecuteNonQuery();
Console.WriteLine("Insert " + res.ToString());
Console.ReadKey();
}
}
}
Результат:

1,1 выровнено по правому краю, как число.
Date: 15.03.2019 18:11:29
Date: 16.03.2019 7:50:16
Автор: VadimTagil