关于C#连接Exce相关知识的拾漏补缺
- 2023-07-02
- 2925
- 飞驰的心
Excel在各种信息化软件开发中扮演着非常重要的角色,经常需要做导入、导出等工作,随着excel的版本迭代和开发环境的不同,程序连接和操作excel的各种小问题经常会困扰开发者,今天这个文章我把经常遇到的问题都列举一下“
一、连接字符串
用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的
/// <summary> /// 把数据从Excel装载到DataTable /// </summary> /// <param name="pathName">带路径的Excel文件名</param> /// <param name="sheetName">工作表名</param> /// <param name="tbContainer">将数据存入的DataTable</param> /// <returns></returns> public DataTable ExcelToDataTable(string pathName, string sheetName) { DataTable tbContainer = new DataTable(); string strConn = string.Empty; if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet1"; } FileInfo file = new FileInfo(pathName); if (!file.Exists) { throw new Exception("文件不存在"); } string extension = file.Extension; switch (extension) { case ".xls": strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; break; case ".xlsx": strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"; break; default: strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; break; } //链接Excel OleDbConnection cnnxls = new OleDbConnection(strConn); //读取Excel里面有 表Sheet1 OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls); DataSet ds = new DataSet(); //将Excel里面有表内容装载到内存表中! oda.Fill(tbContainer); return tbContainer; }这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串是"Provider=Microsoft.ACE.OLEDB.12.0;....",注意中间红色部分不是"Jet"。
补充一点:这个需要安装 Access Database Engine.exe ,自行搜索下载。如果没有安装的话,可能会报以下错误
“未在本地计算机上注册。。。。提供程序”
这种方式可以不需要安装 办公软件Excel。
二、“找不到可安装的ISAM”的错误提示
根本原因就在于Extended Properties ='Excel 12.0;HDR=YES;'的两个单引号.
三、其他常见问题补充
现在通过新版本生成excel首先需要确认64位驱动。
(64位系统必须在服务器安装 Microsoft Access 2010 数据库引擎可再发行程序包x64)其实就是office2010里面的一个数据库驱动;
office2019并没有这个驱动,好像最高到2016后就没有了
老版本jet4.0 仅限于32位系统,而后面的Excel8.0则表示Excel版本,8.0为office2007 也就是.xls
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
64位系统需要服务器端安装 ACE驱动 12.0是office2010带的
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
如果要操作xls文件则Excel版本仍应写8.0,如果写12.0那么就应该输出为xlsx。但xlsx文件的输出方式和xls不同,所以这里一定注意:
1、如果程序用xls的输出模式,而驱动中声明12.0,那么输出的xlsx则是错误文件不能被打开。
2、如果程序用xls的输出模式,而驱动中声明12.0,那么输出的xls可以打开,但会有警告。
3、综上:如果用xls的输出模式,必须声明8.0 然后输出xls是最正确的。
4、综上:如要输出xlsx,必须声明12.0 程序的输出方式也要相应变化。
四、导入Excel时关于HDR值的解释
参数HDR的值: HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES 参数Excel 8.0 对于Excel 97以上版本都用Excel 8.0 IMEX ( IMport EXport mode )设置 这里特别要说明的就是 IMEX 参数,因为不同的模式代表著不同的读写行为: IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支持“读取”与“写入”用途。
评论
全部评论
共{{commentCount}}条{{rs.Msg_Content}}