3

レコードを互いに区別する OFFICE と呼ばれる 1 つの列を含む 3 つのソース テーブルから統合されたデータを保持する SQL Server の 1 つのテーブルが与えられます。

3 つのソース テーブルには、3 つのオフィスからのデータが保持されます。

3 つの異なるオフィス (例: office1、office2、office3) に基づいて、1 つのワークブックに 3 つのシートを持つ Excel ファイルを動的に作成したいと考えています。各シートには、そのオフィスに応じた関連データが含まれています。

テンプレートファイルを作成してからそのテンプレートをコピー先のExcelファイルにコピーするアプローチを使用したくないため、SSISで動的なExcelのコピー先を使用するアプローチをお勧めします。

4

2 に答える 2

2

これは scipt タスクと C# を使用して実現できますが、はるかに簡単なソリューションが http://www.rafael-salas.com/2006/12/import-header-line-tables-_116683388696570741.htmlで示されています。

そしてフォローアップ

http://www.rafael-salas.com/2008/03/ssis-and-dynamic-excel-destinations_01.html#!

ただし、関連する詳細を要約すると、「SQL 実行タスク」を使用して実行時にシートを動的に作成してから、宛先として使用する必要があります。

シート名を保持する新しい変数を作成し、この変数を作業中の Office に設定して、それらを反復処理します。

また、各シートを作成する Create table ステートメントを保持する変数を作成します。例えば、

"CREATE TABLE "+ @[User::SheetName] + "( HeaderIDINTEGER, HeaderNameNVARCHAR(50), LineIDINTEGER, LineNameNVARCHAR(50), LineDetailsNVARCHAR(50))"

For Each コンテナー内の SQL 実行タスクの SQLSourceType プロパティを変数に設定し、作成した変数を選択して create ステートメントを保持します。

Excel Destination Component で、データ アクセス モードを [テーブル名またはビュー名変数] に変更し、作成したシート名変数を変数ドロップダウン リストから選択します。

于 2013-11-11T18:19:48.430 に答える
0

同様の機能を実行する SSIS パッケージがいくつかあります。1 つの Excel ファイルは複数のワークシートで構成され、各ワークシートには個別の SQL クエリの結果が入力されます。以下は、私が適用した基本的な一般的な手順です。開始する前に、適用するデータベースと出力 Excel ファイルの両方に対して接続マネージャーを作成していることを確認してください。

1) 制御フローでスクリプト タスクを作成し、次のように入力します。ここでは、含まれるワークシートと共に Excel ファイルを作成しています。(ワークシートにはスペースや特殊文字を含めないでください。) 以下のコードは C# です。

using System;
using System.IO;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.SqlServer.Dts.Runtime;

namespace ST_87e8d62a054b4e16b60297154afc19d8.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{

    #region VSTA generated code
    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    #endregion

    public void Main()
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        //Create First worksheet
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        xlWorkSheet.Name = "Names";

        //Define column headers for "RawData" WorkSheet
        xlWorkSheet.Cells[1, 1] = "First Name";
        xlWorkSheet.Cells[1, 2] = "Last Name";
        xlWorkSheet.Cells[1, 3] = "Title";

        // Create Second Worksheet
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2);
        xlWorkSheet.Name = "Addresses";

        //Define column headers for "CCDN" WorkSheet
        xlWorkSheet.Cells[1, 1] = "Street";
        xlWorkSheet.Cells[1, 2] = "City";
        xlWorkSheet.Cells[1, 3] = "State";
        xlWorkSheet.Cells[1, 4] = "Zip";
        xlWorkSheet.Cells[1, 5] = "Country";

        string Filename = "C:\\MyFile.xls";


        if (File.Exists(Filename))
        {
            File.Delete(Filename);
        }


        xlWorkBook.SaveAs(Filename, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);


        Dts.TaskResult = (int)ScriptResults.Success;
    }

2) 一時的に入力される 2 つのテーブルをデータベースに作成します。つまり、最初のワークシートの結果が 1 つのテーブルに入力され、2 番目のワークシートの結果が 2 番目のテーブルに入力されます。それぞれの目的を理解できるように、各テーブルの名前の前に「Working_」を付けるのが適切な命名方法です。ビューの代わりにテーブルを使用するアプローチをとったのは、ビューでは実行できない結果を並べ替える (ORDER BY) のが好きだからです。

3) SSIS パッケージに、制御フローの下に 2 つの SQL 実行タスクを追加します。最初のタスクは、作成した最初のテーブルにデータを入力する INSERT SQL ステートメントを実行し、2 番目のタスクは、作成したばかりの 2 番目のテーブルにデータを入力する別の INSERT SQL ステートメントを実行します。

4) SSIS パッケージに、制御フローの下に 2 つのデータ フロー タスクを追加します。1 つ目は最初のワークシートに入力するためのもので、2 つ目は 2 番目のワークシートに入力するためのものです。

5) 最初のデータ フロー タスクを選択し、データ フローの下に OLE DB ソースを追加します。ここで、OLE DB 接続マネージャー (データベース) を定義し、次にテーブルまたはビューを定義します。作成された最初の新しいテーブルを選択します。対象の列がすべて選択されていること、およびプレビューを実行できることを確認します。

6) データ変換フロー タスクを追加してから、Excel 出力先フロー タスクを追加します。

7) 2 番目のワークシートとテーブルについて、手順 5 と 6 を繰り返します。

8) 最後に、制御フローの下に、2 つの作業テーブルの内容を削除する Excel SQL タスクを追加します。次回パッケージを実行するときに、古い内容を含めたくない場合。

ここで、完成した Excel ファイルの書式設定をいじり、上司に感銘を与えたい場合は、最終的なタスク スクリプト (C# を使用) を使用してコードで行うこともできます。このアプローチの良い点は、SQL に特別な書式設定関数を適用する必要がないことです。Excel がすべての作業を行っています。ステップ 1 で実際にフォーマットを含めることができ、次のステップでデータをコピーするとすぐに、自動的にフォーマットされます。他のレポート出力と同様に、Excel または SSRS が最も得意とすることを行う方が効率的である場合、SQL に書式設定手順を実行させる (データベース サーバーに追加の作業を追加する) ことには意味がありません。

        public void Main()
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;
        Excel.Range xlRange;

        xlApp = new Excel.ApplicationClass();
        string Filename = "C:\\MyFile.xls";
        xlWorkBook = xlApp.Workbooks.Open(FileName, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

        //Format cells in Names worksheet
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        //Set the header range in bold font
        xlRange = xlWorkSheet.get_Range("a1", "p1");
        xlRange.Font.Bold = true;
        xlRange.WrapText = true;

        //Freeze first row listing headers
        xlWorkSheet.Application.ActiveWindow.SplitRow = 1;
        xlWorkSheet.Application.ActiveWindow.FreezePanes = true;

        //Auto adjust the width of each column
        xlWorkSheet.Columns.AutoFit();

        xlRange = xlWorkSheet.get_Range("c1", "j6467");
        xlRange.Cells.Locked = false;
        xlRange.Interior.Color = 65535;

        xlRange = xlWorkSheet.get_Range("o1", "p6467");
        xlRange.Cells.Locked = false;
        xlRange.Interior.Color = 65535;

        //Do not alert when saving changes to Excel file.
        xlWorkBook.Application.DisplayAlerts = false;

        //Save Excel file modifications
        xlWorkBook.Save();

        //Close workbook and application
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        //Release from cache.
        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);

        //Set formatting of percent cells
        xlRange = xlWorkSheet.get_Range("d3", "d7");
        xlRange.NumberFormat = "###,###%";

      //Define the top left cell and bottom right cell of the table in the Excel worksheet
        xlRange = xlWorkSheet.get_Range("c1", "c7");

        //Draw grid of thin line around each cell in table
        xlRange.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, 1);

        //Draw thick border around entire table
        xlRange = xlWorkSheet.get_Range("a1", "d7");
        xlRange.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThick, Excel.XlColorIndex.xlColorIndexAutomatic, 1);


        //Right justify columns B and C
        xlRange = xlWorkSheet.get_Range("b3", "c7");
        xlRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;



        //Do not alert when saving changes to Excel file.
        xlWorkBook.Application.DisplayAlerts = false;

        //Save Excel file modifications
        xlWorkBook.Save();

        //Close workbook and application
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        //Release from cache.
        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);


        Dts.TaskResult = (int)ScriptResults.Success;
    }

そしてそれはそれについてです。この例では、ファイル名をハードコーディングしていることに注意してください。しかし、私の実際のコードでは、ユーザー変数を適用しています。この変数は、別のデータベース テーブルから名前を取得する別の SQL ステートメントによって入力されます。ベスト プラクティスとして、SSIS パッケージを完全にテーブル駆動型にしておくことをお勧めします。そうすれば、名前と場所に加えられた変更は、SSIS パッケージに固有のレコードのデータベース テーブルで行われます。SSIS パッケージを更新し、開発、QA、運用ライフサイクルを再度行う必要がなくなります。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-03-28T00:38:01.010 に答える