• 关于oledb对Excel的读取(转)


    这两天项目需求要检索excel的内容,于是就研究了一下,话不多说,我就直接贴代码1.首先是连接excel。

    复制代码
    public DataTable SearchSheetToDT(string strSearch, string sheetName)
            {
                //文件路径
                string path = Server.MapPath("~/Content/custom/Excel1.xlsx");
                //连接表字符串
                string ExcelConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + @path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;ImportMixedTypes=Text'";
                using (OleDbConnection ole_conn = new OleDbConnection(ExcelConnection))
                {
                    ole_conn.Open();
                    using (OleDbCommand ole_cmd = ole_conn.CreateCommand())
                    {
                        ole_cmd.CommandText = strSearch;
                        OleDbDataAdapter adapter = new OleDbDataAdapter(ole_cmd);
                        DataSet ds = new DataSet();
                        adapter.Fill(ds, sheetName);//sheetName就是excel里的sheet表名
                        DataTable dt = new DataTable();
                        dt = ds.Tables[0];
                        return dt;
                    }
                }
            }
    复制代码

    简单解释一下连接字符串
    HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
    IMEX 参数因为不同的模式代表著不同的读写行为:
      当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
      当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
      当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
    Provider=Microsoft.ACE.OLEDB.12.0;这说明是excel2007以上的版本,xls文件一般都是03版本,Provider=Microsoft.Jet.OLEDB.4.0; 
    详情连接字符根据版本怎么写可以参照网站:http://www.connectionstrings.com/excel/
    在写的时候可能出现“找不到可安装的ISAM ”这个时候出现这种情况多可能是你的连接语句缺斤少两了,你仔细检查Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'"这个是不是少了分号什么的,我当时出错是因为Data Source这个,少了一个空格,写成了DataSource,找了好久。如果你确定真真没错,那就看看电脑有没有excel,重新安装ISAM呗。具体得操作步骤:在“运行”对话框中输入以下内容:Regsvr32 c:WINDOWSsystem32msexcl40.dll  然后回车
    之后就没问题,连接上了。就看操作语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public bool SearchIndexSheet(string k)
            {
                string strIndex = "select * from [sheet1$]";//这里sheet1就是你的表名是什么就写什么,例如学生表就是 学生表$
                string sheetName = "[sheet1$]";
                DataTable indexdt = new DataTable();
                //读取excel
                indexdt = SearchSheetToDT(strIndex, sheetName);
                //indexdt.DefaultView.RowFilter = "列名1='上证A股指数'";
                //查询条件
                var reslut = indexdt.Select("列名1='" + k + "' or 列名2='" + k  + "'").ToList();
               if (reslut.Count != 0)
                {
                    return true;
                }
                else return false;
            }

      可能有些人会直接写string strIndex = "select * from [sheet1$] where [列名1]='"+k"'";这个也是可以的,只是有时候会报错
    例如这种错误 标准表达式中数据类型不匹配  ,不是因为你语句写错了,而是因为excel中有表达式,所以我就把数据取出来放在datatable里了。
    基本上对于excel的读取就这样了。
    这算是导入吧,导出还没写过。

    复制代码
         /// <summary>
            /// 查询文档-字段返回查询
            /// </summary>
            /// <param name="k"></param>
            /// <returns></returns>
            public List<DataRow> SearchMatchSheet(string k)
            {
                string strMatch = "select * from [<span style="line-height: 19.2000007629395px;">表名1</span>$]";
                string sheetName = "[表名1$]";
                DataTable matchdt = new DataTable();
                matchdt = SearchSheetToDT(strMatch, sheetName);
                var reslut = matchdt.Select("列名1='" + k  + "'").ToList();
                return reslut;
            }
     
  • 相关阅读:
    phpstudy apache无法启动的解决办法
    Windows server 2008 快速搭建域环境
    使用netsh来进行端口转发
    基于docker构建测试环境
    [Leetcode] Linked List Cycle
    Hyper-V下安装Ossim系统
    Windows应用替代方案接龙
    图解CISCO 3550忘记密码解决方法
    硬件代理解决用户上网问题
    图->存储结构->数组表示法(邻接矩阵)
  • 原文地址:https://www.cnblogs.com/yanhuanghero/p/6423603.html
Copyright © 2020-2023  润新知