J'ai besoin de créer un package SSIS pour importer les données de plusieurs fichiers Excel dans une base de données SQL. Je compte utiliser des conteneurs imbriqués Foreach Loop pour y parvenir. Un énumérateur de fichiers Foreach et imbriqué dans celui-ci, un énumérateur de groupes de schémas de schéma Foreach ADO.net
Problème à prendre en compte: les noms de feuille sont différents entre les fichiers Excel mais la structure reste la même.
J'ai créé un gestionnaire de connexions Excel, mais l'énumérateur de schéma de lignes n'accepte pas le gestionnaire de connexions dans la configuration de l'énumérateur.
Après des recherches, j'ai découvert que vous pouvez utiliser le fournisseur de base de données Jet Ole pour vous connecter à un fichier Excel. Cependant, je ne peux spécifier que les fichiers de base de données Microsoft Access en tant que source de données. Tentative d'insertion d'un fichier Excel en cas d'échec de la source de données
Après plus de recherches, j'ai découvert que vous pouvez utiliser le fournisseur de données Odbc avec une chaîne de connexion au lieu d'un DSN. Après avoir inséré une chaîne de connexion spécifiant le fichier Excel, cela a également échoué
On m'a dit de ne pas utiliser de tâche de script pour accomplir cela et même après avoir essayé un dernier effort pour extraire des données de feuilles pour accéder aux feuilles par index, j'ai constaté que l'index des feuilles dans les différents fichiers Excel était différent.
Toute aide serait grandement appréciée
Voici une façon possible de procéder en supposant qu'il n'y aura pas de feuilles vierges dans les fichiers Excel et que toutes les feuilles suivent exactement la même structure. De plus, en supposant que l’extension de fichier est uniquement .xlsx
L'exemple suivant a été créé à l'aide de SSIS 2008 R2 et Excel 2007. Le dossier de travail pour cet exemple est F:\Temp\
Dans le chemin du dossier F:\Temp\
, créez un fichier de feuille de calcul Excel 2007 nommé States_1.xlsx
avec deux feuilles de calcul.
Sheet 1
of States_1.xlsx contenait les données suivantes
Sheet 2
of States_1.xlsx contenait les données suivantes
Dans le chemin du dossier F:\Temp\
, créez un autre fichier de feuille de calcul Excel 2007 nommé States_2.xlsx
avec deux feuilles de calcul.
Sheet 1
of States_2.xlsx contenait les données suivantes
Sheet 2
of States_2.xlsx contenait les données suivantes
Créez une table dans SQL Server nommée dbo.Destination à l'aide du script de création ci-dessous. Les données de feuille Excel seront insérées dans ce tableau.
CREATE TABLE [dbo].[Destination](
[Id] [int] IDENTITY(1,1) NOT NULL,
[State] [nvarchar](255) NULL,
[Country] [nvarchar](255) NULL,
[FilePath] [nvarchar](255) NULL,
[SheetName] [nvarchar](255) NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
La table est actuellement vide.
Créez un nouveau package SSIS et, sur le package, créez les 4 variables suivantes. FolderPath contiendra le dossier dans lequel les fichiers Excel sont stockés. FilePattern contiendra l'extension des fichiers qui seront bouclés et cet exemple ne fonctionne que pour .xlsx
. FilePath sera assigné avec une valeur par le conteneur Foreach Loop, mais nous avons besoin d'un chemin valide pour commencer pendant la conception et il est actuellement rempli avec le chemin F:\Temp\States_1.xlsx
du premier fichier Excel. SheetName contiendra le nom de la feuille mais nous devons renseigner la valeur initiale Sheet1$
pour éviter les erreurs de conception.
Dans le gestionnaire de connexions du package, créez une connexion ADO.NET avec la configuration suivante et nommez-la ExcelSchema.
Sélectionnez le fournisseur Microsoft Office 12.0 Access Database Engine OLE DB Provider
sous Fournisseurs .Net pour OleDb. Indiquez le chemin du fichier F:\Temp\States_1.xlsx
Cliquez sur la section All
à gauche et définissez la propriété Propriétés étendues sur Excel 12.0
pour indiquer la version d'Excel. Ici, dans ce cas, 12.0 désigne Excel 2007
. Cliquez sur la connexion de test pour vous assurer que la connexion est établie.
Créez un gestionnaire de connexions Excel nommé Excel, comme indiqué ci-dessous.
Créez un serveur SQL de connexion à la base de données OLE nommé SQLServer
. Nous devrions donc avoir trois connexions sur le paquet, comme indiqué ci-dessous.
Nous devons apporter les modifications de chaîne de connexion suivantes afin que le fichier Excel soit modifié de manière dynamique au fur et à mesure que les fichiers sont bouclés.
Sur la connexion ExcelSchema, configurez l'expression ServerName
pour utiliser la variable FilePath
. Cliquez sur le bouton Ellipsis pour configurer l'expression.
De même, sur la connexion Excel, configurez l'expression ServerName
pour utiliser la variable FilePath
. Cliquez sur le bouton Ellipsis pour configurer l'expression.
Sur le flux de contrôle, placez deux conteneurs de boucle Foreach l'un dans l'autre. Les premiers fichiers de boucle nommés Foreach Loop container
nommés parcourront les fichiers en boucle. Le second Foreach Loop container
traversera les feuilles du conteneur. Dans le conteneur inner for each, placez une tâche de flux de données qui lira les fichiers Excel et chargera les données dans SQL.
Configurez le premier conteneur de boucle Foreach nommé Fichiers de boucle comme indiqué ci-dessous:
Configurez le premier conteneur de boucle Foreach nommé Feuilles de boucle comme indiqué ci-dessous:
Dans la tâche de flux de données, placez une source Excel, une colonne dérivée et une destination de base de données OLE, comme indiqué ci-dessous:
Configurez Excel Source pour lire le fichier Excel approprié et la feuille en cours de boucle.
Configurez la colonne dérivée pour créer de nouvelles colonnes pour le nom de fichier et le nom de la feuille. Ceci est juste pour démontrer cet exemple mais n'a aucune signification.
Configurez la destination de base de données OLE pour insérer les données dans la table SQL.
La capture d'écran ci-dessous montre une exécution réussie du paquet.
La capture d'écran ci-dessous montre que les données des 4 classeurs de 2 feuilles de calcul Excel créées au début de cette réponse sont correctement chargées dans la table SQL dbo.Destination.
J'espère que cela pourra aider.
Je suis tombé sur un article qui illustre une méthode dans laquelle les données d'une même feuille Excel peuvent être importées dans le tableau sélectionné jusqu'à ce qu'il n'y ait plus de modifications dans Excel avec les types de données.
Si les données sont insérées ou remplacées par de nouvelles, le processus d’importation s’effectue avec succès et les données sont ajoutées à la table dans la base de données SQL.
L'article peut être trouvé ici: http://www.sqlshack.com/using-ssis-packages-import-ms-Excel-data-database/
J'espère que ça aide.
J'avais un problème similaire et je trouvais qu'il était beaucoup plus simple d'éliminer les fichiers Excel le plus rapidement possible. Dans le cadre des premières étapes de mon package, j'ai utilisé Powershell pour extraire les données des fichiers Excel en fichiers CSV. Mes propres fichiers Excel étaient simples mais ici
Extraire et convertir toutes les feuilles de calcul Excel en fichiers CSV avec PowerShell
est un excellent article de Tim Smith sur l'extraction de données de plusieurs fichiers Excel et/ou de plusieurs feuilles.
Une fois les fichiers Excel convertis au format CSV, l'importation des données est beaucoup moins compliquée.