3

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

这是我的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中的错误?

4

2 回答 2

4

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

要解决此问题,您只需将连接字符串标头语法更改为HDR=No. 当数据不是作为标题而是作为普通行进入时,可以很容易地作为浮点数处理,.不会引起任何问题。

于 2015-01-30T01:11:44.063 回答
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
-----------------------
[     | (
]     | )
.     | #
!     | _
`     | _

这不是一个完整的列表,但它可能对某人有所帮助。我已将答案保留为社区 wiki,以便可以自由编辑。

于 2017-05-17T05:35:13.607 回答