Как избежать преобразования OLEDB .s в #s в именах столбцов?

Я использую драйвер ACE OLEDB для чтения из электронной таблицы Excel 2007 и обнаружил, что любой символ «.» символ в именах столбцов преобразуется в символ «#». Например, если у меня есть следующее в электронной таблице:

Name        Amt. Due        Due Date
Andrew      12.50           4/1/2010
Brian       20.00           4/12/2010
Charlie     1000.00         6/30/2010

имя второго столбца будет отображаться как «Amt# Due» при чтении со следующим кодом:

OleDbConnection connection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=MyFile.xlsx; " +
    "Extended Properties=\"Excel 12.0 Xml;HDR=YES;FMT=Delimited;IMEX=1\"");
OldDbCommand command = new OleDbCommand("SELECT * FROM MyTable", connection);
OleDbReader dataReader = command.ExecuteReader();
System.Console.WriteLine(dataReader.GetName(1));

Я прочитал всю документацию, которую смог найти, и не нашел ничего, в чем бы упоминалось, что это произойдет. Кто-нибудь сталкивался с этим раньше? Есть ли способ исправить это поведение?


person Andrew Miner    schedule 29.04.2010    source источник
comment
Похоже, это еще один вариант stackoverflow.com/questions/1088394/   -  person Daniel Martin    schedule 29.04.2010


Ответы (2)


См. этот OleDBAdapter Excel QA, который я разместил через переполнение стека.

Я сделал книгу .xlsx в excel с вашими данными, а затем изменил OleDbConnection, и она отлично читается в ваших данных.

string sql = "SELECT F1, F2, F3 FROM [sheet1$] WHERE F1 IS NOT NULL";

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + PrmPathExcelFile + @";Extended Properties=""Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text""");

Запись данных в консоль:

Name  Amt. Due  Due Date
Andrew  12.50  4/1/2010
Brian  20.00  4/12/2010
person Brian Wells    schedule 05.05.2011

Период изменяется на #, поскольку . недопустимо в имени столбца. Если имя столбца используется только внутренне, то это вообще не имеет значения, но, поскольку вы задаете вопрос, я предполагаю, что имя столбца отображается в отчете или сетке где-то с # в нем.

Если вы заранее не знаете, какие столбцы будут содержать ., то везде, где отображается имя столбца, вы можете сделать label1.Text = colname.Replace("#", ".") и надеяться, что ни одно из других имен столбцов не содержит #. Может быть какой-то способ заставить OleDb заменить . более неясным и редким символом (например, | или ~), который позволит вам Replace меньше бояться испортить имя какого-либо другого столбца.

person MusiGenesis    schedule 29.04.2010