Форум программистов, компьютерный форум, киберфорум
MS Office Excel
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21

Создать XLL для Excel

15.09.2017, 16:31. Показов 4962. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем Привет!
Есть ли инструменты (где можно писать на C++, C#) и литература (где можно почитать) как создать XLL для Excel?
Так и не нашел вменяемой литературы и инструментария, кроме Microsoft Visual Studio Community 2017+С#+Excel-DNA.
Слышал о Excel 2013 SDK: Excel 2013 XLL - близко не знаком, кто-то пользовался?
VSTO, Add-in Express - не удобно из-за регистрации библиотек, в отличии от XLL, плюс второй инструмент платный.
К примеру такой простой листинг
Кликните здесь для просмотра всего текста
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Text;
using ExcelDna.Integration;
 
namespace Excel_xll
{
    public static class MyFunctions
    {
        static byte[] bChars;
 
        [ExcelFunction(Description = "Russian letters + space")]
        public static string Rus(string text)
        {
            //byte[] bChars = Encoding.Unicode.GetBytes(text);
            bChars = Encoding.Unicode.GetBytes(text);
            int y = -2;
            bool notLastSpace = false;
            long m = bChars.Length;
            unsafe
            {
            fixed (Byte* bChars = MyFunctions.bChars)
            //for (long x = 0; x < bChars.Length; x = x + 2)
            for (long x = 0; x < m; x = x + 2)
                    {
                        Byte vChar = bChars[x];
                        Byte vLang = bChars[x + 1];
                        if (vLang == 0)
                        {
                            if (vChar == 32)
                            {
                                if (notLastSpace)
                                {
                                    y = y + 2;
                                    bChars[y] = vChar;
                                    bChars[y + 1] = vLang;
                                    notLastSpace = false;
                                }
                            }
                        }
                        else if (vLang == 4)
                        {
                            if (vChar > 15 && vChar < 80)
                            {
                                y = y + 2;
                                bChars[y] = vChar;
                                bChars[y + 1] = vLang;
                                notLastSpace = true;
                            }
                            else if (vChar == 1 || vChar == 81)
                            {
                                y = y + 2;
                                bChars[y] = vChar;
                                bChars[y + 1] = vLang;
                                notLastSpace = true;
                            }
                        }
                    }
            }
 
            if (y > -1)
            {
                text = Encoding.Unicode.GetString(bChars, 0, y + 2);
            }
            else { text = ""; }
            return text;
    }
    }
}

в студии + Excel-DNA, весит аж 936 КБ, при весе самой библиотеки 5 КБ!+ до 30% ресурсов уходит на работу через обертки.
Подозреваю, что есть инструмент где сразу можно писать на С++ библиотеку XLL, с меньшим размером и оберткой.
Приложу пример где набросал простую функцию (Rus) для Excel в XLL (библиотека распаковывается из файла автоматом при открытии) в сравнении с аналогичной в VBA.
Вложения
Тип файла: rar onlyRus3.rar (835.7 Кб, 40 просмотров)
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2017, 16:31
Ответы с готовыми решениями:

Как создать ссылку в excel для отправки файла excel
вот в чем вопрос есть прайс ну там несколько записей нужна ссылка по нажатию на которую мне на почту отправлялась письмо с этим ...

Создать макрос для взятия данных с word документов в excel
Нужна помощь в написании макроса. Макрос должен брать данные с word документов в excel. Добрые люди помогите. Добавлено через 51...

В таблице Excel создать правило для определения занятости ячейки, как?
Здравствуйте, ПОДРОБНЕЕ- В таблице из 100*100 ячеек- по вертикали, надо создать правило/функцию, чтоб внизу таблицы, внизу каждого столбца,...

5
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
17.10.2017, 21:28  [ТС]
Итак, погуглив эту тему и потратив некоторое время создал xll на С (Си) через WINAPI - работа напрямую с листом Excel.
Хочу поделится результатами и послушать мнением стоило ли это таких усилий.

Итак, написав 3 разных библиотеки и одну функцию в VBA, выкладываю результаты тестирования.
Моя машина ОЗУ-16Гб DDR3, ЦП Core i7-3770 (8 лог.ядер).
Библиотеки для Excel x64 (начиная с 2007).

Результаты:
Обработка 100 тыс. строк
Циклом в VBA (модуль RUS)
1.Функция VBA - 110 секунд, размер - в файле Excel.
2.xll созданная с помощью С# + Excel-DNA запуск через Application.Run - 19,3 сек., размер 543 КБ.
3.Библиотека dll написанная на С (Си) и задекларированная в VBA (Declare) - запуск просто в функции 11,69 сек. (лучший результат, т.к. работает напрямую минуя Application.Run), размер 84 КБ.
3. Собственно сам сабж - xll написанная на С (Си) через WINAPI (Thread-Safe) запуск через Application.Run -один поток - 18,16 сек., размер 84 КБ.

Усилия по созданию xll начинают казаться напрасными.

Переходим к работе напрямую с листом (через функции) копируем на 100 тыс. строк (Модуль TEST).
1.Функция VBA - 111,23 секунды, почти так же.
2.xll созданная с помощью С# + Excel-DNA 14,43 секунды - уже быстрее, все же это xll созданный именно для работы с листом.
3.Библиотека dll написанная на С (Си) и задекларированная в VBA (Declare) - 14,84 сек. (результат хуже, обертка Excel кушает)
3. Собственно сам сабж - xll написанная на С (Си) через WINAPI (Thread-Safe) - 8 потоков - 1,77!!! секунды (работа на 8 ядрах).

Думаю затраты времени того стоило, да и структура данных XLOPER(XLOPER12) - замечательна вещь!
Файл-тест выкладываю.
Вложения
Тип файла: rar TEST_RU.rar (597.1 Кб, 76 просмотров)
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
17.10.2017, 21:50  [ТС]
Поправлю: xll написанная на С (Си) через WINAPI (Thread-Safe), размер - 15 КБ.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
18.10.2017, 11:49  [ТС]
Для объективности:
Вариант "xll созданная с помощью С# + Excel-DNA" - многопоточный режим - [ExcelFunction(IsThreadSafe = true)]
Результат:
RELEASE 2-е тестирование
VBA
Excel_xll-AddIn64-packed.xll (C#+Excel-DNA) 17,75

Лист-функция
Excel_xll-AddIn64-packed.xll (C#+Excel-DNA) (Thread-Safe) -3,035156 - 8 потоков

Тест прилагаю.
Вложения
Тип файла: rar TEST_RU_2.rar (602.8 Кб, 51 просмотров)
0
2 / 2 / 0
Регистрация: 12.12.2014
Сообщений: 87
09.10.2018, 09:27
bedvit, можешь выложить исходники кода на C или скинуть в личку?
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
09.10.2018, 10:53  [ТС]
Thor, в течении года эта библиотека обрасла новым функционалом, если вы имеете представление о структуре XLOPER, и некоторых особенностях управлением памятью в xll, вам будет понятен следующий код на на простом примере, создание ассинхронной функции. Исходники на С++. Если вы только начинаете этот путь - начинать просвещаться здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2018, 10:53
Помогаю со студенческими работами здесь

Хочу создать цикл обучающего видео по Excel для своих сотрудников и хотел бы узнать ваши рекомендации по контенту
Ребята, коллеги, друзья, всем привет! Нужна ваша помощь. Хочу сделать крутые обучающие видео для сотрудников своей компании и думаю...

Длинная арифметика, длинное число (LongNum) для VBA - .DLL / .XLL
Друзья, всем привет! Для всех кто любит VBA, решил написать помощник в длинной арифметики. Это продолжение и наверное завершение моих...

Создать программу в Visual Basic для формулы y = 0,003x 99,43 для применения в Excel
Ребят, мне нужно создать программу в Visual Basic для формулы y = 0,003x + 99,43, чтобы я ее мог применить в Excel.Мог бы сразу подставить...

Создать макрос для Excel
Помогите создать макрос. Необходимо данные из ячейки в столбце 2 скопировать и подставить в ячейку в столбец 3, путем изменения...

Можно ли реализовать XLL модуль на .NET ?
Добрый день! Подскажите, пожалуйста: 1. Можно ли создавать XLL-модули расширения, например, для Excel без MS Excel XLL SDK (вроде...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru