次の方法で共有


チュートリアル : サーバー上のブックにキャッシュされたデータの変更

このチュートリアルでは、ServerDocument クラスを使用して、Microsoft Office Excel ブックにキャッシュされたデータセットを、Excel を起動することなく変更する方法について説明します。

対象: このトピックの情報は、Excel 2013 と Excel 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

このチュートリアルでは、次の作業について説明します。

  • AdventureWorksLT データベースのデータを格納するデータセットを定義する。

  • Excel ブック プロジェクトおよびコンソール アプリケーション プロジェクトにデータセットのインスタンスを作成する。

  • ブックのデータセットにバインドされた ListObject を作成し、ブックが開かれたときに ListObject にデータを設定する。

  • ブックのデータセットをデータ キャッシュに追加する。

  • コンソール アプリケーションでコードを実行して、Excel を起動することなく、キャッシュされたデータセット内のデータの列を変更する。

このチュートリアルでは開発用コンピューターでコードを実行することを想定していますが、このチュートリアルに掲載されているコードは、Excel がインストールされていないサーバー上でも実行できます。

[!メモ]

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

-

Microsoft Office Developer Tools が含まれているエディションの Visual Studio 2012。詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.110\).md)」を参照してください。

データセットを定義するクラス ライブラリ プロジェクトの作成

Excel ブック プロジェクトとコンソール アプリケーションとで同じデータセットを使用するには、これらのプロジェクトの両方から参照される別個のアセンブリ内にデータセットを定義する必要があります。このチュートリアルでは、データセットをクラス ライブラリ プロジェクトに定義します。

クラス ライブラリ プロジェクトを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  3. テンプレート ペインで、[Visual C#] または [Visual Basic] を展開し、[Windows] をクリックします。

  4. プロジェクト テンプレートの一覧で、[クラス ライブラリ] を選択します。

  5. [プロジェクト名] ボックスに「AdventureWorksDataSet」と入力します。

  6. [参照] をクリックします。%UserProfile%\My Documents フォルダー (Windows XP 以前のバージョンの場合) または %UserProfile%\Documents (Windows Vista の場合) フォルダーに移動し、[フォルダーの選択] をクリックします。

  7. [新しいプロジェクト] ダイアログ ボックスで、[ソリューションのディレクトリを作成] チェック ボックスがオフになっていることを確認します。

  8. [OK] をクリックします。

    Visual Studio によって AdventureWorksDataSet プロジェクトがソリューション エクスプローラーに追加され、Class1.cs コード ファイルまたは Class1.vb コード ファイルが開かれます。

  9. ソリューション エクスプローラーで、[Class1.cs] または [Class1.vb] を右クリックし、[削除] をクリックします。このファイルは、このチュートリアルには必要ありません。

クラス ライブラリ プロジェクトへのデータセットの定義

SQL Server 2005 用 AdventureWorksLT データベースのデータを格納する型指定されたデータセットを定義します。このチュートリアルの後半で、Excel ブック プロジェクトおよびコンソール アプリケーション プロジェクトからこのデータセットを参照します。

このデータセットは、AdventureWorksLT データベースの Product テーブルのデータを表す型指定されたデータセットです。型指定されたデータセットの詳細については、「Visual Studio でのデータセットの操作」を参照してください。

クラス ライブラリ プロジェクトに型指定されたデータセットを定義するには

  1. ソリューション エクスプローラー[AdventureWorksDataSet] プロジェクトをクリックします。

  2. [データ ソース] のウィンドウが表示されない場合は、これを、[ビュー][その他のウィンドウ] を選択する、メニュー バーの [データ ソース] 表示されます。

  3. [データ ソース構成ウィザード] を開始するには [新しいデータ ソースの追加] を選択します。

  4. [データベース] をクリックし、[次へ] をクリックします。

  5. AdventureWorksLT データベースへの接続が既に設定されている場合は、その接続を選択し、[次へ] をクリックします。

    それ以外の場合は、[新しい接続] をクリックし、[接続の追加] ダイアログ ボックスを使用して新しい接続を作成します。詳細については、「方法 : データベース内のデータに接続する」を参照してください。

  6. [アプリケーション構成ファイルに接続文字列を保存] ページで、[次へ] をクリックします。

  7. [データベース オブジェクトの選択] ページで、[テーブル] を展開し、[Product (SalesLT)] を選択します。

  8. [完了] をクリックします。

    AdventureWorksLTDataSet.xsd ファイルが AdventureWorksDataSet プロジェクトに追加されます。このファイルでは、次の項目を定義します。

    • AdventureWorksLTDataSet という名前の型指定されたデータセット。このデータセットは、AdventureWorksLT データベースの Product テーブルの内容を表します。

    • ProductTableAdapter という名前の TableAdapterTableAdapter は、AdventureWorksLTDataSet のデータを読み書きするために使用します。詳細については、「TableAdapter の概要」を参照してください。

    これらのオブジェクトはどちらもこのチュートリアルの後半で使用します。

  9. ソリューション エクスプローラーで、[AdventureWorksDataSet] を右クリックし、[ビルド] をクリックします。

    プロジェクトがエラーを発生させずにビルドすることを確認します。

Excel ブック プロジェクトの作成

データとのインターフェイス用の Excel ブック プロジェクトを作成します。このチュートリアルの後半では、データを表示する ListObject を作成し、データセットのインスタンスをブック内のデータ キャッシュに追加します。

Excel ブック プロジェクトを作成するには

  1. ソリューション エクスプローラーで、[AdventureWorksDataSet] ソリューションを右クリックします。[追加] をポイントし、[新しいプロジェクト] をクリックします。

  2. テンプレート ペインで、[Visual C#] または [Visual Basic] を展開し、[Office] を展開します。

  3. [Office] の展開したノードの下で、[2010] のノードを選択します。

  4. プロジェクト テンプレートの一覧で、Excel ブック プロジェクトを選択します。

  5. [プロジェクト名] ボックスに「AdventureWorksReport」と入力します。場所は変更しないでください。

  6. [OK] をクリックします。

    Visual Studio Tools for Office プロジェクト ウィザードが開きます。

  7. [新規ドキュメントの作成] が選択されていることを確認し、[OK] をクリックします。

    Visual Studio によって、デザイナーで AdventureWorksReport ブックが開かれ、ソリューション エクスプローラーAdventureWorksReport プロジェクトが追加されます。

Excel ブック プロジェクトのデータ ソースへのデータセットの追加

Excel ブックにデータセットを表示するには、その前に Excel ブック プロジェクトのデータ ソースにデータセットを追加する必要があります。

Excel ブック プロジェクトのデータ ソースにデータセットを追加するには

  1. ソリューション エクスプローラーで、[AdventureWorksReport] プロジェクトの下の [Sheet1.cs] または [Sheet1.vb] をダブルクリックします。

    ブックがデザイナーで開かれます。

  2. [データ] メニューの [新しいデータ ソースの追加] をクリックします。

    データ ソース構成ウィザードが開きます。

  3. [オブジェクト] をクリックし、[次へ] をクリックします。

  4. [バインド先のオブジェクトを選択します] ページで、[参照の追加] をクリックします。

  5. [プロジェクト] タブで、[AdventureWorksDataSet] をクリックし、[OK] をクリックします。

  6. [AdventureWorksDataSet] アセンブリの [AdventureWorksDataSet] 名前空間の下にある [AdventureWorksLTDataSet] をクリックし、[完了] をクリックします。

    [データ ソース] ウィンドウが開き、AdventureWorksLTDataSet がデータ ソースの一覧に追加されます。

データセットのインスタンスにバインドされた ListObject の作成

データセットをブックに表示するには、データセットのインスタンスにバインドされた ListObject を作成します。コントロールのデータへのバインドの詳細については、「Office ソリューションでのコントロールへのデータのバインド」を参照してください。

データセットのインスタンスにバインドされた ListObject を作成するには

  1. [データ ソース] ウィンドウで、[AdventureWorksDataSet] の下にある [AdventureWorksLTDataSet] ノードを展開します。

  2. [Product] ノードを選択し、表示されるドロップダウン矢印をクリックします。ドロップダウン リストで [ListObject] を選択します。

    ドロップダウン矢印が表示されない場合は、デザイナーでブックが開かれていることを確認します。

  3. Product テーブルをセル A1 にドラッグします。

    productListObject という名前の ListObject コントロールが、セル A1 を始点にワークシートに作成されます。同時に、adventureWorksLTDataSet という名前のデータセット オブジェクトと、productBindingSource という名前の BindingSource がプロジェクトに追加されます。ListObjectBindingSource にバインドされ、さらにこれがデータセット オブジェクトにバインドされます。

データ キャッシュへのデータセットの追加

Excel ブック プロジェクトの外部のコードからブック内のデータセットにアクセスできるようにするには、データセットをデータ キャッシュに追加する必要があります。データ キャッシュの詳細については、「ドキュメント レベルのカスタマイズのキャッシュ データ」および「キャッシュされたデータ」を参照してください。

データ キャッシュにデータセットを追加するには

  1. デザイナーで、[adventureWorksLTDataSet] をクリックします。

  2. [プロパティ] ウィンドウで、[Modifiers] プロパティを [Public] に設定します。

  3. [CacheInDocument] プロパティを [True] に設定します。

ブック内のデータセットの初期化

コンソール アプリケーションを使用してキャッシュされたデータセットからデータを取得するには、その前にキャッシュされたデータセットにデータを設定する必要があります。

ブック内のデータセットを初期化するには

  1. ソリューション エクスプローラーSheet1.cs ファイルまたは Sheet1.vb ファイルを右クリックし、[コードの表示] をクリックします。

  2. Sheet1_Startup イベント ハンドラーを次のコードで置き換えます。このコードでは、AdventureWorksDataSet プロジェクトに定義されている ProductTableAdapter クラスのインスタンスを使用して、キャッシュされたデータセットが現在空である場合にデータを設定します。

    Private ProductTableAdapter As New  _
        AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter()
    
    Private Sub Sheet1_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
        If Me.NeedsFill("AdventureWorksLTDataSet") Then
            Me.ProductTableAdapter.Fill(Me.AdventureWorksLTDataSet.Product)
        End If
    End Sub
    
    private AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter productTableAdapter =
        new AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
    
    private void Sheet1_Startup(object sender, System.EventArgs e)
    {
        if (this.NeedsFill("adventureWorksLTDataSet"))
        {
            this.productTableAdapter.Fill(this.adventureWorksLTDataSet.Product);
        }
    }
    

チェックポイント

Excel ブック プロジェクトをビルドして実行して、エラーが発生することなくコンパイルおよび実行されることを確認します。また、この操作では、キャッシュされたデータセットにデータを設定し、データをブックに保存します。

プロジェクトをビルドして実行するには

  1. ソリューション エクスプローラーで、[AdventureWorksReport] プロジェクトを右クリックします。[デバッグ] を選択し、[新しいインスタンスを開始] をクリックします。

    プロジェクトがビルドされ、ブックが Excel で開かれます。次の点を確認します。

    • ListObject にデータが格納されている。

    • ListObject の最初の行の ListPrice 列の値が 1431.5 である。このチュートリアルの後半で、コンソール アプリケーションを使用して ListPrice 列の値を変更します。

  2. ブックを保存します。ブックのファイル名または場所は変更しないでください。

  3. Excel を終了します。

コンソール アプリケーション プロジェクトの作成

ブックのキャッシュされたデータセット内のデータを変更するコンソール アプリケーション プロジェクトを作成します。

コンソール アプリケーション プロジェクトを作成するには

  1. ソリューション エクスプローラーで、[AdventureWorksDataSet] ソリューションを右クリックします。[追加] をポイントし、[新しいプロジェクト] をクリックします。

  2. [プロジェクトの種類] ペインで、[Visual C#] または [Visual Basic] を展開し、[Windows] をクリックします。

  3. [テンプレート] ペインで [コンソール アプリケーション] を選択します。

  4. [プロジェクト名] ボックスに「DataWriter」と入力します。場所は変更しないでください。

  5. [OK] をクリックします。

    Visual Studio によって DataWriter プロジェクトがソリューション エクスプローラーに追加され、コード ファイルの Program.cs または Module1.vb が開かれます。

コンソール アプリケーションによるキャッシュされたデータセット内のデータの変更

ローカルの AdventureWorksLTDataSet オブジェクトにデータを読み込み、このデータを変更してからキャッシュされたデータセットに戻すには、コンソール アプリケーションで ServerDocument クラスを使用します。

キャッシュされたデータセット内のデータを変更するには

  1. ソリューション エクスプローラーで、[DataWriter] プロジェクトを右クリックし、[参照の追加] をクリックします。

  2. [.NET] のタブで、[Microsoft.VisualStudio.Tools.Applications。

  3. [OK] をクリックします。

  4. ソリューション エクスプローラーで、[DataWriter] プロジェクトを右クリックし、[参照の追加] をクリックします。

  5. [プロジェクト] タブで、[AdventureWorksDataSet] を選択し、[OK] をクリックします。

  6. コード エディターで Program.cs ファイルまたは Module1.vb ファイルを開きます。

  7. コード ファイルの先頭に次の using ステートメント (C# の場合) または Imports ステートメント (Visual Basic の場合) を追加します。

    Imports Microsoft.VisualStudio.Tools.Applications
    
    using Microsoft.VisualStudio.Tools.Applications;
    
  8. Main メソッドに次のコードを追加します。このコードは、次のオブジェクトを宣言します。

    • AdventureWorksDataSet プロジェクトに定義されている AdventureWorksLTDataSet 型のインスタンス

    • AdventureWorksReport プロジェクトのビルド フォルダー内の AdventureWorksReport ブックへのパス

    • ブックのデータ キャッシュにアクセスするための ServerDocument オブジェクト

      [!メモ]

      次のコードでは、ファイル拡張子として .xlsx を持つブックを使用していると想定しています。プロジェクトのブックで異なるファイル拡張子を使用している場合は、必要に応じてパスを変更してください。

    Dim productDataSet As New AdventureWorksDataSet.AdventureWorksLTDataSet()
    Dim workbookPath As String = System.Environment.GetFolderPath( _
        Environment.SpecialFolder.MyDocuments) & _
        "\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx"
    Dim serverDocument1 As ServerDocument = Nothing
    
    AdventureWorksDataSet.AdventureWorksLTDataSet productDataSet =
        new AdventureWorksDataSet.AdventureWorksLTDataSet();
    string workbookPath = System.Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments) +
        @"\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx";
    ServerDocument serverDocument1 = null;
    
  9. 前の手順で追加したコードの後で、次のコードを Main メソッドに追加します。このコードは次のタスクを実行します。

    • ServerDocument クラスの CachedData プロパティを使用して、ブックのキャッシュされたデータセットにアクセスします。

    • キャッシュされたデータセットからローカル データセットにデータを読み込みます。

    • データセットの Product テーブル内の各製品の ListPrice 値を変更します。

    • 変更をブックのキャッシュされたデータセットに保存します。

    Try
        serverDocument1 = New ServerDocument(workbookPath)
        Dim dataHostItem1 As CachedDataHostItem = _
            serverDocument1.CachedData.HostItems("AdventureWorksReport.Sheet1")
        Dim dataItem1 As CachedDataItem = dataHostItem1.CachedData("AdventureWorksLTDataSet")
    
        If dataItem1 IsNot Nothing Then
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Read the cached data from the worksheet dataset into the local dataset.
            Dim schemaReader As New System.IO.StringReader(dataItem1.Schema)
            Dim xmlReader As New System.IO.StringReader(dataItem1.Xml)
            productDataSet.ReadXmlSchema(schemaReader)
            productDataSet.ReadXml(xmlReader)
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Modify the prices of each product in the local dataset.
            Dim row As AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow
            For Each row In productDataSet.Product.Rows
                If row.ProductCategoryID < 20 Then
                    row.ListPrice = row.ListPrice + row.ListPrice * 0.1
                Else
                    row.ListPrice = row.ListPrice - row.ListPrice * 0.1
                End If
            Next row
    
            ' Write the modified local dataset to the worksheet dataset using the DiffGram format.
            Dim stringIn As New System.Text.StringBuilder()
            Dim stringOut As New System.IO.StringWriter(stringIn)
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram)
            dataItem1.Xml = stringIn.ToString()
    
            serverDocument1.Save()
            Console.WriteLine("The product prices have been modified.")
        Else
            Console.WriteLine("The data object is not found in the data cache.")
        End If
    Catch ex As System.IO.FileNotFoundException
        Console.WriteLine("The specified workbook does not exist.")
    Catch ex As System.Xml.XmlException
        Console.WriteLine("The data object has invalid XML information.")
    Finally
        If Not (serverDocument1 Is Nothing) Then
            serverDocument1.Close()
        End If
        Console.WriteLine(vbLf & vbLf & "Press Enter to close the application.")
        Console.ReadLine()
    End Try
    
    try
    {
        serverDocument1 = new ServerDocument(workbookPath);
        CachedDataHostItem dataHostItem1 =
            serverDocument1.CachedData.HostItems["AdventureWorksReport.Sheet1"];
        CachedDataItem dataItem1 = dataHostItem1.CachedData["adventureWorksLTDataSet"];
    
        if (dataItem1 != null)
        {
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Read the cached data from the worksheet dataset into the local dataset.
            System.IO.StringReader schemaReader = new System.IO.StringReader(dataItem1.Schema);
            System.IO.StringReader xmlReader = new System.IO.StringReader(dataItem1.Xml);
            productDataSet.ReadXmlSchema(schemaReader);
            productDataSet.ReadXml(xmlReader);
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Modify the prices of each product in the local dataset.
            foreach (AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow row in 
                     productDataSet.Product.Rows)
            {
                if (row.ProductCategoryID < 20)
                {
                    row.ListPrice = row.ListPrice + (row.ListPrice * (Decimal).10);
                }
                else
                {
                    row.ListPrice = row.ListPrice - (row.ListPrice * (Decimal).10);
                }
            }
    
            // Write the modified local dataset to the worksheet dataset using the DiffGram format.
            System.Text.StringBuilder stringIn = new System.Text.StringBuilder();
            System.IO.StringWriter stringOut = new System.IO.StringWriter(stringIn);
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram);
            dataItem1.Xml = stringIn.ToString();
    
            serverDocument1.Save();
            Console.WriteLine("The product prices have been modified.");
        }
        else
        {
            Console.WriteLine("The data object is not found in the data cache.");
        }
    }
    catch (System.IO.FileNotFoundException)
    {
        Console.WriteLine("The specified workbook does not exist.");
    }
    catch (System.Xml.XmlException)
    {
        Console.WriteLine("The data object has invalid XML information.");
    }
    finally
    {
        if (serverDocument1 != null)
        {
            serverDocument1.Close();
        }
    
        Console.WriteLine("\n\nPress Enter to close the application.");
        Console.ReadLine();
    }
    
  10. ソリューション エクスプローラーで、[DataWriter] プロジェクトを右クリックします。[デバッグ] をポイントし、[新しいインスタンスを開始] をクリックします。

    キャッシュされたデータセットをローカル データセットに読み込む処理、ローカル データセット内の製品の価格を変更する処理、および新しい値をキャッシュされたデータセットに保存する処理がコンソール アプリケーションによって実行されている間、メッセージが表示されます。Enter キーを押してアプリケーションを閉じます。

ブックのテスト

ブックを開くと、キャッシュされたデータセット内のデータの ListPrice 列に加えた変更が ListObject に表示されます。

ブックをテストするには

  1. Visual Studio デザイナーに AdventureWorksReport ブックが開かれている場合はこれを閉じます。

  2. AdventureWorksReport プロジェクトのビルド フォルダーにある AdventureWorksReport ブックを開きます。ビルド フォルダーは、既定で次のどちらかの場所に設定されます。

    • %UserProfile%\My Documents\AdventureWorksReport\bin\Debug (Windows XP 以前のバージョンの場合)

    • %UserProfile%\Documents\AdventureWorksReport\bin\Debug (Windows Vista の場合)

  3. ListObject の最初の行の ListPrice 列の値が 1574.65 になっていることを確認します。

  4. ブックを閉じます。

参照

処理手順

チュートリアル : サーバー上のブックへのデータの挿入

概念

Windows フォーム アプリケーションでのデータへの接続