从Excel文件读取值

我想从12 Excel表中获得一个值。 有什么办法,我没有打开Excel表格的价值? 我正在使用vb.net。 请发布一个示例代码,如果有一种方法来读取值,而无需打开Excel文件。 谢谢

如果不打开Excel文件,则无法读取值。 但是你可以读取数值而不必打开Excel。

如果文件以xml格式保存,则会更容易。 如果不是,最简单的方法是仍然使用Excel,但使用Office自动化来执行此操作。 困难的方法是创build一个Excel文件parsing器 – 很难在非开放的xml Excel格式(Office 2003之前) – 很难但仍然有可能。

但是,从Excel电子表格中读取而不打开文件是完全不可能的。

这里有一小段代码可以用来从VB.NET打开电子表格,利用Office自动化(它仍然打开文件,依靠Excel自动化DLL,但不需要打开Excel):

免责声明

下面的代码并不是按照原样使用,而仅仅是一个指导读者自己的解决scheme的样本,应该对其进行彻底的testing。

' The code below requires you to add references to Office Interop assemblies ' into your VB.NET project (if you don't know how to do that search Google) xlApp = New Excel.ApplicationClass xlWorkBook = xlApp.Workbooks.Open("<YOUR EXCEL SPREADSHEET FILE HERE") xlWorkSheet = xlWorkBook.Worksheets("sheet1") range = xlWorkSheet.UsedRange For rCnt = 1 To range.Rows.Count For cCnt = 1 To range.Columns.Count Obj = CType(range.Cells(rCnt, cCnt), Excel.Range) ' Obj.value now contains the value in the cell.. Next Next 

您可以使用ADO.NET从Excel工作表读取值。 有关连接string的更多信息,请参见http://www.connectionstrings.com/excel-2007

 <connectionStrings> <add name="Default" connectionString='Microsoft.ACE.OLEDB.12.0;Data Source=c:\your\folder\file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES";' providerName="System.Data.OleDb" /> </connectionStrings> 

然后可以使用标准的System.Data.OleDb.OleDbConnection从数据源中读取值。 例如,考虑一个Excel文件,其中有一个名为Users的工作表,其中有两列UserNameAge

 using System.Data; using System.Data.Common; public int UserExists(string userName, int age) { var provider = ConfigurationManager.ConnectionStrings["Default"].ProviderName; var factory = DbProviderFactories.GetFactory(provider); var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString; using (var connection = factory.CreateConnection()) { connection.ConnectionString = connectionString; using (DbCommand command = connection.CreateCommand()) { DbParameter userNameParameter = factory.CreateParameter(); userNameParameter.ParameterName = "@UserName"; userNameParameter.DbType = DbType.String; userNameParameter.Direction = ParameterDirection.Input; userNameParameter.IsNullable = false; userNameParameter.Value = userName; DbParameter ageParameter = factory.CreateParameter(); ageParameter.ParameterName = "@Age"; ageParameter.DbType = DbType.Int32; ageParameter.Direction = ParameterDirection.Input; ageParameter.IsNullable = false; ageParameter.Value = age; command.CommandText = "SELECT COUNT(*) FROM [Users$] WHERE UserName=@UserName AND Age=@Age"; command.Parameters.Add(userNameParameter); command.Parameters.Add(ageParameter); connection.Open(); int usersExits = (int) command.ExecuteScalar(); return usersExits == 1; } } } 

我不知道有什么办法可以从Excel电子表格中得到一个值,而不需要实际打开它,但是如果这是您遇到的问题,您可以在没有安装Office的情况下访问电子表格。 看看使用Office主互操作程序集(请参阅此处 )。

使用这个代码,

 DimobjEXCELCon As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=EXCLE_FILE_PATH;Extended Properties=""Excel 12.0 Xml;HDR=Yes""") ExcelConnection.Open() Dim objQuery As String = "SELECT * FROM [Sheet1$]" 'get values from sheet1, here you can change your sheet name Dim objCMD As OleDbCommand = New OleDbCommand(objQuery,objEXCELCon) Dim objDR As OleDbDataReader Dim SQLconn As New SqlConnection() Dim szCON As String = "Connection string for database" SQLconn.ConnectionString = szCON SQLconn.Open() Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(SQLConn) bulkCopy.DestinationTableName = "TableToWriteToInSQLSERVER" Try objDR = objCMD.ExecuteReader bulCopy.WriteToServer(objDR) objDR.Close() SQLConn.Close() Catch ex As Exception MsgBox(ex.ToString) End Try 

一种方法是创build一个Excel应用程序对象并设置visible = false,然后打开excel。 我不知道你是否正在寻找提高速度,或者只是为了避免让用户看到打开和closures的Excel文件。 我已经使用这个,它的工作原理。 我正在考虑使用ADO连接; 我用这个访问,他们工作得很好,和Excel可以用作数据库; 我只是不知道如果这些文件中没有数据库样式数组(顶部的字段,价值下降)会发生什么?