遍历Excel获取每个单元格数据

public static void GetExcelData(string filePath, string fileName, int operType, string sheet = "sheet1")
        {
            try
            {
                string md5 = string.Empty;
                List<ECADetailInfo> eCADetailInfos = new List<ECADetailInfo>();//子表数据
                if (operType != 2)//除了删除的文件,其他均获取MD5值
                {
                    md5 = GetMD5HashFromFile(filePath);//文件的MD5值
                
                    string fileType = string.Empty;
                    string connectinString = string.Format("Provider=Microsoft.ACE.OLEDB.{0}.0;Persist Security Info=False;" +
                                            "Extended Properties=\"Excel {1}.0;HDR={2};IMEX=1;\";" +
                                            "data source={3};", (fileType == ".xls" ? 4 : 12), (fileType == ".xls" ? 8 : 12), (true ? "Yes" : "NO"), filePath);

                    //建立 链接  创建到数据源的对象
                    OleDbConnection connection = new OleDbConnection(connectinString);
                    //打开链接
                    connection.Open();

                    //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等 
                    DataTable dtSheetName = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
                    //包含excel中表名的字符串数组
                    string[] strTableNames = new string[dtSheetName.Rows.Count];
                    for (int k = 0; k < dtSheetName.Rows.Count; k++)
                    {
                        strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
                    }

                    //string sql = $"select * from [{sheet}$]"; //sql 语法  是一个查询命令,该句报错,修改成如下
                    string sql = "select * from [" + strTableNames[0] + "]";

                    OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

                    DataSet dataSet = new DataSet();//用来放数据 用来存放DataTable

                    adapter.Fill(dataSet);//表示把查询 结果datatable 放到(填充)dataset 里面

                    connection.Close();//释放链接资源  

                    //取得数据
                    DataTableCollection tableCollection = dataSet.Tables; //获取当前集合中所有 表格
                    DataTable table = tableCollection[0];//因为只往dataset里面放置 了一张表格 ,所有这里取得索引为0的表格就是我们刚刚查询到的表格
                    //取得表格中的数据
                    //取得table中所有的行
                    DataRowCollection dataTableRow = table.Rows;//返回了一个行的集合
                    Regex reg = new Regex(@"(?<ITEM>[0-9]{9,})-");//获取9位数字,匹配品号
                    string content = string.Empty;//获取匹配的内容
                
                    //遍历行的集合,取得每一个行的datarow对象
                    foreach (DataRow row in dataTableRow)
                    {
                        foreach (var item in row.ItemArray)
                        {
                            if (item.ToString().Trim() != "" && reg.IsMatch(item.ToString().Trim()))
                            {
                                foreach (Match mat in reg.Matches(item.ToString().Trim()))
                                {
                                    ECADetailInfo eCADetailInfo = new ECADetailInfo();
                                    eCADetailInfo.ItemInfo = mat.Groups["ITEM"].Value.ToString();
                                    eCADetailInfos.Add(eCADetailInfo);
                                }
                            }
                        }
                    }
                }
                //数据库执行的操作
                switch (operType)
                {
                    case 0://新增
                        ECAInfo eCAInfo = new ECAInfo();
                        eCAInfo.ECAId = Guid.NewGuid();
                        eCAInfo.ECAName = fileName;
                        eCAInfo.ECAPath = filePath;
                        eCAInfo.ECAMD5 = md5;
                        eCAInfo.IsEffiect = true;
                        new BaseLink().InsertECAInfo(eCAInfo, eCADetailInfos, out string msg);
                        Log.WriteLog(LogFile.Info, fileName + "新增" + msg);
                        break;

                    case 1://修改
                        ECAInfo info_update = new BaseLink().SelectECAInfo(filePath, fileName);
                        if (info_update != null)
                        {
                            info_update.ECAMD5 = md5;
                            info_update.IsEffiect = true;
                            new BaseLink().UpdateEACInfo(info_update, eCADetailInfos,out string msg_update);
                            Log.WriteLog(LogFile.Info, fileName + "修改" + msg_update);
                        }
                        break;

                    case 2://删除
                        ECAInfo info_dele = new BaseLink().SelectECAInfo(filePath, fileName);
                        if (info_dele != null)
                        {
                            new BaseLink().DeleteECAInfo(info_dele,out string msg_dele);
                            Log.WriteLog(LogFile.Info, fileName + "删除" + msg_dele);
                        }
                        break;

                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog(LogFile.Error, "读取Excel内容出错!\r\n" + ex);
            }
        }

其中关键报错汇总:

1.在OleDbConnection的链接问题,很多时候会报错,提示Microsoft.Ace.OleDB.12.0没有在本机注册

这个问题下载一下驱动就行Microsoft Access 2010 数据库引擎可再发行程序包

选择对应的程序进行下载,32位和64位.

2.进行数据链接时,报错不能识别sheet参数(上述代码中已经是正确代码)

将原来

string sql = $"select * from [{sheet}$]"; //sql 语法  是一个查询命令,该句报错,修改成如下

修改为:

 //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等 
 DataTable dtSheetName = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
 //包含excel中表名的字符串数组
 string[] strTableNames = new string[dtSheetName.Rows.Count];
 for (int k = 0; k < dtSheetName.Rows.Count; k++)
  {
      strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
  }
        
   string sql = "select * from [" + strTableNames[0] + "]";

后面又遇到了更好的获取Excel数据的方法,通过特性抓取,内容如下 

通过特性读取Excel数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值