Excel ExcelDNA C# / 尝试复制 Bloomberg BDH() 行为(在 Web 请求后写入数组)

2023-12-25

我想复制 Bloomberg BDH 的行为。

BDH 发出 Web 请求并写入数组(但不返回数组样式)。在此 Web 请求期间,该函数返回“#N/A Requesting”。 当 Web 请求完成时,BDH() 函数将数组结果写入工作表中。

例如,在ExcelDNA中,我成功地用线程在工作表中写入。

如果您在 DNA 文件中使用以下代码,结果为

=写入数组(2;2)

will be

1号线 >#N/A Requesting Data (0,1)

2号线 >(1,0) (1,1)

最后一期是要替换#N/A Requesting Data与值并复制公式。 当您取消注释 //xlActiveCellType.InvokeMember("FormulaR1C1Local" 时,您接近结果,但没有正确的行为

文件.dna

 <DnaLibrary Language="CS" RuntimeVersion="v4.0">
<![CDATA[

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using ExcelDna.Integration;


    public static class WriteForXL
    {

        public static object[,] MakeArray(int rows, int columns)
        {
            if (rows == 0 && columns == 0)
            {
                rows = 1;
                columns = 1;
            }


            object[,] result = new string[rows, columns];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    result[i, j] = string.Format("({0},{1})", i, j);
                }
            }

            return result;
        }

        public static object WriteArray(int rows, int columns)
        {
            if (ExcelDnaUtil.IsInFunctionWizard())
                return "Waiting for click on wizard ok button to calculate.";

            object[,] result = MakeArray(rows, columns);

            var xlApp = ExcelDnaUtil.Application;
            Type xlAppType = xlApp.GetType();
            object caller = xlAppType.InvokeMember("ActiveCell", BindingFlags.GetProperty, null, xlApp, null);
            object formula = xlAppType.InvokeMember("FormulaR1C1Local", BindingFlags.GetProperty, null, caller, null);

            ObjectForThread q = new ObjectForThread() { xlRef = caller, value = result, FormulaR1C1Local = formula };

            Thread t = new Thread(WriteFromThread);
            t.Start(q);            

            return "#N/A Requesting Data";
        }

        private static void WriteFromThread(Object o)
        {
            ObjectForThread q = (ObjectForThread) o;

            Type xlActiveCellType = q.xlRef.GetType();

            try
            {
                for (int i = 0; i < q.value.GetLength(0); i++)
                {
                    for (int j = 0; j < q.value.GetLength(1); j++)
                    {
                        if (i == 0 && j == 0)
                            continue;

                        Object cellBelow = xlActiveCellType.InvokeMember("Offset", BindingFlags.GetProperty, null, q.xlRef, new object[] { i, j });
                        xlActiveCellType.InvokeMember("Value", BindingFlags.SetProperty, null, cellBelow, new[] { Type.Missing, q.value[i, j] });             
                    }
                }                               
            }
            catch(Exception e)
            {                
            }
            finally
            {
                //xlActiveCellType.InvokeMember("Value", BindingFlags.SetProperty, null, q.xlRef, new[] { Type.Missing, q.value[0, 0] });
                //xlActiveCellType.InvokeMember("FormulaR1C1Local", BindingFlags.SetProperty, null, q.xlRef, new [] { q.FormulaR1C1Local });               
            }
        } 

public class ObjectForThread
        {
            public object xlRef { get; set; }
            public object[,] value { get; set; }
            public object FormulaR1C1Local { get; set; }
        }

    }

    ]]>

</DnaLibrary>

@戈弗特

BDH已成为金融行业的标准。人们不知道如何操作数组(甚至不知道如何操作 Ctrl+Shift+Enter)。

BDH 正是使彭博社如此受欢迎的功能(对路透社来说是不利的)。

不过我会考虑使用你的方法或 RTD。

感谢您在 Excel DNA 中所做的所有工作


我想你已经尝试过Excel-DNA https://github.com/Excel-DNA/ExcelDna 数组调整器 http://excel-dna.net/2011/01/30/resizing-excel-udf-result-arrays/示例,它小心地避免了您遇到的许多问题。我想了解您认为数组公式编写方法的缺点是什么。

现在,关于你的功能:

首先,您无法安全地将“调用者”Range COM 对象传递给另一个线程 - 而是传递带有地址的字符串,并从另一个线程获取 COM 对象(在工作线程上使用对 ExcelDnaUtil.Application 的调用)。不过,大多数时候你会很幸运。 更好的方法是从工作线程让 Excel 在主线程上运行宏 - 通过调用 Application.Run。 Excel-DNA ArrayResizer 示例展示了如何完成此操作。

其次,您几乎肯定不需要 ActiveCell,而是 Application.Caller。 ActiveCell 很可能与运行公式的单元格无关。

接下来 - 每次您再次设置公式时,Excel都会重新计算您的函数 - 因此,当您在finally子句中启用公式集时,会让您陷入无限循环。您不能同时设置单元格的值和公式- 如果单元格有公式,那么 Excel 将使用该公式来计算值。如果设置值,公式将被删除。 目前尚不清楚您想要在 [0,0] 单元格中实际保留什么 - IIRC Bloomberg 修改了那里的公式,使其记住写入的范围有多大。您可以尝试向函数添加一些参数,告诉函数是否重新计算或是否返回实际值作为结果。

最后,您可能需要重新考虑 Bloomberg BDH 功能是否是您想要做的事情的一个很好的例子。它破坏了工作表的依赖性计算,这对性能和维护电子表格模型的一致性都有影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel ExcelDNA C# / 尝试复制 Bloomberg BDH() 行为(在 Web 请求后写入数组) 的相关文章

随机推荐

  • Databricks JDBC 集成安全性

    帮助 我需要使用我的 Azure AD 凭据从 Azure databricks 集群连接到 SQL Azure 实例 我已经测试过了 我可以通过我的 Azure AD 凭据使用 SSMS SQL Server Management Stu
  • 订阅 Angular 2

    我希望我的 ngOnInit 函数做接下来的事情 使用 this structRequest sendRequest 发出一些数据的 http 请求 效果很好 并且在收到数据后开始使用 this viewNodes 函数查看它 我使用 su
  • 网站图标必须为 32×32 或 16×16 吗?

    我想使用单个图像作为常规图标和 iPhone iPad 友好图标 这可能吗 如果作为常规浏览器图标链接 iPad 友好的 72 72 PNG 会缩放吗 或者我是否必须使用单独的 16 16 或 32 32 图像 2020 年更新 坚持 16
  • 检测倾斜字体中单词之间的空格(条)

    我编写了一个 python 脚本来检测图像中编码的字母 该脚本正在使用openCV模板匹配匹配图像中嵌入的字符 字母 除空格 空格键 字符外 检测工作正常 Here is a sample image 在 python 中是否有一些 简单
  • Pandas DataFrame 访问器类型提示

    Pandas 允许您使用以下方法扩展其 DataFrame 类pd api extensions register dataframe accessor 装饰师 虽然这是功能性的 但它不提供任何额外的类型提示功能 例如 我希望以下内容能够键
  • 视角约束有什么意义?

    在哪视图约束 http download oracle com docs cd B14117 01 server 101 b10759 clauses002 htm i1002565有用 我的意思是 Oracle 允许在视图上创建约束 它们
  • 用 AppCompat 替换 ActionBarSherlock

    我目前正在开发一个简单的导航抽屉 滑动选项卡 然而 我希望在我自己的应用程序上进行材料设计 所以 除了摆脱 我别无选择ActionBarSherlock 在这些尝试中 我发现有两种类型的导入 如下所示 import com actionba
  • 由属性公开的私有变量[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我搜索了一些文档 并尝试了 Xcode 和 AppCode 但我仍然对一些事情不确定 那么有人可以澄清我吗 如果我有名为 foo 的属性 是否应
  • Visual Studio 构建步骤和 MSBuild 构建步骤之间的差异

    我正在创建一些构建定义 我发现 Visual Studio 构建步骤和 MSBuild 构建步骤之间的唯一区别是 VS 构建步骤将 Visual Studio 版本添加到构建中 有人可以解释更多差异吗 正如丹尼尔提到的 它们几乎是一样的 主
  • 如何使用 Obj-C 轻松保存窗口大小和位置状态?

    使用 Obj C 记住应用程序加载之间的 Windows 位置的最佳方法是什么 我正在使用 Interface Builder 作为界面 是否可以通过绑定来做到这一点 推荐的方法是什么 谢谢 在 Interface Builder 的属性下
  • Nivoslider 更新或重启甚至销毁

    我在加载动态内容时尝试更新 nivoslider 时遇到一些问题 我需要做的是当我通过加载新内容时更新滑块AJAX call 所以基本上我有一个 div 从函数中获取新数据AJAX调用并在加载后我需要滑块重新初始化 我现在做的是这样的 if
  • Python 中的简单素数生成器

    有人可以告诉我这段代码做错了什么吗 无论如何 它只是打印 计数 我只想要一个非常简单的素数生成器 没什么花哨的 import math def main count 3 one 1 while one 1 for x in range 2
  • 反转带有重音字符的字符串?

    所以我看到了乔恩的双向飞碟video http vimeo com 7403673并且有一个代码示例 应该是有问题 逆转后 但我想它在 net2上失败了 恕我直言 无论如何它确实对我有用并且我确实看到了correct反转的字符串 char
  • 如何防止移动设备上弹出键盘?

    http api jqueryui com spinner http api jqueryui com spinner 我正在尝试在我的网站中使用上面的 jQuery spinner 它的演示位于 API 底部 它在计算机上确实有效 但在移
  • java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么?

    Java类java lang reflect Array http docs oracle com javase 8 docs api java lang reflect Array html提供了一组用于动态创建数组的工具 然而除此之外
  • ChartJS - 绘制带有按月标签、按日数据的图表

    我想画一个折线图Chartjs http www chartjs org 按天显示数据 但按月标记 如果标签按天显示 则有很多点 所以 我想按月而不是按天显示标签 例如 有人可以教我怎么做吗 谢谢 只需将 xAxes gt time 属性配
  • Java 中考虑增补字符的字符串的总字符数(不是代码单元)

    考虑到字符串可能具有需要 2 个代码单元进行编码的增补字符 如何获取字符串的总字符数 Example String strTest a Supplementary character System out println strTest l
  • 有关禁用或隐藏菜单项的规则[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您是否曾经遇到过这样的情况 您确实非常想使用某个菜单功能 但又无法使其被禁用或更糟的是全部消失 有一个论点是始终保持菜单启用状态 然后向用户显示
  • 我们可以在 C 中的 printf 中仅使用一个变量来表示多种格式描述符吗

    是否可以编写像我在下面编写的代码一样的代码 printf n c c n c only one variable for all printf c c c n only one variable for all 我必须在每种情况下打印不同的
  • Excel ExcelDNA C# / 尝试复制 Bloomberg BDH() 行为(在 Web 请求后写入数组)

    我想复制 Bloomberg BDH 的行为 BDH 发出 Web 请求并写入数组 但不返回数组样式 在此 Web 请求期间 该函数返回 N A Requesting 当 Web 请求完成时 BDH 函数将数组结果写入工作表中 例如 在Ex