网际飞扬

还记得年少时的梦么,醒不过来 便信以为真……

主题背景
本网站首发版本创建于1999年4月
网际飞扬
手机网站二维码

请使用手机扫描二维码,登录网站手机版。

关于C#连接Exce相关知识的拾漏补缺

  • 2023-07-02
  • 2411
  • 飞驰的心

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 档案可同时支持“读取”与“写入”用途。

本博客所有内容均为原创,原则上我不希望你转载。如特别喜欢而转载的话,请务必注明出处“网际飞扬 http://www.fayo.net” 否则本人闲来无事可能会把你误当成维权的靶子。

评论

验证码

全部评论

共{{commentCount}}条
  • {{i+1}}楼
    {{rs.Msg_Sender}}{{rs.Msg_Datetime}}

    {{rs.Msg_Content}}

播放器封面
  • 宠物精灵