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数据的方法,通过特性抓取,内容如下