从C#读取Excel文件

我有一个连接string来读取我的C#项目中的Excel文件,看起来像这样..

String ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + VariableFile + ";" + "Extended Properties=Excel 8.0;"; 

我也有objConn.Open(); 打开文件

问题是我的程序打开文件的唯一时间是如果我手动打开Excel文件并运行我的程序。 任何人都可以帮助我从我的C#代码打开文件,而不必手动打开它。 我收到错误消息:无法find可安装的ISAM,当我尝试运行它没有打开Excel文件第一次。

谢谢

我认为你的连接string的格式是错误的,“无法find可安装的ISAM”通常是这个指示。

试试这个,这是从我有一个操作代码:

Excel 2007

 string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=No;IMEX=1\";", fullPath); 

Excel 2003

 string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";", fullPath); 

下面的代码将读取Excel文件及其数据填写DataTable

 try { string connectionString = string.Empty; if (Path.GetExtension(ExcelFileName) == ".xlsx") { connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 12.0;"; } else { connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;"; } OleDbCommand selectCommand = new OleDbCommand(); OleDbConnection connection = new OleDbConnection(); OleDbDataAdapter adapter = new OleDbDataAdapter(); connection.ConnectionString = connectionString; if (connection.State != ConnectionState.Open) connection.Open(); DataTable dtSchema = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); List<string> SheetsName = GetSheetsName(dtSchema); for (int i = 0; i < SheetsName.Count; i++) { selectCommand.CommandText = "SELECT * FROM [" + SheetsName[i] + "]"; selectCommand.Connection = connection; adapter.SelectCommand = selectCommand; DataTable Sheet = new DataTable(); Sheet.TableName = SheetsName[i].Replace("$", "").Replace("'", ""); adapter.Fill(Sheet); if (Sheet.Rows.Count > 0) { Records.Tables.Add(Sheet); } } } catch (Exception ex) { WriteLog(ex); } 

其他选项是使用专门的库,而不是创build一个连接。 看看EPPlus,它是一个开源的库,可以在C#中使用excel文件。 它对我很好。

http://epplus.codeplex.com/

在这个链接中,您可以看到使用EPPlus阅读excel文件的示例:

http://blog.fryhard.com/archive/2010/10/28/reading-xlsx-files-using-c-and-epplus.aspx

有不同的供应商连接到Excel。 也许你应该尝试使用不同的。 看看这里的例子:

http://www.connectionstrings.com/excel

提供者»Microsoft Jet OLE DB 4.0»ACE OLEDB 12.0»用于OLE DB(OleDbConnection)的.NET Framework数据提供程序»Microsoft Excel ODBC驱动程序»用于ODBC(OdbcConnection)的.NET Framework数据提供程序»用于Microsoft Excel的.NET xlReader(ExcelConnection )

在你的情况下,你应该有这样的东西:提供程序= Microsoft.ACE.OLEDB.12.0;数据源= c:\ myFolder \ myOldExcelFile.xls;扩展属性=“Excel 12.0; HDR = YES”;

我最近不得不使用这个提供程序来进行Azure Web Job,而我需要使用OLEDB提供程序而不是Excel。

您可以使用以下设置安装Microsoft.ACE.OLEDB.12.0提供程序。

Microsoft Access数据库引擎2010可再发行组织https://www.microsoft.com/en-us/download/details.aspx?id=13255

安装完成后,您可以修改.xls和.xlsx文件扩展名的连接string。

例如,下面的代码将Excel文件中的每个工作表的Excel文件转换为DataTable与DataTable。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.OleDb; using System.Linq; using System.Net; 

 public DataSet ExcelToDataSet(string excelFilename) { var dataSet = new DataSet(excelFilename); // Setup Connection string based on which excel file format we are using var excelType = "Excel 8.0"; if (excelFilename.Contains(".xlsx")) { excelType = "Excel 12.0 XML"; } // <add key="Microsoft.ACE.OLEDB" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='{1};HDR=YES;READONLY=TRUE'"/> var connectionStringFormat = ConfigurationManager.AppSettings["Microsoft.ACE.OLEDB"].ToString(); var excelNamePath = string.Format(@"{0}\{1}", Environment.CurrentDirectory, excelFilename); var connectionString = string.Format(connectionStringFormat, excelNamePath, excelType); // Create a connection to the excel file using (var oleDbConnection = new OleDbConnection(connectionString)) { // Get the excel's sheet names oleDbConnection.Open(); var schemaDataTable = (DataTable)oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); oleDbConnection.Close(); var sheetsName = GetSheetsName(schemaDataTable); // For each sheet name OleDbCommand selectCommand = null; for (var i = 0; i < sheetsName.Count; i++) { // Setup select command selectCommand = new OleDbCommand(); selectCommand.CommandText = "SELECT * FROM [" + sheetsName[i] + "]"; selectCommand.Connection = oleDbConnection; // Get the data from the sheet oleDbConnection.Open(); using (var oleDbDataReader = selectCommand.ExecuteReader(CommandBehavior.CloseConnection)) { // Convert data to DataTable var dataTable = new DataTable(sheetsName[i].Replace("$", "").Replace("'", "")); dataTable.Load(oleDbDataReader); // Add to Dataset dataSet.Tables.Add(dataTable); } } return dataSet; } } private List<string> GetSheetsName(DataTable schemaDataTable) { var sheets = new List<string>(); foreach(var dataRow in schemaDataTable.AsEnumerable()) { sheets.Add(dataRow.ItemArray[2].ToString()); } return sheets; }