2010-01-22 3 views
4

Je souhaite obtenir une valeur à partir de 12 feuilles Excel. est-il possible que j'obtienne les valeurs sans ouvrir la feuille d'Excel? J'utilise vb.net. S'il vous plaît poster un exemple de code, s'il y a un moyen de lire les valeurs sans ouvrir le fichier Excel. merciLecture de valeurs à partir d'un fichier Excel

Répondre

5

Vous ne pouvez pas lire les valeurs sans ouvrir le fichier Excel. Mais vous pouvez lire les valeurs sans avoir à ouvrir Excel.

Si le fichier est enregistré au format xml, il sera plus facile. Sinon, la méthode la plus simple consiste à toujours utiliser Excel mais utiliser Office Automation pour le faire. Le plus dur est de créer un analyseur de fichier Excel - assez dur sur le format xml excel non ouvert (avant Office 2003) - dur mais toujours possible.

Cependant, il est tout à fait impossible de lire une feuille de calcul Excel sans ouvrir le fichier du tout ..

Voici un extrait de code que vous pouvez utiliser pour ouvrir une feuille de calcul VB.NET, en tirant parti de la bureautique (il ouvre encore le fichier, un compte sur dll d'automatisation Excel, mais ne nécessite pas d'ouvrir Excel):

AVERTISSEMENT

le code suivant n'est pas destiné à être utilisé tel quel, mais simplement il est un échantillon pour guider le lecteur à leur o wn solution qui devrait être soigneusement testé.

' 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 
+0

J'ai vu Office (Excel, Word, etc.) se casser brusquement lorsque l'application automatisée décide soudainement d'afficher une boîte de dialogue modale. Votre programme va probablement se bloquer jusqu'à ce que quelqu'un ferme ces boîtes de dialogue. Non recommandé pour les applications de production! –

+2

vous ne pouvez pas être sérieux .. Alexander .. le code ci-dessus est destiné à être un exemple .. Je ne m'attendais pas à ce que quelqu'un le prenne tel quel et le vide aveuglément dans leur application de production. –

+0

J'ai décliné parce que je considère que la solution que vous fournissez est inférieure à l'utilisation d'ADO.NET. Je pense que c'est une raison valable pour voter. –

0

Je ne sais pas de toute façon d'obtenir une valeur à partir d'une feuille de calcul Excel sans ouvrir réellement mais vous pouvez accéder à la feuille de calcul sans avoir installé si ce bureau est le problème que vous rencontrez. Jetez un coup d'œil à l'utilisation des assemblages d'interopérabilité primaires Office (voir here).

3

Vous pouvez utiliser ADO.NET pour lire des valeurs à partir d'une feuille Excel. Pour plus d'informations sur la chaîne de connexion, voir 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> 

Vous pouvez alors utiliser un System.Data.OleDb.OleDbConnection standard pour lire les valeurs de la source de données. Par exemple, considérons un fichier Excel qui a une feuille nommée Users, avec deux colonnes, UserName et Age.

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 [email protected] AND [email protected]"; 
      command.Parameters.Add(userNameParameter); 
      command.Parameters.Add(ageParameter); 
      connection.Open(); 

      int usersExits = (int) command.ExecuteScalar(); 

      return usersExits == 1; 
     } 
    } 
} 
+1

L'utilisateur a demandé le code dans vb.net, pas C# .. est-ce que je devrais vous voter pour cela? Utilisez vos votes down avec parcimonie, soyez gentils avec les autres membres de l'OS et vous serez récompensé. –

+0

En fait, c'était mon premier vote négatif. Down-vote accepté. –

+0

Juste wow, vous deux. Espérant relancer ce match de frappe d'il y a 7 ans. – ThatGuy

0

utiliser ce code pour cela,

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 
0

Une façon est de créer un objet d'application Excel et VISIBLE = false, puis ouvrez Excel. Je ne sais pas si vous cherchez quelque chose à augmenter la vitesse ou juste pour éviter que l'utilisateur voit les fichiers Excel ouverts et fermés. J'ai utilisé ceci et cela fonctionne. Je pense à utiliser les connexions ADO; J'ai utilisé ceci avec l'accès et ils fonctionnent très bien, et Excel peut être utilisé comme base de données; Je ne sais pas ce qui se passe si certains de ces fichiers n'ont pas le tableau de style de base de données (champs en haut, valeurs en baisse) ??

Questions connexes