複数のExcelファイルからSQLデータベースにデータをインポートするためのSSISパッケージを作成する必要があります。これを実現するために、ネストされたForeachループコンテナーを使用する予定です。 1つのForeachファイル列挙子とその内部にネストされたForeach ADO.netスキーマ行セット列挙子
考慮すべき問題:Excelファイル間でシート名は異なりますが、構造は変わりません。
Excel接続マネージャーを作成しましたが、スキーマ行セット列挙子は列挙子構成で接続マネージャーを受け入れません。
調査した結果、Jet Ole dbプロバイダーを使用してExcelファイルに接続できることがわかりました。ただし、Microsoft Accessデータベースファイルのみをデータソースとして指定できます。データソースとしてExcelファイルを挿入しようとすると失敗する
さらに調査した結果、DSNの代わりに接続文字列でOdbc Data Providerを使用できることがわかりました。 Excelファイルを指定する接続文字列を挿入した後、これも失敗しました
私はこれを達成するためにスクリプトタスクを使用しないように言われました、そしてシートからデータを抽出する最後の努力を試みた後でもインデックスによってシートにアクセスしています
どんな助けも大歓迎です
これは、Excelファイルに空白のシートがなく、すべてのシートがまったく同じ構造に従うという仮定に基づいて、これを行う1つの可能な方法です。また、ファイル拡張子が.xlsx
のみであるという仮定の下で
次の例は、SSIS 2008 R2およびExcel 2007を使用して作成されました。この例の作業フォルダーはF:\Temp\
です
フォルダーパスF:\Temp\
で、States_1.xlsx
という名前のExcel 2007スプレッドシートファイルを2つのワークシートで作成します。
Sheet 1
ofStates_1.xlsxには次のデータが含まれていました
Sheet 2
ofStates_1.xlsxには次のデータが含まれていました
フォルダーパスF:\Temp\
で、States_2.xlsx
という名前の別のExcel 2007スプレッドシートファイルを2つのワークシートで作成します。
Sheet 1
ofStates_2.xlsxには次のデータが含まれていました
Sheet 2
ofStates_2.xlsxには次のデータが含まれていました
以下の作成スクリプトを使用して、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
テーブルは現在空です。
新しいSSISパッケージを作成し、パッケージに次の4つの変数を作成します。 FolderPathには、Excelファイルが保存されているフォルダーが含まれます。 FilePatternには、ループスルーされるファイルの拡張子が含まれます。この例は、.xlsx
に対してのみ機能します。 FilePathにはForeachループコンテナによって値が割り当てられますが、設計時から有効なパスが必要であり、現在、最初のExcelファイルのパスF:\Temp\States_1.xlsx
が入力されています。 SheetNameには実際のシート名が含まれますが、設計時のエラーを避けるために、初期値Sheet1$
を入力する必要があります。
パッケージの接続マネージャーで、次の構成でADO.NET接続を作成し、名前をExcelSchemaにします。
OleDbの.Netプロバイダーの下でプロバイダーMicrosoft Office 12.0 Access Database Engine OLE DB Provider
を選択します。ファイルパスF:\Temp\States_1.xlsx
を指定します
左側のAll
セクションをクリックし、Excelのバージョンを示すプロパティExtended PropertiesをExcel 12.0
に設定します。この場合、12.0はExcel 2007
を示します。 [テスト接続]をクリックして、接続が成功することを確認します。
以下に示すように、Excelという名前のExcel接続マネージャーを作成します。
OLE SQLServer
という名前のDB接続SQL Serverを作成します。したがって、次のようにパッケージに3つの接続が必要です。
次の接続文字列の変更を行う必要があります。これにより、Excelファイルがループスルーされるときに動的に変更されます。
接続ExcelSchemaで、変数ServerName
を使用するように式FilePath
を構成します。省略記号ボタンをクリックして、式を構成します。
同様に、接続Excelで、変数ServerName
を使用するように式FilePath
を構成します。省略記号ボタンをクリックして、式を構成します。
制御フローで、2つのForeachループコンテナーを1つに配置します。最初のForeach Loop container
という名前のLoopファイルは、ファイルをループします。 2番目のForeach Loop container
は、コンテナ内のシートを通過します。内部の各ループコンテナー内で、Excelファイルを読み取り、SQLにデータを読み込むデータフロータスクを配置します。
以下に示すように、ループファイルという名前の最初のForeachループコンテナーを構成します。
以下に示すように、ループシートという名前の最初のForeachループコンテナーを構成します。
データフロータスク内に、Excelソース、派生列、およびOLE DB Destinationを以下に示すように配置します。
適切なExcelファイルと現在ループされているシートを読み取るようにExcelソースを構成します。
派生列を構成して、ファイル名とシート名の新しい列を作成します。これは、この例を示すためのものであり、意味はありません。
OLE DB宛先を構成して、データをSQLテーブルに挿入します。
以下のスクリーンショットは、パッケージの正常な実行を示しています。
以下のスクリーンショットは、この回答の最初に作成された2つのExcelスプレッドシートの4つのワークブックのデータが、SQLテーブルdbo.Destinationに正しくロードされることを示しています。
お役に立てば幸いです。
同じExcelシートのデータを、データ型のあるExcelで変更がなくなるまで、選択したテーブルにインポートできる方法を説明する記事を見つけました。
データが挿入されるか、新しいデータで上書きされると、インポートプロセスが正常に完了し、データがSQLデータベースのテーブルに追加されます。
記事はここにあります: http://www.sqlshack.com/using-ssis-packages-import-ms-Excel-data-database/
それが役に立てば幸い。
同様の問題があり、Excelファイルをできるだけ早く削除する方がはるかに簡単であることがわかりました。パッケージの最初のステップの一部として、Powershellを使用してExcelファイルからCSVファイルにデータを抽出しました。私のExcelファイルはシンプルでしたが、ここにあります
PowerShellを使用してすべてのExcelワークシートを抽出してCSVファイルに変換する
複数のExcelファイルや複数のシートからデータを抽出することに関するTim Smithの優れた記事です。
ExcelファイルがCSVに変換されると、データのインポートはそれほど複雑ではなくなります。