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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Предыстория

Всем привет. В этой статье я хочу поделиться опытом написания кода на Visual Basic, созданного для решения рутинной задачки, связанной с парсингом Word-файла, последующей "бизнес-логикой" и выгрузкой результата в Excel. Скажу сразу: статья ориентирована больше на инженеров, работающих в производственных сферах и использующих Word/Excel, нежели чем на программистов.

Суть задачи

В общих словах, необходимо взять два Word-файла (старый и новый), выделить в каждом из них таблицы, удовлетворяющие определенному условию, далее вычленить из них столбцы № 3 (наименование) и 4 (номер ревизии). Затем нужно пробежаться по датасету нового файла и определить:

  • новые наименования (еще не было в старом Word-файле) - "new";

  • старые наименования, ревизия которых не изменилась - "not changed";

  • старые наименования (уже есть в старом Word), ревизия которых увеличилась строго на 1 - "changed";

  • старые наименования, ревизия которых НЕ увеличилась на 1 - "mistaked".

Задачка поступила от близкого мне человека, только-только вышедшего на новое место работы. Все его коллеги-инженеры проделывали эту работу руками через Ctrl+C и Ctrl+V. И, как самому молодому птенцу, поручили дерьмовую рутинную работу именно ему. Выходит, мне нужно было придумать что-то относительно простенькое, что поймет человек, программистом не являющийся, а также то, что пройдет бюрократический барьер отдела кибер-безопасности (по моему личному опыту работы в нефтегазовой сфере, в РФ с этим беда).

Надеюсь, что ты, уважаемый инженер-читатель, прочтешь описанные тут примеры и тебе все станет более или менее понятно.

Почему именно Visual Basic?

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:

  • Aspose.Words for python

  • python-docx

  • docxpy

С точки зрения необходимой функциональности и полноты документации выбор пал на 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) Вспомнив пары по информатике в своём инженерном ВУЗе и получив дополнительный совет от технического лидера своей команды, решил зайти со стороны Visual Basic. В целом, и искать ничего не пришлось, язык ведь именно для задач подобного рода и создан.
- DocumentFormat.OpenXml.Packaging и DocumentFormat.OpenXml.Wordprocessing для Word
- Microsoft.Office.Interop.Excel для Excel

Следует подчеркнуть, что справился со своей задачей на ура. Во-первых, абсолютно верно парсит содержимое Word-документа. Во-вторых, имеет интуитивно понятный синтаксис, если вы хорошо читаете по-английски, то код будет восприниматься как некоторый понятный текст/рассказ. В-третьих, решает проблему "отдела кибер-безопасности": опубликованное при помощи IDE приложение без антивирусных вопросов устанавливается на машину, но, если вам все равно попробуют вставить палки в колеса, не дав устанавливать на рабочий ПК "ничего такого стороннего", вы с легкостью можете применить Ctrl+C И Ctrl+V, чтобы перенести код в любой Word-файл, сохранённый в режиме поддержки макросов.

Код проекта-примера и описание, как его сделать

Уважаемые инженеры, постарался изложить все как можно понятнее, чтоб вы могли использовать данный материал для достижения своих целей автоматизации. Пример представляет собой оконное приложение с парой-тройкой кнопочек и простейшей логикой решения рассматриваемой задачи.

Пример простенького парсинга word-файлов и excel-я я выложил на своем GitHub. Там же и пример того, как это нативно сделать на python (вдруг вы из той команды инженеров, которые сами являются администраторами своих рабочих ПК). В репозиторий закинул документацию для кода, чтоб проще было ознакомиться с VisualBasic.

Итак, у вас есть весь шаблон, который вы можете насыщать собственной бизнес-логикой. Детальный разбор каждого метода именно с точки зрения кода, а также пара вводных по синтаксису, находятся здесь. Я постарался сделать краткую выжимку теории вкупе с практикой таким образом, чтобы вы, потратив на разбор один-два вечера, смогли применить полученные знания у себя на работе. Не ленитесь заглядывать на GitHub.

Выводы

Вывод напрашивается очевидный: я пытался "ударить огромной кувалдой по маленькому гвоздику", когда пробовал решить описанную задачу на C++. C# - менее тяжелый вариант, однако тянущий за собой сложности, разбираться в которых времени и желания у инженера, думаю, нет. Python, повторюсь, - самое то. Если вы на работе являетесь админом своего ПК, то однозначно он. Но если вам запрещают что-то устанавливать, то Visual Basic - прекрасное решение, ведь на крайний случай можно просто "скопипастить" код в docx-документ, сохраненный с макросами.

Пожелания

Это мой первый труд, опубликованный здесь. Коллеги-программисты, если у вас есть опыт решения подобных задач еще какими-либо простыми путями, пожалуйста, поделитесь (особенно интересен C++). Уважаемые инженеры, буду признателен за обратную связь, если описанный проект-пример понятен вам как человеку, который не пишет код ежедневно. Надеюсь, кому-то данный материал действительно принесет пользу в вопросах рабочей рутины.

Источник: https://habr.com/ru/articles/740346/


Интересные статьи

Интересные статьи

Для обывателя слово нейросеть, в контексте машинного обучения, стало настолько затасканным и общеприменимым, что исходный смысл явления стал теряться. В мышлении обывателя нейросеть сродни чёрной коро...
В прошлой статье мы увидели, как может возрасти скорость работы с портом, если обращаться к нему не через обычную, а через сильносвязанную шину. Причины кроются в латентности шины. В целом, у меня ест...
Как известно, файл Excel — это просто набор XML-файлов, определяемых форматом Office Open XML и упакованных в zip-архив, и потому для генерации нового файла помимо специализированных библиотек можно в...
Привет! Меня зовут Саша Коновалов, я разработчик в компании Oxonit и наставник на программе «Мидл фронтенд-разработчик» в Яндекс.Практикуме. На примере разработки расширения «Hello,...
Всем привет. В этой статье я хотел бы поделиться своим опытом настройки и использования pass — менеджера паролей для Linux и не только, примечательного своей простотой, использованием уже присутс...