2017-05-17 12 views
0

私はこのテストの基礎としてExcelのDNAサンプルを使用しています。Excel-DNA RTDのスプレッドシートを更新するにはどうすればよいですか?

私はセルB1に1秒ごとに更新されたデータを表示したいと思っています。

これは、最初の5秒ほどうまく動作します。次に、タイマーを取得し、最後の値だけを表示するために関数の終了を待つ必要があります。

ループの各サイクルでスプレッドシートに強制的に更新を表示するにはどうすればよいですか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using ExcelDna.Integration; 
using System.Threading.Tasks; 
using System.Diagnostics;  

namespace BTPRTD 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 

    public static class MyFunctions 
    { 
     public static MouseData MData; 

     [ExcelFunction(Description = "My first .NET function")] 
     public static string SayHello(string name) 
     { 
      //Debugger.Launch(); 
      MData = new MouseData(); 

      Task.Factory.StartNew(() => 
      {    
       ExcelAsyncUtil.QueueAsMacro(() => 
       { 
        KeepWritingData(); 
       }); 
      }); 
      return "Hello " + name; 
     } 

     public static void KeepWritingData() 
     { 
      var refB1 = new ExcelReference(0, 0, 1, 1, "Sheet1"); 
      string dataTxt = ""; 
      for (int i = 0; i < 100; i++) 
      { 
       try 
       { 
        MouseData .CurrentPriceData CPD = MData.GetCurrentPriceNT("White mouse"); 
        dataTxt = CPD.AsString(); 
       } 
       catch (Exception) 
       { 
        dataTxt = "Data Unavailable"; 
       } 

       refB1.SetValue("Ding: " + i + " " + dataTxt); 
       System.Threading.Thread.Sleep(1000); 
      } 
     } 
    } 
} 

答えて

0

Excelは、あなたのシナリオに使用するべきであるのRealTimeData(RTD)と呼ばれるワークシート関数の種類をサポートしています。

GitHubリポジトリの "Samples"の例に従ってください。特に、Observable Timerを使用するRtdClocks exampleをご覧ください。

public static class RtdClock 
{ 
    [ExcelFunction(Description = "Provides a ticking clock")] 
    public static object dnaRtdClock_Rx() 
    { 
     string functionName = "dnaRtdClock_Rx"; 
     object paramInfo = null; // could be one parameter passed in directly, or an object array of all the parameters: new object[] {param1, param2} 
     return ObservableRtdUtil.Observe(functionName, paramInfo,() => GetObservableClock()); 
    } 

    static IObservable<string> GetObservableClock() 
    { 
     return Observable.Timer(dueTime: TimeSpan.Zero, period: TimeSpan.FromSeconds(1)) 
         .Select(_ => DateTime.Now.ToString("HH:mm:ss")); 
    } 
} 
関連する問題