Предыстория
Всем привет. В этой статье я хочу поделиться опытом написания кода на VBA.NET, созданного для решения рутинной задачки, связанной с парсингом Word-файла, последующей "бизнес-логикой" и выгрузкой результата в Excel. Скажу сразу: статья ориентирована больше на инженеров, работающих в производственных сферах и использующих Word/Excel, нежели чем на программистов.
Суть задачи
В общих словах, необходимо взять два Word-файла (старый и новый), выделить в каждом из них таблицы, удовлетворяющие определенному условию, далее вычленить из них столбцы № 3 (наименование) и 4 (номер ревизии). Затем нужно пробежаться по датасету нового файла и определить:
новые наименования (еще не было в старом Word-файле) - "new";
старые наименования, ревизия которых не изменилась - "not changed";
старые наименования (уже есть в старом Word), ревизия которых увеличилась строго на 1 - "changed";
старые наименования, ревизия которых НЕ увеличилась на 1 - "mistaked".
Задачка поступила от близкого мне человека, только-только вышедшего на новое место работы. Все его коллеги-инженеры проделывали эту работу руками через Ctrl+C и Ctrl+V. И, как самому молодому птенцу, поручили дерьмовую рутинную работу именно ему. Выходит, мне нужно было придумать что-то относительно простенькое, что поймет человек, программистом не являющийся, а также то, что пройдет бюрократический барьер отдела кибер-безопасности (по моему личному опыту работы в нефтегазовой сфере, в РФ с этим беда).
Надеюсь, что ты, уважаемый инженер-читатель, прочтешь описанные тут примеры и тебе все станет более или менее понятно.
Почему именно VBA.NET?
1) Дело в том, что я сам - программист C++. Соответственно, в первую очередь подумал написать простенькое приложение на Qt, используя какой-либо open source для чтения Word/Excel. Что удалось найти:
Microsoft Office C++ SDK: официальный SDK от Microsoft, который предоставляет API для работы с Microsoft Office из C++
Aspose Words: библиотека, которая предоставляет API для создания, чтения, редактирования и сохранения документов Word/Excel в C++
DucX: открытая библиотека для работы с XML-документами
Использование системных header-файлов ("windows.h ", "altbase.h", "atlcom.h", "cmutil.h") и компонентной библиотеки "msword.olb".
Первые два варианта показались мне неприемлемыми с точки зрения трудозатрат. Не было времени с ними разбираться, необходимо было добиться цели как можно быстрее и, что самое главное, более простым путем для инженера. Третий вариант оказался скудноват со стороны функциональности. Четвёртый вариант - пожалуй, лучшее решение, но есть большая заморочка с тем, чтобы сконвертировать "msword.olb" в привычный header-файл при помощи компилятора midl.exe (по идее он на все ОС Windows имеется). От идеи использования C++ я отказался.
2) Идем дальше. Какой из языков программирования имеет простой синтаксис и широко развитое сообщество? Python. Что удалось найти по работе с Word:
С точки зрения необходимой функциональности и полноты документации выбор пал на python-docx. Быстро написал программку. Основной барьер с таким решением - это необходимость установки интерпретатора python и библиотек на все рабочие ПК, где будет решаться описанная задача. Отдел кибер-безопасности не пропускает (в моей карьере это уже не первое предприятие нефтегазовой сферы, не дающее устанавливать ничего "такого стороннего"). Обход - завернуть все в *.exe при помощи pyinstaller, но тогда теряется скорость и exe-шник весит много. Согласен, аргументы так себе, поэтому идея использования python для решения задачки - это отличная мысль (если у вас нет никаких препятствий по его установке). Я же захотел идти по менее "костыльному" пути.
3) Идем дальше. Весь пакет Office - от Microsoft, C# - тоже от него. Более чем на 100% был уверен, что в шарпах есть нужный мне пакет, который я с легкостью смогу подтянуть. Так и оказалось:
Microsoft.Office.Interop.Word для работы с Word;
Microsoft.Office.Interop.Excel для работы с Excel;
Aspose.Words и Aspose.Cells как альтернатива.
К сожалению, написав программу на C# с использованием первых двух пакетов, я столкнулся с двумя проблемами:
- Microsoft.Office.Interop.Word/Excel не будет работать, если (предположительно) на вашем ПК стоит repack, но не лицензированный Office-набор, а также если версия вашего Word/Excel не соответствует версии пакета Microsoft.Office.Interop: ошибка "System.IO.FileNotFoundException HResult=0x80070002 Could not load file or assembly 'office, Version=15.0.0.0".
- На компьютере нет .NET (не спешите высмеивать меня за то, что я этого не знал, ибо всерьез предполагалось, что на всех современных машинах в совокупности ОС Windows идет и платформа .NET для заранее возможной автоматизации).
Альтернативное решение (Aspose.Words и Aspose.Cells) мне не помогло, по каким-то причинам пакет неверно подсчитывал число таблиц во входном документе.
4) Вспомнив пары по информатике в своём инженерном ВУЗе и получив дополнительный совет от технического лидера своей команды, решил зайти со стороны VBA.NET. В целом, и искать ничего не пришлось, язык ведь именно для задач подобного рода и создан.
- DocumentFormat.OpenXml.Packaging и DocumentFormat.OpenXml.Wordprocessing для Word
- Microsoft.Office.Interop.Excel для Excel
Следует подчеркнуть, что справился со своей задачей на ура. Во-первых, абсолютно верно парсит содержимое Word-документа. Во-вторых, имеет интуитивно понятный синтаксис, если вы хорошо читаете по-английски, то код будет восприниматься как некоторый понятный текст/рассказ. В-третьих, решает проблему "отдела кибер-безопасности": опубликованное при помощи IDE приложение без антивирусных вопросов устанавливается на машину, но, если вам все равно попробуют вставить палки в колеса, не дав устанавливать на рабочий ПК "ничего такого стороннего", вы с легкостью можете применить Ctrl+C И Ctrl+V, чтобы перенести код в любой Word-файл, сохранённый в режиме поддержки макросов.
Код проекта-примера и описание, как его сделать
Уважаемые инженеры, постарался изложить все как можно понятнее, чтоб вы могли использовать данный материал для достижения своих целей автоматизации. Пример представляет собой оконное приложение с парой-тройкой кнопочек и простейшей логикой решения рассматриваемой задачи.
Пример простенького парсинга word-файлов и excel-я я выложил на своем GitHub. Там же и пример того, как это нативно сделать на python (вдруг вы из той команды инженеров, которые сами являются администраторами своих рабочих ПК). В репозиторий закинул документацию для кода, чтоб проще было ознакомиться с Visual Basic.NET.
Итак, у вас есть весь шаблон, который вы можете насыщать собственной бизнес-логикой. Детальный разбор каждого метода именно с точки зрения кода, а также пара вводных по синтаксису, находятся здесь. Я постарался сделать краткую выжимку теории вкупе с практикой таким образом, чтобы вы, потратив на разбор один-два вечера, смогли применить полученные знания у себя на работе. Не ленитесь заглядывать на GitHub.
Выводы
Вывод напрашивается очевидный: я пытался "ударить огромной кувалдой по маленькому гвоздику", когда пробовал решить описанную задачу на C++. C# - менее тяжелый вариант, однако тянущий за собой сложности, разбираться в которых времени и желания у инженера, думаю, нет. Python, повторюсь, - самое то. Если вы на работе являетесь админом своего ПК, то однозначно он. Но если вам запрещают что-то устанавливать, то Visual Basic - прекрасное решение, ведь на крайний случай можно просто "скопипастить" код в docx-документ, сохраненный с макросами.
Пожелания
Это мой первый труд, опубликованный здесь. Коллеги-программисты, если у вас есть опыт решения подобных задач еще какими-либо простыми путями, пожалуйста, поделитесь (особенно интересен C++). Уважаемые инженеры, буду признателен за обратную связь, если описанный проект-пример понятен вам как человеку, который не пишет код ежедневно. Надеюсь, кому-то данный материал действительно принесет пользу в вопросах рабочей рутины.
Комментарии (48)
aborouhin
07.06.2023 08:50+3Простите, но как Ваш код на VB.NET решает описанные в тексте применительно к C# проблемы? Куда Вы его предлагаете пользователю "скопипастить в docx-документ", ведь в VBA используется классический VB, а не .NET? У Вас получилось ровно то же самое решение, что можно было бы сделать на C#, со всеми его недостатками, только с другим синтаксисом. А чтобы реализовать это же на VBA, код надо переписать под другую версию языка.
starfair
07.06.2023 08:50Сталкивался с подобной автора проблемой, но для автоматизации на CorelDraw. VB в целом более "толерантен" к изменениям API, нежели С#. Почему - не стал разбираться, ибо просто не было особой нужды. Но в целом - факт остаётся фактом, на VB (а тем более на VBA) "проще" что то написать и поддерживать, если требуется создавать некий прикладной код на зоопарк версий.
aborouhin
07.06.2023 08:50Конкретно в этом случае проблемы с совместимостью assemblies (если они есть) будут на уровне .NET, независимо от того, на C# или VB.NET написан код. Без необходимости тащить пользователям бинарник (EXE или надстройку) тоже не обойтись.
Объём работы, необходимой для переработки этого кода с VB.NET на VBA я не оценивал, но как минимум это не copy&paste.P.S. Да и несуществующий (увы) VBA.NET в тегах намекает, что автор немного запутался...
starfair
07.06.2023 08:50Может быть и так. Хотя, как я понял, скорее речь идёт о неких универсальных наборах интерфейсов для VB.NET, благодаря использованию которого можно отвязаться от использования для работы с документами непосредственно exe самого офиса. Тогда проблема уходит использования кода завязанного на assemblies, а значит и проблема с изменением API от версии к версии. Просто пишешь своё приложение, которое на VB пишется в общем то легче, по сравнению с кучей особенностей C#, и получаем для своих задач некую тулзу, работающую с общераспространнёным форматом офисных файлов.
aborouhin
07.06.2023 08:50+1Что C#, что VB.NET компилируется в .NET IL, на чём вся разница между ними исчезает. Так что выбор VB.NET может быть обусловлен тем, что он кому-то проще/привычнее, но не более.
А вот VBA - совсем другая история.starfair
07.06.2023 08:50Я не великий специалист по VB.Net, но насколько я помню этот вопрос, тут дело скорее в простоте работы с ActiveX в плане загрузки и манипуляций, так как там всё работает примерно так же как и в VBA. Поэтому, не так важно во что превращается код после компиляции. Важнее то, насколько просто начинать и поддерживать работу по автоматизации. В С# контроль за всей этой историей куда строже, и поэтому код там уже куда сильнее будет привязан к конкретным версиям используемых объектов и их интерфейсов, нежели в VB
aborouhin
07.06.2023 08:50Нет, Вы как раз пишете про классический VB (версий до 6 включительно), который работает с COM (ActiveX), и на базе которого построен VBA.
А VB.NET построен на платформе .NET и с внешними зависимостями работает ровно так же, как и любое приложение, написанное на любом другом .NET языке. Поэтому и итоговый бинарник будет точно так же привязан или не привязан (тут я предположения автора подтвердить или опровергнуть не могу, сам не сталкивался) к версиям, как если бы он был написан на C#.
starfair
07.06.2023 08:50Ну, может и так. Хотя, глянул сейчас вот немного порылся по этому поводу, и собственно отчасти соглашусь, отчасти всё равно сложилось впечатление,что VB.Net менее требователен в плане работы с кодом ActiveX компонентов. Хотя, опять же - спорить не буду. Может автор и правда использовал VB именно из-за очень большого сходства с привычным по MS Office и сравнительно простым VBA.
Okker Автор
07.06.2023 08:50Согласен, Вы правы. Подправил. Речь именно про VBA.NET
starfair
07.06.2023 08:50+1VBA.NET? Это что за зверь такой?
Okker Автор
07.06.2023 08:50https://ru.m.wikipedia.org/wiki/Visual_Basic_.NET
Вот этот)
Ведь по факту я писал программку с использованием именно его
starfair
07.06.2023 08:50+6А вы разницу между VBA (Visual Basic for Application),VB и VB.NET не пробовали выяснить, прежде чем писать VBA.NET?
Okker Автор
07.06.2023 08:50-1Смотрите, код VBA.NET помог мне избавиться от тех ошибок, которые выскакивали в момент использования C# и необходимых пакетов. Я согласен, что данную задачку можно и на C# легко осилить, но лично на моем ПК вылезли те ошибки, что я привел (у меня как раз crack).
По поводу сравнения VBA.NET/VBA: Вы думаете, что синтаксис будет и внешний облик кода отличаться кардинально?
aborouhin
07.06.2023 08:50+5Во-первых, никакого VBA.NET не существует (а очень жаль).
Во-вторых, синтаксис будет отличаться. Степень кардинальности не знаю, в каких попугаях измерить, конечно. Но это точно не уровень "скопировать код в документ". Можете последовать собственной рекомендации, скопировать Ваш код в VBA-редактор Office и посчитать количество ошибок :)
И прежде всего, отличается сам механизм взаимодействия с вшеними компонентами. В VB.NET Вы ссылаетесь на .NET Assemblies, в VBA - используете COM-компоненты. Скажем, Вы используете DocumentFormat.OpenXml. Есть ли аналог этого пакета для COM, который можно использовать в VBA? Не знаю, может и есть, но из установленного по умолчанию точно ничего не находится.
mayorovp
07.06.2023 08:50Смотрите, код VBA.NET помог мне избавиться от тех ошибок, которые выскакивали в момент использования C# и необходимых пакетов.
Вот вы использовали пакеты DocumentFormat.OpenXml.* в вашем "VBA.NET". Почему вы даже не попытались использовать их же в C#?
Или вот вы пишете что у вас заработал Microsoft.Office.Interop.Excel в вашем "VBA.NET". Но это абсолютно тот же самый Microsoft.Office.Interop.Excel что и в C#, который у вас, якобы, не работал.
Или вот упомянутая вами проблема с отсутствием .NET, который вы решили… как-то. Почему вы даже не пытались применить то же самое решение для C#?
Okker Автор
07.06.2023 08:50Во вторую очередь я написал программку именно на C#. Да, пакеты те же, все вы верно говорите)
Но почему выскакивает та ошибка, о которой я написал, я не знаю) Она максимально неприятная, а желания с ней разбираться нет
webhamster
07.06.2023 08:50Как Vsiual Basic отлично помогает решать инженерные задачи
Возможно не все в курсе, но... Visual Basic - самый страшный язык программирования по мнению пользователей Stackoverflow
LuchS-lynx
07.06.2023 08:50Ну не знаю, как по мне язык и язык, что-то в нем удачного есть, что-то устаревшего, что-то не очень удачного. Он вполне решает проблемы для офисного ПО, но в то же время он не оптимизирован на многопоточность (VB6.0 это конец 90х, когда о многопроцессорности/многоядерности можно было только мечтать, хотя материнские платы на 2 сокета уже тогда были, а вот HT еще нет)
DMGarikk
07.06.2023 08:50Visual Basic — самый страшный язык программирования по мнению пользователей Stackoverflow
было бы забавно послушать аргументы
VB (который 6.0) вполне себе рядовой язык по нынешним меркам, я бы даже рискнул его с питоном сравнить по отношению к типизации и по наличию основ ООП, что в нем такого "страшного", опятьже, опираясь на день сегодняшний, мне сложно придуматькогда я еще в школе учился, в огромный недостаток и минус ему приписывали возможность (причем отключаемую) динамической типизации
LuchS-lynx
07.06.2023 08:50+1Сейчас потихоньку заставляют переходить на иностранное ПО, судя по всему тут или перспектива макросы писать на StarBasic, т.к. LibreOffice идет почти в каждом линуксе из коробки, или есть еще из реестра одинаковый с лица AlterOffice. Либо переходить на python, но с ним много подводных камней в корпоративной среде, хотя бы потому что его надо ставить...
Другие российские офисы не позволяют работать макросом с диском, т.е. открыть/записать файл, МойОфис отличился с LUA, макросом нельзя даже получить системное время и дату. Чуть получше с JS у Р7, но по факту все так же ни кнопку создать и макрос к ней привязать, ни файл открыть/записать/закрыть на диске.
Правда есть еще одна тенденция, т.к. большинство офисных файлов это типовые акты/бумаги, которые постепенно переводят в открытый проприетарный формат XML, то может все это офисное ПО лет через 10 станет анахронизмом?starfair
07.06.2023 08:50Хм, а что разве в поставке Lua "МойОфис" отключили os.date() os.time()?
Согласен, выбор Lua для автоматизации спорен, но имеет и собственно большой плюс в том, что очень многое можно расширить за счёт загружаемых налету модулей, в том числе и бинарных. Так что, в теории можно даже своё GUI припилить, вместо убогого родного. Конечно внутренний API по работе с документами там довольно убогий, на фоне MS Office, но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.LuchS-lynx
07.06.2023 08:50Хм, а что разве в поставке Lua "МойОфис" отключили os.date() os.time()?
проблема в том, что os.time() здесь не работает, а при использовании DocumentAPI.DateTime из инструкции макрос выдает ошибку: либо nil, либо пусто, если прописать его в переменную с конвертацией типа в текст.
Так что, в теории можно даже своё GUI припилить, вместо убогого родного. Конечно внутренний API по работе с документами там довольно убогий, на фоне MS Office, но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.
Я в прошлом году тестировал несколько офисов на скорость чтения/записи в ячейку и работоспособность кое-каких решений... В общем МойОфис был самым медленным, они, с тех пор, допилили код, но все никак не дойдут руки посмотреть как и что там поменялось
https://habr.com/ru/articles/674580/но для 99% офисных работ по тексту и таблицам вполне должно хватить, если не брать что то очень извращённое.
Мне как раз нужно изощренное - передавать данные из одного файла в другие в пакетном режиме
starfair
07.06.2023 08:50проблема в том, что os.time() здесь не работает, а при использовании DocumentAPI.DateTime из инструкции макрос выдает ошибку: либо nil, либо пусто, если прописать его в переменную с конвертацией типа в текст.
Специально полез и проверил. Вполне себе работает.
begin_pos:insertText("Текст в начале строки") begin_pos:insertText("Второй параграф") begin_pos:insertText("Дата и время создания" .. os.date())
Выводит такое вот в документ:
Про os.time() - так оно выводит в мс от даты 01.01.1970 00:00 и требует пересчёта (формула довольно большая, но вполне себе общедоступная). Чтобы получить время в общепринятом смысле, надо задавать формат вывода в os.date("%H:%M") Подробнее можно в руководстве глянуть
Что касается DocumentAPI.DateTime - так это просто формат данных, который используется внутри специального сервиса отслеживания изменений документа, и как я понял, отдельно его использовать не удастсяЯ в прошлом году тестировал несколько офисов на скорость чтения/записи в ячейку и работоспособность кое-каких решений... В общем МойОфис был самым медленным, они, с тех пор, допилили код, но все никак не дойдут руки посмотреть как и что там поменялось
Ну, тут спорить не буду. Почитал вашу статью. Я ещё так глубоко в работы именно с таблицами в МойОфис не зализал, но сдаётся мне, вы просто не настолько глубоко углубились в тему Lua, поэтому и может быть, использовали автоматизацию не совсем так, как предусматривали это разработчики. Хотя да - там всё сложно, и похоже что автоматизация там сделана для "галочки" и толком его развитием никто не занимается. API крайне слабое и неполное. Описание тоже мягко говоря оставляет желать лучшего.
Мне как раз нужно изощренное - передавать данные из одного файла в другие в пакетном режиме
Так вроде особых проблем нет, хотя конечно не знаю что вы конкретно имеете ввиду. Средствами офиса через API и читать, и создавать и сохранять файлы (правда, это в основном только в формате самого МойОФис)
LuchS-lynx
07.06.2023 08:50+2Ответ службы поддержки год назад
Так вроде особых проблем нет, хотя конечно не знаю что вы конкретно имеете ввиду.
На VBA я передаю данные из ячеек в основном файле в файлы шаблоны, для Word формата через закладки, для Excel через метки в тексте, который парсится перебором (да может не самый оптимальный вариант с т.з. быстродействия, зато наглядный для человека который этим пользуется) Соответственно мне нужно то же сделать и здесь - привязать ячейки таблицы к меткам в шаблонных файлов что бы затем эти данные запихнуть в файлы по число строк/столбцов подготовленной таблицы данных. Об этом я писал ранее на Хабре
https://habr.com/ru/articles/344956/https://habr.com/ru/articles/359218/
Вот так это выглядит на практике, то что хочу переписать
starfair
07.06.2023 08:50А! Ясно!
Я макросы вообще не рассматриваю как средство автоматизации! Я пробую из надстроек. Так всё работает. Макросы это вообще изврат в исполнении разработчиков, так как их нельзя в тех же таблицах вызвать по имени в формулах тех же таблиц. Нельзя привязать к какому нибудь контролу в документе (их в тексте документа опять же просто нет). А работа вручную - такое себе удовольствие! На моё недоумение, мне в службе поддержки сказали что такого в планах нет.На VBA я передаю данные из ячеек в основном файле в файлы шаблоны, для Word формата через закладки, для Excel через метки в тексте, который парсится перебором (да может не самый оптимальный вариант с т.з. быстродействия, зато наглядный для человека который этим пользуется) Соответственно мне нужно то же сделать и здесь - привязать ячейки таблицы к меткам в шаблонных файлов что бы затем эти данные запихнуть в файлы по число строк/столбцов подготовленной таблицы данных. Об этом я писал ранее на Хабре
Скажу честно - пробежался вкратце, но я как раз занимался недавно схожими задачами. Правда, более касаемо в разрезе просто внутренней документации проектной организации. Пилилось схожее на специализированом отечественном ПО под названием "Lotsia". В плане программирования чего либо в нём - сущий ад и "мойофис" во многом может показаться ещё и ничего. Но в плане как раз схожих задач по генерированию чего то схожего с описанным - там есть довольно много уже автоматизированного. Но рекомендовать не буду, ибо реализация проектной СЭД там отвратная, как по мне. И я смотрю, что никто так толком ничем у нас в стране заниматься особо не спешит, ибо при отсутствии альтернатив, "программисткие ёжики будут плакать, ругаться, но всё равно лезть на кактус". То есть или пользоваться с матами то чем дали, или изобретать велосипеды каждый на своём рабочем месте.
LuchS-lynx
07.06.2023 08:50+1Я пробую из надстроек. Так всё работает. Макросы это вообще изврат в исполнении разработчиков, так как их нельзя в тех же таблицах вызвать по имени в формулах тех же таблиц.
Почему нельзя? Можно, только объявляешь не declare sub, а declare function, при этом функция может что-то возвращать, а может и нет, тут как сам код пропишешь/настроишь.
Нельзя привязать к какому нибудь контролу в документе (их в тексте документа опять же просто нет)
Почему? Вставляем кнопку на лист/документ и вперед, если сильно заморочиться, то можно даже в контекстное меню засунуть в офисе или в ленточный интерфейс, который будет работать только при открытии определенного файла, я сейчас не про написание надстроек, хотя там частично пересекается тема. Еще можно замоделировать всплывающее окно с любым интерфейсом на базе стандартных форм. В общем есть множество инструментов и вариантов запуска макроса и оптимизации юзабилити его использования.
"программисткие ёжики будут плакать, ругаться, но всё равно лезть на кактус". То есть или пользоваться с матами то чем дали, или изобретать велосипеды каждый на своём рабочем месте.
Собственно это та задача которая должна решаться макросами, а в современных российских офисах с этим все печально. Либо пишется ПО которое подменяет, в узкоспециализированном секторе задач, офисное ПО... а дальше.. система же не может остановиться, она или развивается или деградирует. Поэтому, как по мне, именно такая автоматизация рутины нам и нужна, без фанатизма.
starfair
07.06.2023 08:50Ещё раз, чтобы не было недопонимания - я вам написал про МойОфис и ваши старания в нем, а не про MS Office/
LuchS-lynx
07.06.2023 08:50+1Тогда прошу пардону. по МойОфис у меня у самого, как я писал выше, много вопросов на которых нет ответа, из-за чего его не могу рассматривать как альтернативу для себя и своей команды в разработке ПО в рамках малой автоматизации оформления документации в стр-ве. Увы, LibreOffice тут безусловно выглядит более предпочтительным вариантом, хотя тоже не идеальным
Okker Автор
07.06.2023 08:50Абсолютно согласен, что с python есть великая проблема потому, что его надо ставить. Лично постоянно встречался с таким в инженерной сфере
LuchS-lynx
07.06.2023 08:50Тут уж не так много вариантов, хотя под Линуксом можно попробовать упаковать в Appimage, да и под Винду вроде есть варианты откомпилировать в портативные сборки
schebotar
07.06.2023 08:50Я подобную рутинную задачу решил написав надстройку для Excel с помощью библиотеки Excel-DNA. У меня входные данные только Excel файлы правда, но парсер можно и вордовских написать, без проблем. Так реализовал экспорт спецификации в девятиграфку в dwt например. Тут же импорт другой будет.
Код на VB ваш в Excel-DNA тоже можно адаптировать. .NET же.NET кстати на машине целевой возможно и есть, но рантайма нужной версии нет.
Okker Автор
07.06.2023 08:50Надстройку написали на VBA.NET?
Есть ли что-то такое (для прасинга Word/Excel), но на плюсах?
schebotar
07.06.2023 08:50Писал на C#
Вам немного разобраться нужно что такое .NET платформа.
Она поддерживает и VB, и например F#. На сайте той же библиотеки что я упомянул есть примеры и на этих языках. Они потом все в MSIL компилируются.
DikSoft
07.06.2023 08:50+2Забавно. Тоже надо было повозиться с чужими большими таблицами, а вспоминать VBA было лень. Ну и из Powershell вылезать тоже лень.
$xl = New-Object -COM "Excel.Application" $xl.Visible = $true $wb = $xl.Workbooks.Open($InputFile) #select first sheet $ws = $wb.Sheets.Item(1) ... $objRange = $ws1.UsedRange $xlCellTypeLastCell = 11 $objLastcell = $objRange.SpecialCells($xlCellTypeLastCell) $lastrow = $objLastcell.row $lastcolumn = $objLastcell.column
В общем, оказалось, что почти всё можно ненапряжно делать из любимого PowerShell - тут хороший набор подсказок.
Surrogate
07.06.2023 08:50- тут хороший набор подсказок.
К сожалению в вашем комментарии ссылка не рабочая! Не могли бы вы продублировать ?
DikSoft
07.06.2023 08:50+1Похоже что-то в движке Хабра сломалось. Вчера ссылка работала:
https://www.myfaqbase.com/q0001773-Scripting-Powershell-5-0-Working-with-Microsoft-Office-Excel-part-1.html
GreedyHamster
07.06.2023 08:50Писать приложение на VB.NET для системы, где dotNET отсутствует... Сильно... Для WinXP? Т.к. начиная с Висты dotNET ставится с ОС по умолчанию.
Не проще ли написать надстройку на VBA, к-рая не создаст никаких проблем на ограниченном аккаунте?
Okker Автор
07.06.2023 08:50Вы уверены, что платформа идет с ОС по умолчанию? На целевом рабочем ПК возникала ошибка «отсутствия .NET», пока я не «опубликовал» решение и не получил setup.exe
Если .NET отсутствует, разве не завернет setup.exe при установке приложения на целевой ПК необходимые компоненты?
С точки зрения ограниченности аккаунта, такое может быть проще. Но в моем случае проблем с установкой не оказалось (именно скомпилированной проги)
Dimsml
07.06.2023 08:50Вы уверены, что платформа идет с ОС по умолчанию?
Посмотрите в папке, C:\Windows\Microsoft.NET\Framework64\*version* , там должен быть файлик csc.exe, наведите на него мышкой и посмотрите что за подсказка всплывает.
По идее, с новыми версиям Windows должна по умолчанию идти какая-то версия .NET FW. Вот тут галка рядом с версией - должно быть установлено по умолчанию как компонент системы.
aborouhin
07.06.2023 08:50У Вас сборка под .NET Framework 4.7.2, который идёт в комплекте с Win 10 v. 1803 и выше.
itGuevara
Есть и другие причины использования VBA. В корпоративной среде (чем крупнее компания - тем запретнее) пользователям запрещено ставить ПО разработки, а сами ИТ не хотят что-то автоматизировать и тогда бизнес-пользователю с навыком программирования (или без, но с желанием) приходится использовать лишь то, что есть на его рабочем месте (инструменты разработки).
Поэтому, чтобы самому себе помочь (даже не по инженерным задачам) приходится использовать то, что есть на каждом ПК: VBA, JS (браузерный), bat. Подобную проблему \ решение читал и в западных историях.
Surrogate
Самое главное достоинство VBA - низкий порог вхождения!
Включил макрорекордер на запись
Сделал что нужно используя пользовательский интерфейс
Остановил запись
Допилил напильником код для повторного использования
PROFIT…
Akina
Пункт 4 как раз требует достаточно приличных знаний. Ибо макрорекордер ну просто хлебом не корми - дай на Selection опереться. И именно по этой причине сплошь и рядом записанный макрос то работает как надо, а то такого наворотит, что всемером не разгрести. А всего-то юзер случайно мышкой кликнул...
Surrogate
Понятное дело, что прям сразу на пользователя не свалится готовое решение в виде кода)
Выпускники технических ВУЗов и даже тетушки из бухгалтерии вполне в состоянии с этим разобраться...
Еще из плюсов VBA, что пользователю можно пользоваться системными константами (Enumerations), того приложения под которое пишется код.
qyix7z