Aby*_*tom 11 .net c# excel odbc
我有一个ODBC连接的问题,该连接应该连接到Excel表并用它做一些事情.我已经在网上看了很多关于它的东西,但没有一个解决方案帮助了我(包括stackoverflow).
所以基本上我正处于试图打开表连接的地步.
private static SortedList<string, School> generateSchoolListExcel(string listFilePath)
{
StringBuilder con = new StringBuilder();
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Data Source", listFilePath);
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "HDR", "yes");
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Format", "xlsx");
OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Driver", "{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}");
//I have tried to specify driver without parentheses {} but it's still the same
List<School> schoolList = new List<School>();
using (OdbcConnection excel = new OdbcConnection(con.ToString()))
{
excel.Open();
//doing actuall stuff
}
return schoolList;
}
Run Code Online (Sandbox Code Playgroud)
当我调用该excel.Open()方法时,我收到OdbcException消息:
错误[IM002] [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序",这很奇怪,因为我在名为con的字符串中指定了那些.
还值得一提的是,在ODBC数据源管理器中,我可以清楚地看到我已经安装并运行了这些驱动程序.
还有一个奇怪的部分.当我调用我在stackoverflow上找到的以下方法时,它返回以下驱动程序列表:
- "驱动程序da Microsoft para arquivos texto(*.txt;*.csv)"
- "驱动程序执行Microsoft Access(*.mdb)"
- "驱动程序执行Microsoft dBase(*.dbf)"
- "驱动程序执行Microsoft Excel(*.xls)"
- "驱动程序执行Microsoft Paradox(*.db)"
- "Microsoft Access驱动程序(*.mdb)"
- "Microsoft Access-Treiber(*.mdb)"
- "Microsoft dBase驱动程序(*.dbf)"
- "Microsoft dBase-Treiber(*.dbf)"
- "Microsoft Excel驱动程序(*.xls)"
- "Microsoft Excel-Treiber(*.xls)"
- "Microsoft ODBC for Oracle"
- "Microsoft Paradox驱动程序(*.db)"
- "Microsoft Paradox-Treiber(*.db)"
- "Microsoft文本驱动程序(.txt; .csv)"
- "Microsoft Text-Treiber(*.txt;*.csv)"
- "SQL Server"
- "SQL Server Native Client 11.0"
这些都没有"*.xlsx",这是我正在尝试阅读的文件的格式.
方法如下:
public static List<String> GetSystemDriverList()
{
List<string> names = new List<string>();
// get system dsn's
Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.LocalMachine).OpenSubKey("Software");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC");
if (reg != null)
{
reg = reg.OpenSubKey("ODBCINST.INI");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC Drivers");
if (reg != null)
{
// Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
foreach (string sName in reg.GetValueNames())
{
names.Add(sName);
}
}
try
{
reg.Close();
}
catch { /* ignore this exception if we couldn't close */ }
}
}
}
return names;
}
Run Code Online (Sandbox Code Playgroud)
应该注意的是,当我真正regedit去找那些值时,我清楚地看到:
"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)".
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗 请帮我 :)
顺便说一句,我对.NET这方面很陌生,所以请保持你的答案愚蠢,这样我才能真正理解发生了什么.谢谢!
编辑:一位朋友指出我应该提供更多信息,所以这里是注册表,ODBC数据源管理员的屏幕截图以及ACEODBC.DLL实际存在于我的硬盘上的证明:
还con.ToString()给出了以下内容:
Data Source="G:\POS\odabrane_skole novo_mod.xlsx";Driver="{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"
Run Code Online (Sandbox Code Playgroud)
确保您已下载并安装Microsoft Access Database Engine 2010 Redistributable ....
并将您的连接字符串更改为...
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\POS\odabrane_skole novo_mod.xlsx;Extended Properties="Excel 12.0;HDR=YES; IMEX=1;";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1995 次 |
| 最近记录: |