Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818

Использование функции из библиотеки Excel

06.05.2016, 23:02. Показов 2710. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, у меня проблема с работой библиотеки Exel(некоторыми их функциями)
Всё подлкючил
C#
1
using Excel = Microsoft.Office.Interop.Excel;
все вроде как работает, сделал добавление случайного числа, вроде все ок.
работает формула добавление случайного числа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            Excel.Application excel = new Excel.Application(); //создаем COM-объект Excel
            Object formula, result; //переменные для хранения формулы и результата
            formula = ""; //берем формулу
            result = excel._Evaluate(formula); //вычисляем формулу
            MessageBox.Show(result.ToString()); //выводим результат
            string h = "0.1;0.2;0.3;0.4;0.5";
            string rand = "";
            int rnumb = 200;
            for (int i = 0; i < rnumb; i++)
            {
                rand = rand + Convert.ToString(excel._Evaluate("=RAND()"));
                if (i != 0 || i != rnumb - 1)
                {
                    rand = rand + ";";
                }
            }

Но вот эту формулу (Частота) не воспринимает и возращает -2146826273
C#
1
2
3
            int res = excel._Evaluate("{=FREQUENCY({22;22;22;22};{22})}");
            MessageBox.Show(Convert.ToString(excel._Evaluate("{=FREQUENCY({"+rand+"};{"+h+"})}")));
            excel.Quit();
как мне исправить работу этой формулы?
int res = excel._Evaluate("{=FREQUENCY({22;22;22;2 2};{22})}");
кажется правильно записал....

Добавлено через 5 часов 26 минут
подскажет кто в чем проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.05.2016, 23:02
Ответы с готовыми решениями:

Использование С++ библиотеки
Добрый вечер. Как создать экземпляр класса из библиотеки на плюсах в шарпе ? C# компилятор говорит, что ClassesLibrary.Test...

Использование C++ библиотеки в C#
А что делать, если есть только dll библиотека на неуправляемом с++? Тогда ее можно использовать в с#? Если да, то как?

Использование функции сортировки из динамической библиотеки
Нужно сделать сортировку и засечь время. Сортировку взять из заранее созданной библиотеки. Библиотеку привязал к main.c. Функцию так же...

7
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
07.05.2016, 00:03
Лучший ответ Сообщение было отмечено Lynatik001 как решение

Решение

C#
1
2
object[,] res = excel._Evaluate("=FREQUENCY({2,1,2,1,2,3},{1,2})");
MessageBox.Show(res[1, 1].ToString() + " " + res[2, 1].ToString() + " " + res[3, 1].ToString());
res[1, 1] - кол-во элементов x<=1
res[2, 1] - кол-во элементов 1<x<=2
res[3, 1] - кол-во элементов x>2
1
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
07.05.2016, 06:13  [ТС]
Цитата Сообщение от Даценд Посмотреть сообщение
res[1, 1] - кол-во элементов x<=1
res[2, 1] - кол-во элементов 1<x<=2
res[3, 1] - кол-во элементов x>2
Спасибо, а значение В екселе при формуле то одно =ЧАСТОТА(A1:D50;A52:A60) -выводит одно значение, это какое из этих 3ех?

Добавлено через 2 часа 32 минуты
Самый каверзный вопрос что меня мучает. если у меня в формуле меньше 5 значений(не факт что нельзя еще чуть больше) rnumb<5 то всё хорошо работает. Вот только мне нужно впихнуть туда 400 значений т.е. rnumb=400
но при попвытке зделать так как захотел вылетает :

Необработанное исключение типа "Microsoft.CSharp.RuntimeBinder.RuntimeB inderException" в System.Core.dll
Дополнительные сведения: Не удается неявно преобразовать тип "int" в "object[*,*]"



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            string h = "0,1;0,2;0,3;0,4;0,5";
            string rand = "";
            int rnumb = 15;
            for (int i = 0; i < rnumb; i++)
            {
                rand = rand + Convert.ToString(excel._Evaluate("=RAND()"));
                if (i!= rnumb - 1)
                {
                    rand = rand + ";";
                }
            }
           
            string txt = "=FREQUENCY({" + rand + "},{" + h + "})";
            object[,] res = excel._Evaluate(txt);
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
07.05.2016, 11:57
Цитата Сообщение от Lynatik001 Посмотреть сообщение
В екселе при формуле то одно =ЧАСТОТА(A1: D50;A52:A60) -выводит одно значение, это какое из этих 3ех?
И в Excel функция FREQUENCY или ЧАСТОТА является функцией возвращающей массив. Этот массив содержит количество элементов на 1 большее количества ячеек (значений) во втором аргументе. Минимально массив может содержать 2 значения.
Например, формула =ЧАСТОТА(A1: D50;A52:A60) вернет массив из 10-ти элементов.

Цитата Сообщение от Lynatik001 Посмотреть сообщение
Не удается неявно преобразовать тип "int" в "object[*,*]
В данном случае это исключение означает, что текст формулы составлен неверно и вместо массива объектов возвращается одно целое число. Обратите внимание на разделители. Для разделения чисел в аргументах нужно использовать только запятые. Дробную часть отделяйте точкой, т.е.
C#
1
string h = "0.1, 0.2, 0.3, 0.4, 0.5";
и
C#
9
rand = rand + ",";
1
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
07.05.2016, 20:24  [ТС]
C#
1
"=FREQUENCY({0.997382463578344,0.830414032138796,0.188244687588659,0.097996385374897,0.160416345021601,0.549325962644638,0.171823465531237,0.791747571988594,0.945840526157768,0.688565932150169,0.923109452917683,0.609541698011182,0.220526166133123,0.573740591855504,0.983622531368182},{0.1,0.2,0.3,0.4,0.5})"
вроде как послушал вашего совета вот так сделал, но опять же выдает ошибку

Добавлено через 43 минуты
Ввобщем решил проблему заменой
C#
1
excel._Evaluate("=RAND()")
на
C#
1
double f = rnd.NextDouble();
и все прекрасно работает спасибо за помощь

Добавлено через 45 минут
Хотя стоп, это я опять затупил, проблему не решил, забыл добавить в формулу... удачные попытки выходили только с 0.1(введеные вручную) значениями не дольше...
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
07.05.2016, 20:26
Цитата Сообщение от Lynatik001 Посмотреть сообщение
решил проблему заменой
А я думал, это у вас учебное задание на использование функций Excel в C#.
Раз это не так, то лучше и FREQUENCY заменить методом.
Я попробовал округлять, так больше исходных данных воспринимается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Excel.Application excel = new Excel.Application();
string com1 = "=ROUND(RAND(),3)";
int rnumb = 30; //при 3-х знаках после запятой считает 30 значений 
List<string> list = new List<string>();
for (int i = 0; i < rnumb; i++)
{
    string s = (excel._Evaluate(com1).ToString()).Replace(",", ".");
    list.Add(s);
}
string arg1 = "{" + string.Join(", ", list) + "}";
string arg2 = "{0.1, 0.2, 0.3, 0.4, 0.5}";
string com2 = "=FREQUENCY(" + arg1 + ", " + arg2 + ")";
object[,] res = excel._Evaluate(com2);
excel.Quit();
for (int i = 1; i <= res.GetLength(0); i++)
{
    listBox1.Items.Add(res[i, 1].ToString());
}
1
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
07.05.2016, 20:52  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            Excel.Application excel = new Excel.Application(); //создаем COM-объект Excel
 
            String h = "0.1, 0.2, 0.3, 0.4, 0.5";
            String rand = "";
            int rnumb = 16;
            Random rnd = new Random();
            double f = rnd.NextDouble();
            for (int i = 0; i < rnumb; i++)
            {
                rand = rand + Convert.ToString(rnd.NextDouble());
                if (i!= rnumb - 1)
                {
                    rand = rand + ";";
                }
            }
           rand = rand.Replace(',', '.');
           rand = rand.Replace(';', ',');
            String txt = "=FREQUENCY({" + rand + "},{" + h + "})";
            object[,] res1 = excel._Evaluate(txt);
            excel.Quit();
ппц сколько не мучаюсь не хочет работать.... при rnumb = 5 (+-5) работает
а вот с rnumb = 16+; уже перестает работать и начинает выдавать такую вот ошибку....

Добавлено через 19 минут
Цитата Сообщение от Даценд Посмотреть сообщение
int rnumb = 30; //при 3-х знаках после запятой считает 30 значений
Дополнительные сведения: Не удается неявно преобразовать тип "int" в "object[*,*]"

Спасибо за пример, правда мне по заданию нужно 400 случайных значений. и при подстановке
в rnumb = 400 вылетает до боли знакомая ошибка Дополнительные сведения: Не удается неявно преобразовать тип "int" в "object[*,*]"

Ввобщем к чему я веду, у меня задание Получить экспериментально распределение хи-квадрат для датчика Random. Объем выборки - 400, интервалов - 5

делаю про примеру сделаному в exel вот и использую его функции...
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
07.05.2016, 21:28
Лучший ответ Сообщение было отмечено Lynatik001 как решение

Решение

Lynatik001,
набросал класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class RandomArray
{
    //массив значений
    double[] array;
    //верхние границы интервалов
    double[] intervals = { 0.2, 0.4, 0.6, 0.8, 1.0 };
    public RandomArray(int size) //конструктор, принимает количество элементов в создаваемом массиве
    {
        Random rnd = new Random();
        array = new double[size];
        for (int i = 0; i < size; i++)
        {
            array[i] = rnd.NextDouble();
        }
    }
    public int[] Frequency() //метод возвращающий массив частот
    {
        int[] freqArray = new int[intervals.Length + 1];
        for (int i = 0; i < array.Length; i++)
        {
            freqArray[GetIndex(array[i])]++;
        }
        return freqArray;
    }
    int GetIndex(double d) //метод, определяющий номер интервала для элемента
    {
        for (int i = 0; i < intervals.Length; i++)
        {
            if (d < intervals[i]) return i;
        }
        return intervals.Length;
    }
    public double[] GetArray() //возвращение массива
    {
        return array;
    }
 
}
Использование в консоли:
C#
1
2
3
RandomArray arr = new RandomArray(400);
Console.WriteLine(string.Join("\n", arr.GetArray()));
Console.WriteLine(string.Join(" ", arr.Frequency()));
Думаю, в Forms применить тоже сможете.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2016, 21:28
Помогаю со студенческими работами здесь

Какие Excel библиотеки необходимы для создания CreateObject('Excel.Application') ?
проблема в том что клиент не хочет пользоваться MS Excel. существуют ли возможность работы с Open Office, Star Office, MS Works. или может...

Возможно ли использование Variant Excel, Book, Sheet без установленного Excel?
Можно ли сделать как написано в названии?

Использование библиотеки gmp
Здравствуйте, подскажите,пожалуйста, как значение переменной типа int записать в переменную типа mpz_t?

Подключение библиотеки и использование на C++
Здравствуйте ! подскажите пожалуйста , как подключить библиотеку opengl or directx к с++ builder у меня установлена с++ builder xe3 . ...

Использование библиотеки STL
День добрый! Вопрос такой: насколько уместно везде использовать библиотеку stl? Можно даже взять конкретный пример: Есть набор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru