错误显示"The 'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上
本文关键字:程序 计算机 The quot 显示 Microsoft ACE 错误 OLEDB | 更新日期: 2023-09-27 18:06:14
我正在使用Windows 7 64bit
,但我得到这个错误:
"没有在本地机器上注册'Microsoft.ACE.OLEDB.12.0'提供程序。"
创建连接的代码如下:
var fileName = @"C:'ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text'"";
using (var conn = new OleDbConnection(connectionString))
{
conn.Open();
var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
var adapter = new OleDbDataAdapter(cmd);
var ds = new DataSet();
adapter.Fill(ds);
}
}
如何在64位应用程序中解决此问题?
在我的项目设置我使用设置Any CPU
的应用程序
需要安装Access Database Engine
。从这里下载
注意:它需要安装在每台运行你的应用程序的机器上,所以你应该在发布设置中将它作为先决条件的一部分。
我有一个不完美的解决方案,但它有效,其想法是将XLSX文件转换为csv文件,并将其作为csv文件读取,这里的优点是您不必在每台机器上安装提供程序。(在我的例子中,我在DATATABLE中备份了文件的内容),我还使用了电子表格控件(您需要添加引用)下面是代码
var fileName = @"C:'ExcelFile.xlsx";
SpreadsheetControl spreadsheetControl1 = new SpreadsheetControl();
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
spreadsheetControl1.LoadDocument(stream, DocumentFormat.OpenXml);
}
IWorkbook workbook = spreadsheetControl1.Document;
workbook.Options.Export.Csv.ValueSeparator = ';';
workbook.SaveDocument("d:''test.csv", DocumentFormat.Csv);
string whole_file = System.IO.File.ReadAllText(FileName);
// Split into lines.
whole_file = whole_file.Replace(''n', ''r');
string[] lines = whole_file.Split(new char[] { ''r' },
StringSplitOptions.RemoveEmptyEntries);
// See how many rows and columns there are.
int num_rows = lines.Length;
int num_cols = lines[0].Split(',').Length;
// Allocate the data array.
string[,] values = new string[num_rows, num_cols];
// Load the array.
for (int r = 0; r < num_rows; r++)
{
string[] line_r = lines[r].Split(',');
for (int c = 0; c < num_cols; c++)
values[r, c] = line_r[c];
//MessageBox.Show(line_r[c]);
}
int end;
for (int i = 0; i < values.Length; i++)
{
int itemcount = values[i, 0].Count(x => x == ';');
string tmpch = values[i, 0];
string valeuradd;
if (i == 0)
{
for (int x = 1; x < itemcount + 2; x++)
{
end = tmpch.IndexOf(";");
if (end <= 0) { end = tmpch.Length; }
valeuradd = tmpch.Substring(0, end);
tmpch = tmpch.Substring(end + 1);
DT.Columns.Add(valeuradd);
}
}
else
{
DataRow row;
row = DT.NewRow();
for (int j = 1; j < itemcount + 2; j++)
{
end = tmpch.IndexOf(";");
//MessageBox.Show(j.ToString());
if (end <= 0) { end = tmpch.Length; }
valeuradd = tmpch.Substring(0, end);
row[j - 1] = valeuradd;
tmpch = tmpch.Substring(end + 1);
}
DT.Rows.Add(row);
}
}
File.Delete("d: ' test.csv");