Как стать автором
Обновить

Как Visual Basic.NET отлично помогает решать инженерные задачи, связанные с Word и Excel

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров5.4K

Предыстория

Всем привет. В этой статье я хочу поделиться опытом написания кода на 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% был уверен, что в шарпах есть нужный мне пакет, который я с легкостью смогу подтянуть. Так и оказалось:

К сожалению, написав программу на 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++). Уважаемые инженеры, буду признателен за обратную связь, если описанный проект-пример понятен вам как человеку, который не пишет код ежедневно. Надеюсь, кому-то данный материал действительно принесет пользу в вопросах рабочей рутины.

Теги:
Хабы:
Всего голосов 2: ↑1 и ↓1+1
Комментарии50

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань