2013-12-19 26 views
2

我正在使用ACE.OLEDB从C#应用程序读取excel文件。 一切都工作得很好,直到今天,我发现其中一个列名称被错误地读取。ACE.OLEDB提供程序错误地读取某些列名

下面是我在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中的错误?

+0

这不是一个错误,它是一个功能。只要做String.Replace就可以了。 – Taosique

+0

认真吗?你能详细说明吗?我正在阅读excel中的大文件,我可能有很多有效的'。'符号,我不能盲目地用'#'代替它们。 – taralex

回答

1

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

要解决此问题,您可以简单地通过将您的连接字符串标题语法更改为HDR=No来打开您的标题。当数据获取而不是作为标题,但正常行则可以很容易地处理为浮点数,并且.不会导致任何问题。

0

我来到这里寻找从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 
----------------------- 
[  | (
]  |) 
.  | # 
!  | _ 
`  | _ 

这是不是一个完整列表,但它可以帮助别人。我已经将答案留作社区wiki,以便可以自由编辑。

相关问题