当前位置: 代码迷 >> 综合 >> System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
  详细解决方案

System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

热度:47   发布时间:2023-12-21 16:19:17.0

最近用MVC3 做了一个项目,发布时项目的中的数据导入功能(Excel格式,有固定的导入数据模板)居然不能用,查看报错日志,发现是“System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序............”。 在网上找一些资料,把问题解决了。如下图所示。

 

 

      

    后台功能代码:导入与导出实现代码。

#region -使用IO写入Excel-/// <summary>///  使用IO写入Excel/// </summary>/// <param name="table">表</param>/// <param name="file">保存路径</param>public static bool dataTableToCsv(System.Data.DataTable table, string file){string title = "";try{FileStream fs = new FileStream(file, FileMode.OpenOrCreate);//FileStream fs1 = File.Open(file, FileMode.Open, FileAccess.Read);StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default);for (int i = 0; i < table.Columns.Count; i++){title += table.Columns[i].ColumnName + "\t"; //栏位:自动跳到下一单元格}title = title.Substring(0, title.Length - 1) + "\n";sw.Write(title);foreach (System.Data.DataRow row in table.Rows){string line = "";for (int i = 0; i < table.Columns.Count; i++){line += row[i].ToString().Trim() + "\t"; //内容:自动跳到下一单元格}line = line.Substring(0, line.Length - 1) + "\n";sw.Write(line);}sw.Close();fs.Close();return true;}catch (Exception){return false;}}#endregion#region- 读取csv格式的Excel文件的方法-///<summary>///读取csv格式的Excel文件的方法 ///</ummary>///<param name="path">待读取Excel的全路径</param>///<returns></returns>public static DataTable ReadExcelWithStream(string path){DataTable dt = new DataTable();bool isDtHasColumn = false; //标记DataTable 是否已经生成了列StreamReader reader = new StreamReader(path, System.Text.Encoding.Default); //数据流while (!reader.EndOfStream){string meaage = reader.ReadLine();string[] splitResult = meaage.Split(new char[] { ',' }, StringSplitOptions.None); //读取一行 以逗号分隔 存入数组DataRow row = dt.NewRow();for (int i = 0; i < splitResult.Length; i++){if (!isDtHasColumn) //如果还没有生成列{dt.Columns.Add("column" + i, typeof(string));}row[i] = splitResult[i];}dt.Rows.Add(row); //添加行isDtHasColumn = true; //读取第一行后 就标记已经存在列 再读取以后的行时,就不再生成列}return dt;}#endregion#region -读取xls\xlsx格式的Excel文件的方法-///<summary>///读取xls\xlsx格式的Excel文件的方法 ///</ummary>///<param name="path">待读取Excel的全路径</param>///<returns></returns>public static DataTable ReadExcelToTable(string path){DataSet ds = new DataSet();//如果HDR=YES,DataTable默认的列名为Excel 第一行数据...//如果HDR=NO,DataTable默认的列名为F1,F2,F3...string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1';"; // Office 07及以上版本 不能出现多余的空格 而且分号注意using (OleDbConnection conn = new OleDbConnection(strConn)){conn.Open();DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字string firstSheetName = sheetsName.Rows[0][2].ToString(); //得到第一个sheet的名字string strExcel = string.Format("select * from [{0}]", firstSheetName);OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);adapter.Fill(ds);conn.Close();}return ds.Tables[0];}#endregion

  相关解决方案