C# 如何让excel更新excel DNA RTD的电子表格?

C# 如何让excel更新excel DNA RTD的电子表格?,c#,excel,excel-dna,C#,Excel,Excel Dna,我正在使用excel DNA示例作为此测试的基础 我希望excel每1秒在单元格B1中显示更新的数据 这在最初的5秒钟内工作正常,然后我得到一个计时器,必须等待函数完成才能看到最后一个值 如何在循环的每个周期强制在电子表格上显示更新 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ExcelDna.Integration; using System.Thread

我正在使用excel DNA示例作为此测试的基础

我希望excel每1秒在单元格B1中显示更新的数据

这在最初的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);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
利用ExcelDna进行整合;
使用System.Threading.Tasks;
使用系统诊断;
名称空间BTPRTD
{
班级计划
{
静态void Main(字符串[]参数)
{
}
}
公共静态类函数
{
公共静态MouseData-MData;
[ExcelFunction(Description=“我的第一个.NET函数”)]
公共静态字符串SayHello(字符串名称)
{
//Debugger.Launch();
MData=新的MouseData();
Task.Factory.StartNew(()=>
{            
ExcelAsyncUtil.QueueAsMacro(()=>
{
KeepWritingData();
});
}); 
返回“Hello”+name;
}
公共静态void KeepWritingData()
{
var refB1=新的ExcelReference(0,0,1,1,“表1”);
字符串dataTxt=“”;
对于(int i=0;i<100;i++)
{
尝试
{
MouseData.CurrentPriceData CPD=MData.GetCurrentPriceNT(“白色鼠标”);
dataTxt=CPD.AsString();
}
捕获(例外)
{
dataTxt=“数据不可用”;
}
refB1.设置值(“丁:“+i+”+dataTxt);
系统线程线程睡眠(1000);
}
}
}
}

Excel支持一种称为RealTimeData(RTD)的工作表函数,这是您应该在场景中使用的功能

按照“”GitHub存储库中的示例进行操作。特别是,请看一下使用可观察计时器的:

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"));
    }
}
公共静态类RtdClock
{
[ExcelFunction(Description=“提供滴答作响的时钟”)]
公共静态对象dnaRtdClock_Rx()
{
字符串functionName=“dnaRtdClock\u Rx”;
object paramInfo=null;//可以是直接传入的一个参数,也可以是所有参数的对象数组:new object[]{param1,param2}
返回observertdutil.Observe(functionName,paramInfo,()=>getobservedclock());
}
静态IObservable getobserveclock()
{
返回可观察的计时器(dueTime:TimeSpan.Zero,句点:TimeSpan.FromSeconds(1))
.Select(=>DateTime.Now.ToString(“HH:mm:ss”);
}
}