web-dev-qa-db-fra.com

Comment parcourir en boucle des fichiers Excel et les charger dans une base de données à l'aide du package SSIS?

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

27
Xariex

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

States_1_Sheet_1

Sheet 2 of States_1.xlsx contenait les données suivantes

States_1_Sheet_2

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

States_2_Sheet_1

Sheet 2 of States_2.xlsx contenait les données suivantes

States_2_Sheet_2

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.

Empty table

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.

Variables

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

ExcelSchema 1

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.

ExcelSchema 2

Créez un gestionnaire de connexions Excel nommé Excel, comme indiqué ci-dessous.

Excel

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.

Connections

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.

ExcelSchema ServerName

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. 

Excel ServerName

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.

Control Flow

Configurez le premier conteneur de boucle Foreach nommé Fichiers de boucle comme indiqué ci-dessous:

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

Configurez le premier conteneur de boucle Foreach nommé Feuilles de boucle comme indiqué ci-dessous:

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

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:

Data Flow Task

Configurez Excel Source pour lire le fichier Excel approprié et la feuille en cours de boucle.

Excel Source Connection Manager

Excel Source Columns

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.

Derived column

Configurez la destination de base de données OLE pour insérer les données dans la table SQL.

OLE DB Destination Connection Manager

OLE DB Destination Columns

La capture d'écran ci-dessous montre une exécution réussie du paquet.

Execution successful

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.

SQL table

J'espère que cela pourra aider.

82
user756519

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.

12
McRobert

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.

0
DBADon