C# ACE.OLEDB提供程序错误地读取某些列名

C# ACE.OLEDB提供程序错误地读取某些列名,c#,excel,oledb,ms-jet-ace,C#,Excel,Oledb,Ms Jet Ace,我正在使用ACE.OLEDB从一个C#应用程序读取一个excel文件。 到今天为止,一切都很顺利。我注意到其中一个列名读错了 这是我的excel文件中的内容 这是我调试器中的内容 由于某种原因,点(“.”)基本上被散列(#”)替换 代码很简单,在大多数情况下都可以正常工作,不要认为存在问题,但为了清晰起见,将在这里显示它 DataTable data = new DataTable(); string strAccessConn = "Provider=Microsoft.ACE.O

我正在使用ACE.OLEDB从一个C#应用程序读取一个excel文件。 到今天为止,一切都很顺利。我注意到其中一个列名读错了

这是我的excel文件中的内容

这是我调试器中的内容

由于某种原因,点(“.”)基本上被散列(#”)替换

代码很简单,在大多数情况下都可以正常工作,不要认为存在问题,但为了清晰起见,将在这里显示它

DataTable data = new DataTable();    
string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path.FullName + ";Extended Properties=\"Excel 12.0\";\"HDR=YES\";\"IMEX=1;\"";     
OleDbConnection myAccessConn = new OleDbConnection(strAccessConn);
string strAccessSelect = "select  * from [" + SheetName + "];";
OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);                           
myDataAdapter.Fill(0, maxRows, data);  

是我做错了什么,还是OLEDB中有缺陷?

这个问题只发生在标题行,这是因为它阻止了点(.)显示在Excel文件的标题中。Excel文件头中的点(翻译为XML时)可能会导致一些问题。尽管XML中的
没有任何意义,但Excel如何来回序列化必须有额外的约定(这不是100%的约定)。因此,在输入数据时,您只需将
#
放入excel中的标题中,并将其转换为
,当您输出带有
的标题时,它将显示为


要解决此问题,只需将连接字符串头语法更改为
HDR=No
,即可将头改为。当数据以头而非普通行的形式进入时,可以轻松地以浮点数的形式处理,
不会引起任何问题

我来这里是为了寻找从Excel标题行中提取的特殊字符的列名转换参考。像这样使用SQL:

select * from
OPENROWSET(
'Microsoft.ACE.OLEDB.12.0','Excel 12.0;
Database=<INSERT-FILENAME>;
Extended Properties=Excel 12.0;IMEX=1;'
,'select * From [Sheet1$]')

这不是一个全面的列表,但它可能会帮助一些人。我将答案留作社区维基,以便可以自由编辑。

这不是一个bug,而是一个功能。只要做一根绳子,换上它,真的吗?你能详细说明一下吗?我正在从excel中读取大量文件,我可能有很多有效的“.”符号,我不能盲目地用“#”替换它们。
Excel | SQL
-----------------------
[     | (
]     | )
.     | #
!     | _
`     | _