Permettre VB.NET application pour convertir des fichiers Excel à Datatable
My VB.NET app me permet actuellement de convertir des fichiers CSV à un datatable grâce au code fourni par David dans cette question j'ai posté: question précédente
maintenant j'essaie de permettre .Les fichiers XLSX à importer dans un datatable. Actuellement, le code ressemble à ceci:
Private Function ConvertCSVToDataTable(ByVal path As String) As DataTable
Dim dt As DataTable = New DataTable()
Using con As OleDb.OleDbConnection = New OleDb.OleDbConnection()
Try
If System.IO.Path.GetExtension(path) = ".csv" Then
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Text;HDR=YES;FMT=Delimited""", "Microsoft.Jet.OLEDB.4.0", IO.Path.GetDirectoryName(path))
ElseIf System.IO.Path.GetExtension(path) = ".xlsx" Then
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Excel 12.0 XML;HDR=Yes;""", "Microsoft.ACE.OLEDB.12.0", IO.Path.GetDirectoryName(path))
End If
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM " & IO.Path.GetFileName(path), con)
Using da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(cmd)
con.Open()
da.Fill(dt)
con.Close()
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.ToString())
Finally
If con IsNot Nothing AndAlso con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Using
Return dt
End Function
Toutefois, lorsque j'exécute le code à l'aide de l' .Fichier XLSX, je reçois l'erreur suivante:
{"le moteur de base de données Microsoft Office Access ne peut pas ouvrir ou écrire à le dossier "C:UsersXSLXFilePath". Il est déjà ouvert exclusivement par un autre utilisateur, ou vous devez avoir l'autorisation de consulter et d'écrire ses données."}
à ma connaissance, le fichier n'est ouvert nulle part ailleurs. Et l'application fonctionne aussi bien quand .Fichier CSV est mis par elle à la place. Comment faire pour que l'application fonctionne correctement ?XLSX, ou N'importe quel format de fichier Excel?
1 réponses
je pense que l'erreur est celle de la chaîne de connexion et de la commande OLEDB:
ConnectionString
vous ne devez pas utiliser IO.Path.GetDirectoryName(path)
il renvoie le nom du répertoire, vous devez fournir le chemin complet du fichier:
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Excel 12.0 XML;HDR=Yes;""", "Microsoft.ACE.OLEDB.12.0", path)
Consulter ce lien pour excel connectionstring fonction de génération: importer des données à partir d'excel 2003 à dataTable
OLEDB Command
vous devez fournir le nom de la feuille de travail dans la commande au lieu du nom du fichier:
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [Sheet1$]" , con)
si les noms de feuille est dynamique et vous devez obtenir la première feuille dans le fichier excel:
Dim dbSchema as DataTable = con.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, null)
Dim firstSheetname as String = dbSchema.Rows(0)("TABLE_NAME").ToString
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [" & firstSheetname & "]" , con)
Références