2011-09-14 15 views
27

複数のExcelファイルからSQLデータベースにデータをインポートするためのSSISパッケージを作成する必要があります。これを実現するために、ネストされたForeachループコンテナを使用する予定です。 1つのForeach File Enumeratorとその中に入れ子になっている、Foreach ADO.netスキーマ行セット列挙子ExcelファイルをループしてSSISパッケージを使用してデータベースにロードする方法は?

問題点:シート名はExcelファイルでは異なりますが、構造は同じです。

Excel接続マネージャを作成しましたが、スキーマ行セット列挙子は列挙子構成の接続マネージャを受け入れません。

調査の結果、Jet Ole dbプロバイダを使用してExcelファイルに接続できることがわかりました。ただし、Microsoft Accessデータベースファイルはデータソースとしてのみ指定できます。データソースとしてExcelファイルを挿入しようとしたときにエラーが発生しました

さらに調査したところ、Odbc Data ProviderをDSNではなく接続文字列で使用できることがわかりました。これも失敗したExcelファイルを指定した接続文字列を挿入した後

これを達成するためにスクリプトタスクを使用しないように言われていますが、最後にシートからデータを抽出しようとしても、別のExcelファイル内のシートのインデックスが異なっていること

すべてのヘルプは大ここ
+0

ファイル名の最後は ".xslx"です。 File Enumeratorは、これらのファイル "[wildcard] .xls [wildcard]"を検索します。 Excel接続マネージャは、「Microsoft Excel 2007」としてフォーマットを自動検出しました。 – Xariex

+0

[link](https://stackoverflow.com/documentation/ssis/9838/load-multiple-csv-files-of-same-format-from-a-folder#t=201705040855490267183)リンクは複数のCSVを読み込むためのものです同じフォーマットのフォルダからデータベースへ – observer

答えて

78

Excelで空白のシートがないことを前提にしてこれを行うの1つの可能な方法でいただければ幸いです

ファイルとすべてのシートはまったく同じ構造に従います。また、ファイルの拡張子のみ.xlsx

次の例は、SSIS 2008 R2Excel 2007のを使用して作成されたある仮定の下で。この例の作業フォルダはF:\Temp\

です。フォルダパスF:\Temp\には、2つのワークシートを持つExcel 2007スプレッドシートファイルStates_1.xlsxを作成します。

Sheet 1はStates_1.xlsxは、States_1.xlsx次のデータ

States_1_Sheet_2フォルダパスF:\Temp\

を含有し、以下のデータ

States_1_Sheet_1

Sheet 2を含有しました作成する別のExcel 2007スプレッドシートファイルStates_2.xlsxと2つのワークシートがあります。 States_2.xlsx

Sheet 1次のデータをStates_2の

States_2_Sheet_1

Sheet 2を含有していました。xlsxは、次のデータ

States_2_Sheet_2

以下のスクリプトを作成して使用してdbo.Destinationという名前のSQL Serverのテーブルを作成します

を含んでいました。 Excelシートデータがこのテーブルに挿入されます。

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 

テーブルは現在空です。

Empty table

新しいSSISパッケージを作成し、パッケージには、以下の4つの変数を作成します。 FolderPathには、Excelファイルが保存されているフォルダが含まれます。 FilePatternには、ループされるファイルの拡張子が含まれています。この例は、.xlsxでのみ動作します。 FilePathにはForeachループコンテナの値が割り当てられますが、設計時に有効なパスが必要で、最初に最初のExcelファイルのパスF:\Temp\States_1.xlsxが設定されています。 シート名には実際のシート名が含まれますが、設計時間の誤差を避けるために初期値Sheet1$を入力する必要があります。パッケージの接続マネージャで

​​

、次のように構成されたADO.NET接続を作成し、ExcelSchemaとして名前を付けます。

OleDbのプロバイダプロバイダMicrosoft Office 12.0 Access Database Engine OLE DB Providerを選択します。左側AllセクションにファイルパスにF:\Temp\States_1.xlsx

ExcelSchema 1

クリックを提供し、Excelのバージョンを示すためにExcel 12.0にプロパティ拡張プロパティを設定します。ここでは、12.0はExcel 2007を示しています。 [接続のテスト]をクリックして、接続が成功したことを確認します。

ExcelSchema 2

以下に示すようにエクセルという名前のExcel接続マネージャを作成します。

Excel

SQLServerという名前のOLE DB接続SQL Serverを作成します。したがって、以下に示すように、パッケージに3つの接続が必要です。

Connections

私たちは、ファイルがループスルーされるExcelファイルを動的に変更されるように、次の接続文字列の変更を行う必要があります。

接続の場合ExcelSchemaの場合、式ServerNameに変数FilePathを使用するように構成します。式を構成するには、省略記号ボタンをクリックします。

ExcelSchema ServerName

同様接続エクセルに、変数FilePathを使用する発現ServerNameを構成します。式を構成するには、省略記号ボタンをクリックします。制御フローで

Excel ServerName

、2つのForeachループコンテナ他の内の一つを置きます。最初のForeach Loop containerという名前のループファイルはファイルをループします。第2のForeach Loop containerは、容器内のシートを通過する。各ループコンテナの内側の内では、以下に示すようにSQL

Control Flow

設定という名前の最初のforeachループコンテナループをファイルにExcelファイルとロードデータを読み取ることをデータフロータスクを置く:

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

という名前の最初のforeachループコンテナを構成します以下に示すようにループシート:以下に示すように

Foreach Loop 2 Collection

データフロータスク内Foreach Loop 2 Variable Mappings

、エクセルソース、派生列とOLE DB先を置く:

Data Flow Task

Excelソースを設定して、適切なExcelファイルと現在ループしているシートを読み取ります。

Excel Source Connection Manager

Excel Source Columns

ファイル名とシート名に新しい列を作成するために、派生列を設定します。これは、この例を示すためのものですが、意味がありません。

Derived column

SQLテーブルにデータを挿入するために、OLE DB先を設定します。スクリーンショット以下

OLE DB Destination Connection Manager

OLE DB Destination Columns

パッケージの実行が成功を示しています。スクリーンショット以下

Execution successful

この回答の初めに作成された2枚のExcelスプレッドシートで4つのワークブックからのデータが正しくSQLテーブルdbo.Destinationにロードされていることを示しています。

SQL table

お役に立てば幸いです。

+1

シヴァありがとうございます。これは便利な答えでした。しかし、それは私の側で失敗し続けた。一日の終わりに、私はターゲットシートを検出して名前を変更するPowershellスクリプトを作成しました。すべてのシートが同じ名前で参照するようにします。あなたの答えをありがとう – Xariex

+2

これは私のためにうまくいった。最初は失敗し続けました。なぜなら、64ビットデバッグをFALSEに設定しなければならなかったからです。これを行うにはProject - > YourProjectProperties - > Debugging - > Run64BitRuntime = FALSE – Migs

+0

これは非常に便利でしたが、ファイル名を動的にして、毎回ファイル名を入れないようにしたかったのです。何か可能性はありますか? –

10

データシートでExcelに変更がない限り、同じExcelシートのデータを選択されたテーブルにインポートする方法を説明する記事を読みました。

データが新しいもので挿入または上書きされた場合、インポートプロセスは正常に完了し、データはSQLデータベースのテーブルに追加されます。

記事はここに見つけることができる:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

はそれがお役に立てば幸いです。

0

私も同様の問題があり、できるだけ早くExcelファイルを削除する方がはるかに簡単だったことがわかりました。私のパッケージの最初の手順の一部として、私はPowershellを使ってExcelファイルからデータをCSVファイルに抽出しました。私自身のExcelファイルはシンプルでしたが、ここで

Extract and convert all Excel worksheets into CSV files using PowerShell

複数のExcelファイルおよび/または複数のシートからデータを抽出するのティム・スミス逸品です。

ExcelファイルがCSVに変換されると、データのインポートはずっと複雑になりません。

関連する問題