ACE.OLEDB提供程序错误地读取了一些列名称

时间:2013-12-19 17:17:49

标签: c# excel oledb ms-jet-ace

我正在使用ACE.OLEDB从C#应用程序中读取excel文件。 到目前为止,一切都运行良好,直到今天我注意到其中一个列名被错误地读取。

这是我在excel文件中的内容

Here's what I've got in my excel file

这是我在调试器中的内容

And here's what is read in the code

基本上,由于某种原因,点(“。”)被哈希(“#”)替换。

代码很简单,大部分工作正常,不要认为问题存在,但为了清楚起见,这里会显示。

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中的错误吗?

2 个答案:

答案 0 :(得分:4)

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

要解决此问题,您只需将连接字符串标头语法更改为HDR=No即可转换标头。当数据以而不是作为标题而是普通行时,可以轻松处理为浮点数而.不会导致任何问题。

答案 1 :(得分:2)

我来到这里寻找从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$]')

以下是我见过的转变:

Excel | SQL
-----------------------
[     | (
]     | )
.     | #
!     | _
`     | _

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