Excel ExcelDNA C # /Попробуйте скопировать поведение Bloomberg BDH () (запись массива после веб-запроса)

Я хочу скопировать поведение Bloomberg BDH.

BDH делает веб-запрос и записывает массив (но не возвращает стиль массива). Во время этого веб-запроса функция возвращает «# N /A Requesting». Когда веб-запрос завершен, функция BDH () записывает результат массива в лист.

Например, в ExcelDNA мне удается записать в лист с потоком.

Результат, если вы используете приведенный ниже код в файле ДНК, результат

= WriteArray (2; 2)

будет

Строка 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>

@ To Govert

BDH стал стандартом в финансовой индустрии. Люди не знают, как манипулировать массивом (даже Ctrl + Shift + Enter).

BDH - это функция, которая сделала Bloomberg такой популярной (в ущерб Reuters).

Однако я подумаю об использовании вашего метода или RTD.

Спасибо за всю вашу работу в Excel DNA

7 голосов | спросил Farandole 12 MarpmMon, 12 Mar 2012 18:12:05 +04002012-03-12T18:12:05+04:0006 2012, 18:12:05

1 ответ


0

Я думаю, вам нужно реализовать запрос в качестве RTD-сервера. Обычные пользовательские функции не будут обновляться асинхронно.
Затем вы можете скрыть вызов RTD-сервера через пользовательскую функцию, что можно сделать через Excel-DNA.

ответил weismat 12 MarpmMon, 12 Mar 2012 18:17:40 +04002012-03-12T18:17:40+04:0006 2012, 18:17:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132