我正在使用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中的错误吗?
答案 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
-----------------------
[ | (
] | )
. | #
! | _
` | _
这不是一个全面的列表,但它可能对某人有所帮助。我已将答案留作社区维基,以便可以自由编辑。