如何避免OLEDB将“。”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)); 

我已经通读了所有我能find的文件,而且我还没有发现什么,甚至提到这会发生。 有没有人遇到过这个? 有没有办法解决这个问题?

看到这个通过堆栈溢出发布的OleDBAdapter Excel QA 。

我在你的数据excel中创build了一个.xlsx工作簿,然后改变了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 

期间正在改为#因为. 在列名中是不合法的。 如果列名只是在内部使用,那么这根本就不重要,但是因为你提出这个问题,所以我假设列名出现在报告或网格的某个地方。

如果您事先不知道哪些列将包含. ,那么显示列名的任何地方都可以做label1.Text = colname.Replace("#", ".")并希望其他列名都不包含# 。 有可能有一些方法来取代OleDb . 用一个比较晦涩难懂的字符(比如|~ )来让你Replace掉一些其他列名的恐惧。