it-swarm.it

Come eseguire il ciclo di file Excel e caricarli in un database utilizzando il pacchetto SSIS?

Devo creare un pacchetto SSIS per importare dati da più file Excel in un database SQL. Ho intenzione di utilizzare i contenitori di Ciclo Foreach annidati per raggiungere questo obiettivo. Un enumeratore file Foreach e nidificato all'interno di questo, un enumeratore di set di righe dello schema ADeach di Foreach

Problema da considerare: i nomi dei fogli sono diversi tra i file Excel ma la struttura rimane la stessa.

Ho creato un gestore connessioni Excel, ma lo schema enumeratore di righe non accetta la gestione connessione nella configurazione dell'enumeratore.

Dopo la ricerca, ho scoperto che è possibile utilizzare il provider db Jet Ole per connettersi a un file Excel. Tuttavia, posso solo specificare i file di database di Microsoft Access come origine dati. Tentativo di inserire un file Excel quando l'origine dati ha esito negativo

Dopo ulteriori ricerche ho scoperto che è possibile utilizzare il provider di dati Odbc con una stringa di connessione anziché un DSN. Dopo aver inserito una stringa di connessione che specifica il file Excel, anche questo non è riuscito

Mi è stato detto di non usare una Script Task per realizzare questo e anche dopo aver provato un ultimo disperato tentativo di estrarre i dati dai fogli di accedere ai fogli per indice ho scoperto che l'indice per i fogli nei diversi file Excel è diverso

Qualsiasi aiuto sarebbe molto apprezzato

27
Xariex

Ecco un possibile modo di farlo basato sul presupposto che non ci saranno fogli bianchi nei file Excel e anche tutti i fogli seguiranno la stessa identica struttura. Inoltre, supponendo che l'estensione del file sia solo .xlsx

L'esempio seguente è stato creato utilizzando SSIS 2008 R2 e Excel 2007. La cartella di lavoro per questo esempio è F:\Temp\

Nel percorso della cartella F:\Temp\, creare un file di foglio di calcolo di Excel 2007 denominato States_1.xlsx con due fogli di lavoro.

Sheet 1 di States_1.xlsx conteneva i seguenti dati

States_1_Sheet_1

Sheet 2 di States_1.xlsx conteneva i seguenti dati

States_1_Sheet_2

Nel percorso della cartella F:\Temp\, creare un altro foglio di calcolo di Excel 2007 denominato States_2.xlsx con due fogli di lavoro.

Sheet 1 of States_2.xlsx conteneva i seguenti dati

States_2_Sheet_1

Sheet 2 of States_2.xlsx conteneva i seguenti dati

States_2_Sheet_2

Creare una tabella in SQL Server denominata dbo.Destination utilizzando lo script di creazione sottostante. I dati del foglio di Excel verranno inseriti in questa tabella.

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 tabella è attualmente vuota.

Empty table

Creare un nuovo pacchetto SSIS e sul pacchetto, creare le seguenti 4 variabili. FolderPath conterrà la cartella in cui sono memorizzati i file di Excel. FilePattern conterrà l'estensione dei file che verranno sottoposti a looping e questo esempio funziona solo per .xlsx. FilePath verrà assegnato con un valore dal contenitore Ciclo Foreach ma è necessario un percorso valido per iniziare per la fase di progettazione ed è attualmente popolato con il percorso F:\Temp\States_1.xlsx del primo file di Excel. SheetName conterrà il nome effettivo del foglio ma è necessario popolare con il valore iniziale Sheet1$ per evitare errori di progettazione.

Variables

Nella gestione connessione del pacchetto, creare una connessione ADO.NET con la seguente configurazione e denominarla come ExcelSchema .

Selezionare il provider Microsoft Office 12.0 Access Database Engine OLE DB Provider in Provider .Net per OleDb. Fornire il percorso del file F:\Temp\States_1.xlsx

ExcelSchema 1

Fare clic sulla sezione All sul lato sinistro e impostare la proprietà Proprietà estese su Excel 12.0 per indicare la versione di Excel. Qui in questo caso 12.0 denota Excel 2007. Fare clic sulla connessione di prova per assicurarsi che la connessione abbia esito positivo.

ExcelSchema 2

Creare un gestore connessioni Excel denominato Excel come mostrato di seguito.

Excel

Creare un OLE DB Connection SQL Server denominato SQLServer. Quindi, dovremmo avere tre connessioni sul pacchetto come mostrato di seguito.

Connections

È necessario eseguire le seguenti modifiche alle stringhe di connessione in modo che il file Excel venga modificato dinamicamente mentre i file vengono trasferiti.

Sulla connessione ExcelSchema , configurare l'espressione ServerName per utilizzare la variabile FilePath. Fare clic sul pulsante Ellipse per configurare l'espressione.

ExcelSchema ServerName

Analogamente sulla connessione Excel , configurare l'espressione ServerName per utilizzare la variabile FilePath. Fare clic sul pulsante Ellipse per configurare l'espressione. 

Excel ServerName

Nel flusso di controllo, posiziona due contenitori di Ciclo Foreach uno all'interno dell'altro. I primi file Foreach Loop container denominati Loop passeranno in loop attraverso i file. Il secondo Foreach Loop container passerà attraverso i fogli all'interno del contenitore. All'interno di ciascun contenitore di loop, posizionare un'attività di flusso di dati che leggerà i file di Excel e caricherà i dati in SQL

Control Flow

Configurare il primo contenitore del ciclo Foreach denominato File loop come mostrato di seguito:

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

Configura il primo contenitore di loop Foreach denominato Loop sheets come mostrato di seguito:

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

All'interno dell'attività del flusso di dati, posizionare un'origine di Excel, una colonna derivata e una destinazione DB OLE come mostrato di seguito:

Data Flow Task

Configurare l'origine di Excel per leggere il file di Excel appropriato e il foglio che viene attualmente collegato in loop.

Excel Source Connection Manager

Excel Source Columns

Configurare la colonna derivata per creare nuove colonne per il nome del file e il nome del foglio. Questo è solo per dimostrare questo esempio ma non ha alcun significato.

Derived column

Configurare la destinazione del DB OLE per inserire i dati nella tabella SQL.

OLE DB Destination Connection Manager

OLE DB Destination Columns

Sotto lo screenshot viene mostrata l'esecuzione corretta del pacchetto.

Execution successful

Sotto lo screenshot mostra che i dati delle 4 cartelle di lavoro in 2 fogli di lavoro Excel che stavano creando all'inizio di questa risposta sono correttamente caricati nella tabella SQL dbo.Destination.

SQL table

Spero che sia d'aiuto.

82
user756519

Mi sono imbattuto in un articolo che illustra un metodo in cui i dati dello stesso foglio di Excel possono essere importati nella tabella selezionata fino a quando non ci sono modifiche in Excel con i tipi di dati. 

Se i dati vengono inseriti o sovrascritti con nuovi, il processo di importazione verrà completato correttamente e i dati verranno aggiunti alla tabella nel database SQL.

L'articolo può essere trovato qui: http://www.sqlshack.com/using-ssis-packages-import-ms-Excel-data-database/

Spero che sia d'aiuto.

12
McRobert

Avevo un problema simile e ho scoperto che era molto più semplice eliminare i file Excel il prima possibile. Come parte dei primi passi nel mio pacchetto ho usato Powershell per estrarre i dati dai file Excel in file CSV. I miei file Excel erano semplici ma qui 

Estrai e converti tutti i fogli di lavoro Excel in file CSV usando PowerShell

è un eccellente articolo di Tim Smith sull'estrazione di dati da più file Excel e/o fogli multipli. 

Una volta che i file Excel sono stati convertiti in CSV, l'importazione dei dati è molto meno complicata.

0
DBADon