web-dev-qa-db-ja.com

ExcelファイルをループしてSSISパッケージを使用してデータベースにロードする方法は?

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

考慮すべき問題:Excelファイル間でシート名は異なりますが、構造は変わりません。

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

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

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

私はこれを達成するためにスクリプトタスクを使用しないように言われました、そしてシートからデータを抽出する最後の努力を試みた後でもインデックスによってシートにアクセスしています

どんな助けも大歓迎です

31
Xariex

これは、Excelファイルに空白のシートがなく、すべてのシートがまったく同じ構造に従うという仮定に基づいて、これを行う1つの可能な方法です。また、ファイル拡張子が.xlsxのみであるという仮定の下で

次の例は、SSIS 2008 R2およびExcel 2007を使用して作成されました。この例の作業フォルダーはF:\Temp\です

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

Sheet 1 ofStates_1.xlsxには次のデータが含まれていました

States_1_Sheet_1

Sheet 2 ofStates_1.xlsxには次のデータが含まれていました

States_1_Sheet_2

フォルダーパスF:\Temp\で、States_2.xlsxという名前の別のExcel 2007スプレッドシートファイルを2つのワークシートで作成します。

Sheet 1 ofStates_2.xlsxには次のデータが含まれていました

States_2_Sheet_1

Sheet 2 ofStates_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が入力されています。 SheetNameには実際のシート名が含まれますが、設計時のエラーを避けるために、初期値Sheet1$を入力する必要があります。

Variables

パッケージの接続マネージャーで、次の構成でADO.NET接続を作成し、名前をExcelSchemaにします。

OleDbの.Netプロバイダーの下でプロバイダーMicrosoft Office 12.0 Access Database Engine OLE DB Providerを選択します。ファイルパスF:\Temp\States_1.xlsxを指定します

ExcelSchema 1

左側のAllセクションをクリックし、Excelのバージョンを示すプロパティExtended PropertiesをExcel 12.0に設定します。この場合、12.0はExcel 2007を示します。 [テスト接続]をクリックして、接続が成功することを確認します。

ExcelSchema 2

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

Excel

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

Connections

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

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

ExcelSchema ServerName

同様に、接続Excelで、変数ServerNameを使用するように式FilePathを構成します。省略記号ボタンをクリックして、式を構成します。

Excel ServerName

制御フローで、2つのForeachループコンテナーを1つに配置します。最初のForeach Loop containerという名前のLoopファイルは、ファイルをループします。 2番目のForeach Loop containerは、コンテナ内のシートを通過します。内部の各ループコンテナー内で、Excelファイルを読み取り、SQLにデータを読み込むデータフロータスクを配置します。

Control Flow

以下に示すように、ループファイルという名前の最初のForeachループコンテナーを構成します。

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

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

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

データフロータスク内に、Excelソース、派生列、およびOLE DB Destinationを以下に示すように配置します。

Data Flow Task

適切なExcelファイルと現在ループされているシートを読み取るようにExcelソースを構成します。

Excel Source Connection Manager

Excel Source Columns

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

Derived column

OLE DB宛先を構成して、データをSQLテーブルに挿入します。

OLE DB Destination Connection Manager

OLE DB Destination Columns

以下のスクリーンショットは、パッケージの正常な実行を示しています。

Execution successful

以下のスクリーンショットは、この回答の最初に作成された2つのExcelスプレッドシートの4つのワークブックのデータが、SQLテーブルdbo.Destinationに正しくロードされることを示しています。

SQL table

お役に立てば幸いです。

89
user756519

同じExcelシートのデータを、データ型のあるExcelで変更がなくなるまで、選択したテーブルにインポートできる方法を説明する記事を見つけました。

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

記事はここにあります: http://www.sqlshack.com/using-ssis-packages-import-ms-Excel-data-database/

それが役に立てば幸い。

12
McRobert

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

PowerShellを使用してすべてのExcelワークシートを抽出してCSVファイルに変換する

複数のExcelファイルや複数のシートからデータを抽出することに関するTim Smithの優れた記事です。

ExcelファイルがCSVに変換されると、データのインポートはそれほど複雑ではなくなります。

0
DBADon