![]() |
как внести коррективы в .xls файл используя .BAT
Вложений: 1
День добрый Уважаемые знатоки, всеми нами любимого, супер-форума OSZone!
Уважаемый "Боженька кодеров" megaloman, ну и конечно же Iska, дорогие... Излагаю суть: 1) Необходимо внести коррективы в .xls-файл по средствам .BAT, .CMD либо .VBS. Лучше наверное будет .VBS, потому как на BAT-ники многие антивирусы попросту ругаются. А там, конечно же, на ваше усмотрение, Уважаемые. Почему коррективы? Потому, как столбцы в .xls изначально размечены по ширине и присутствует некая шапка-заголовок. Информация заносится "в строку", в каждую ячейку, (слева на право :D), как в текстовом, так и в числовом виде (зависит от типа столбца). Для примера: (№3|Вася Пупкин|Мужчина|КрасаУчиГ|28|ЖиЕсть); или: (12|текст|текст|текст|56|текст), в общем, что-то вроде того. 2) Возможно ли выполнить проверку на "пустоту строки"? Т.е. строки №1,№2,№3 уже заполнены Васей, Федей и Толиком, а нужна запись в №4 - как следствие. Или, другими словами, "запись в близжайшую свободную строку", что в конкретной задаче необходимо для последовательности: #1 #2 #3 ... 3) Есть ли возможность привязать вдовесок какую-нибудь формулу, например "произведение чисел" или ячеек? P.S. Возможно я всё усложняю и "пункт 2)" можно реализовать как-то иначе. Например несколько BAT-ников(если на .BAT всё же пал выбор) вносят коррективы в один ОСНОВНОЙ (пополня список Вась, Петь и т.д.), а тот уже одним махом внесёт все данные в .xls Т.е. BAT1(№1), BAT2(№2), BAT(...) to>>> .BAT(основной) (№1|текст|число|текст|) (№2|текст|число|текст|) to>>> .xls Мне кажется, что так даже будет лучше. Но вот незадача! Снова проверка ближайших свободных "пустых строк" :( |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Ka3hak, если файл будет перекодирован в xlsx, то Powershell в модулем ImportExcel без проблем работает с такими файлами.
Работать с xls - это крайне неудобно и медленно. |
Цитата:
|
Цитата:
Цитата:
Или Вы в силах помочь мне каким-то другим способом? Цитата:
|
Iska, ну а как с ним работать? Только через COM-объект Экселя?
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Ну я это и называю "неудобно". Лучше сначала
Код:
"C:\Program Files (x86)\Microsoft Office\Office12\excelcnv.exe" -oice "C:\scripts\test1.xls" "C:\scripts\test1.xlsx" |
Вложений: 1
Iska, прикрепил файл к теме.
Скрипт производит запись в строки с 12-ой по 24-ую (выделенные кроваво-красным цветом), а точнее - любую ближайшую, свободную, в данном случае 12-ую, нО_о...! Вот не задача! :( Ведь "столбец B" и "столбец А" занимают аж 3 строки! И если скрипт произвёл запись в строку 12, то следующая ближайшая (для повторной отработки скрипта) аж 15-ая! Не окажется ли это непреодолимой преградой в реализации поставленной задачи? Далее... Между строк ;)
"Строку 19" наверное нужно игнорировать, даже не знаю. Т.к. это некое оглавление определённого типа работ, именуемого например "Укладка", но это уже "вопрос десятый", опустим.
В "столбце F"(который зелёненький), с 7-ой строки и до бесконечности происходит произведение "столбцов H на I". По-большому счёту, это основная формула для этого столбца. Цитата:
Между прочим
P.S. Все (или почти) BAT-ники из этой темы: http://forum.oszone.net/thread-327297.html ловко сожрал Dr.Web CureIt, а Касперовский визжал как свинья. Хорошо хоть в архивах исходники не тронул.
Не помог даже некий "Bat To Exe Converter", чтобы скрыть содержание файла. А хотяяя! Может в нём-то и была проблема, уже не помню... Но интереса ради - обязательно проверю и залью скриншоты Log-а ;) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Ka3hak, попробуйте теперь внятно сформулировать техзадание. |
Цитата:
Под словом "производит" - я подразумеваю "должен". Это своего рода конкретизация поставленной задачи. В строку 12. Если ячейка столбца данной строки не пустая, то в 13. Если и та содержит информацию, то в 14. ЗАПИСЬ аналогичную специально представленными выше примерами(в .xls файле). |
В нынешнем виде таблица непригодна для автоматизации, во всяком случае, эта автоматизация будет крайне трудоёмкая.
1) Для нормальной автоматизации нужно избавиться от объединённых ячеек, продублировав данные. Тогда можно получить такой вывод
№ п/п : 1 Наименование работы : Устройство армированных стяжек толщ 20мм Материал : раствор или бетон Ед. изм : м3 Норма на ед. изм. : 6,5 Нормативный документ : Устройство монолитных ж/б и бетонных конструкций "это" : 1,3 умножить на "это" : 5 № п/п : 1 Наименование работы : Устройство армированных стяжек толщ 20мм Материал : сетка сварная Ед. изм : м2 Норма на ед. изм. : 7,6464 Нормативный документ : Устройство монолитных ж/б и бетонных конструкций "это" : 1,08 умножить на "это" : 7,08 № п/п : 2 Наименование работы : Устройство стяжек армированных полипропиленовой фиброй Материал : цемент Ед. изм : кг Норма на ед. изм. : 15120 Нормативный документ : Устройство монолитных ж/б и бетонных конструкций "это" : 280 умножить на "это" : 54 № п/п : 2 Наименование работы : Устройство стяжек армированных полипропиленовой фиброй Материал : песок Ед. изм : м3 Норма на ед. изм. : 2,3 Нормативный документ : Устройство монолитных ж/б и бетонных конструкций "это" : 1,15 умножить на "это" : 2 № п/п : 2 Наименование работы : Устройство стяжек армированных полипропиленовой фиброй Материал : фибра Ед. изм : кг Норма на ед. изм. : 0,63 Нормативный документ : Устройство монолитных ж/б и бетонных конструкций "это" : 0,7 умножить на "это" : 0,9 Потом с этими данными уже можно работать, добавлять строки и т. д. 2) Ячейки с числами сделать реально числовыми. Сейчас, если импортировать из экселя данные, то умножить числа не получается, для этого надо объяснить компьютеру, что это действительно числа Код:
[double]$1 = $_.'"это"' -replace ',','.' |
DJ Mogarych, спасибо Вам большое за то, что откликнулись!
Цитата:
Но вот что касается остального - возникают вопросы. Цитата:
|
DJ Mogarych, дело в том, что на текущий момент, в .VBS я нулевой. Но спешу заверить, что быстро учусь :)
Могу ли я предложить поставить задачу ещё проще и попросить кусочек полного кода, чтобы было от чего отталкиваться? Мне важны только 3 ключевых момента. 1) Внедрение формулы в одну из ячеек строки, а лучше - на весь столбец. Потому как на основе одного (рабочего) скрипта, поочерёдно будут вноситься разные данные. Но и хрен бы с этим "пунктом первым". Он просто блекнет на фоне пункта №2, ведь формулу произведения чисел можно изначально забить и ручками. 2) Очерёдности записи в ближайшую, верхнюю, свободную строку. С учётом дублирования, как вы подсказали - буду также колдовать. 3) Внесённые данные должны различаться по типу: текстовый - числовой, хотя и это, как я понимаю, тоже можно исполнить вручную. И вдовесок ещё вопросик, пожалуйста... Я никак не смогу управлять размером ячейки по средствам .VBS? |
Нет, это Powershell. Также, необходимо установить модуль Import-Excel: https://www.powershellgallery.com/packages/ImportExcel
Полный код: Код:
# Конвертация xls в xlsx 1) Формулы там вроде бы есть, см. справку по модулю. 2) Можно внести ещё один столбец просто с порядковыми номерами и отталкиваться от них, или сделать № п/п последовательными, если я правильно понял ваш вопрос. 3) Если данные будут вноситься скриптом, то при экспорте готового файла с данными будет всё в порядке. Вопрос в исходном файле. Управлять размером ячейки при экспорте можно. Я обычно пользуюсь параметром -AutoSize. |
Избавляться надо от Excel, потому как в примере — типичная картина для базы данных с тремя таблицами: Нормативные документы, Наименование работы, Материалы и связями между ними один-ко-многим. Посему — MS Access, 1С или любую другую не плоскую СУБД.
|
Цитата:
Цитата:
И, опять же, не проще ли это сделать макросом в таблице, а не внешним скриптом? |
megaloman, доброго времени суток!
Цитата:
с удобным, понятным интерфейсом и как следствие - минимумом манипуляций для пользователя. Цитата:
подразумевается некая связка визуального GUI-интерфейса и исполняемых файлов в виде скриптов. - В GUI оболочке есть выпадающий список с наименованием производимых работ на выбор. - Выбираем необходимый пункт (тип производимых работ) и он уже ссылается на заведомо определённые скриптом значения. - Далее - кнопка "apply" и уже тут отработывает скрипт, который заносит необходимую информацию в .xls файл. Если быть несколько точнее, то условно: when press "apply"\ if change "наименование работ №1"\ then run "script1"\ else if... и т.д. и т.п. Цитата:
|
Цитата:
Зачем вообще всё это? Почему не использовать просто Excel, а не дублировать его интерфейс непонятными костылями? |
Ka3hak, Не понимаю задачи.
Цитата:
Цитата:
То есть, работать надо в направлении организации процесса на базе полноценного ПО (Excel), либо Цитата:
|
DJ Mogarych, спасибо Вам большое за вариант. Беру его на рассмотрение, в обязательном порядке.
Смущает только # Конвертация xls в xlsx. Дело в том, что разбор полётов происходит с файлом старого образца, Office 2003 Цитата:
Цитата:
Цитата:
|
Господиии! Да как же всё сложно-то, а :(
Я понимаю, что задача из разряда - вырывание зуба через анальное отверстие. И было бы это просто - я бы к вам за помощью не обращался. По-крайней мере, здесь я выяснил, что реализация задуманного невозможна по средствам BAT/CMD. А может VBS здесь тоже не поможет? Тогда скажите об этом прямо. GUI+исполняемые скрипты - как вариант работы извне. Ну вот нету у меня Excel-я, к примеру... Соответственно нет макросов. Да вообще ничего нет! Что делать...? Если я перефразирую задачу вплоть до самого минимума, это что-то изменит? Могу даже ещё один файл залить, для примера и точности описания текущей задачи. Хотя подойдёт и пустой. Пример. Текущий файл имеет вид: (строка:№1)\1(A1-числовая ячейка)\огонь(B1-текстовая ячейка)\45(С1-числовая ячейка) (строка:№2)\2(A2-числовая ячейка)\вода(B2-текстовая ячейка)\86(С2-числовая ячейка) ... Вопрос. VBS скрипт вносит строку: (строка:№3)\3(A3-числовая ячейка)\медные трубы(B3-текстовая ячейка)\94(С3-числовая ячейка); т.к. строки:№1-2 заняты. Если отсутствует (строка:№2\"вода"), то вносимая строка (строка:№3\"медные трубы") прописывается вместо неё, под №2. Если отсутствуют обе (№1,2), то под №1/ Могу поставит вопрос ещё проще. Мне даже нумерация не нужна, дело не в этом! Просто нужно избежать перезаписывания строк. Вопрос. Как, с помощью VBS записать текстовую и числовую информацию в ячейки A2(текстовая) и B2(числовая) - (строки:№2)(соответственно), если (строка:№1) уже занята? |
Ka3hak, мне кажется вы еще не рассматриваете Хабр Фриланс - и мне не ясно почему ?
опишите задачу и вам ее сделают - а как тема для форума ваша задача черезчур узко специальна ну кому может потребоваться заливать воду с огнем через медные трубы прописью в новую ячейку ? |
Serguei Kouzmine, а мне почему-то кажется, что вы очень глубоко и сильно прониклись сутью поставленной задачи. Спасибо Вам.
Цитата:
|
Цитата:
1. Текстовый файл откуда данные берём. 2. Excel-Таблицу с 1-2 строкой, после которых эти данные вставляем. Пустых строк между строками с данными быть не может? Это одна строка, или надо вставить за раз кучу строк? Вы не боитесь, что умелые ручки запустят скрипт сто раз и вставят одни и те же строки многократно? Соответственно, надо говорить об организации процесса: где-то в папке должен быть импортируемый файл с данными. Куда-то после импорта он должен перемещаться. Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Скрипт также должен соблюсти условие "неперезаписывания". Чтобы свериться - можно запустить его парочку раз и увидеть результат. А уже после, для каждого типа "производимых работ"(это раздел таблицы) я буду корректировать этот скрипт по-своему. Цитата:
Цитата:
К слову
P.S. Кстати! А ведь Вы навели меня на мысль! Что если собрать .txt, .ini, либо .cfg-файл по средствам того же .BAT, а после - разом занести всю информацию с помощью .VBS?
Может так даже лучше будет, как считаете? Или, это наоборот, в разы усложнит задачу? |
Можно поднять MySQL и использовать Excel как интерфейс к базе, и то лучше будет.
https://youtu.be/E_kn71R9BL0 |
Вложений: 1
Цитата:
DJ Mogarych, да, ну опять же... Это плагин расширяющий функционал? В любом случае он требует времени на освоение и, как следствие, работу в самом Excel. Если бы это было нужно мне, как пользователю, я бы несомненно автоматизировал под себя многие действия. Но увы... Задача другая :( В любом случае СПАСИБО. Я обязательно рассмотрю предложенный Вами вариант. |
Цитата:
|
Вложений: 1
Ka3hak,
Изменил последний вариант Вашей таблицы, придумал немного другой файл с данными.
Смысл этого извращения мне до сих пор непонятен Это скрипт
Код:
FileIn = "Z:\Soft_In\Мой Пример.cfg" Это файл с данными
Код:
#Для тех, кто в танке;куб. градусы Это пример того, что сделать можно что угодно, но не думаю, что практически он полезен - мутная постановка с непонятным смыслом. Если захотите изменить таблицу, в скрипте есть настройки сверху на уровне входных данных (с комментариями). |
megaloman, ну я даже не знаю что сказать.. ЧЕЛОВЕЧИЩЕ! Всё Великолепно работает!
Могу ли я пока не закрывать тему, на случай вдруг ещё вопросик-другой назреет? Кстати! Я ничего подобного на форуме не видел, может создать тему заново, в другой категории, поставив вопрос иначе? Например: VBS/WSH/JS - как внести данные в .xls файл используя .VBS? Ну, дабы облегчить поиски нуждающимся. А то выходит и вопрос в шапке поставлен иначе, и вариант исполнения другими методами. |
Ka3hak, я вовсе не тонкий знаток правил портала. Знаю, что если пометите тему решенной, это позволит и в дальнейшем создавать там сообщения, относящиеся к этой теме.
|
Вложений: 1
megaloman, всё Великолепно отрабатывает, повторюсь (готов повторять это вечно). Собственно о доп.вопросиках... :)
Я прилагаю архив со скриптами и .cfg файлами, которые как производят записи индивидуально, так и один, "Общий". Вопрос: Как мне реализовать строку типа:№6(Стяжка) после каждого успешного внесения данных из "Общий"? Подразумевается выравнивание по левому краю (если возможно), полужирный текст, параметр "Объединить и поместить в центре", и, желательно (если возможно), соответствующий цвет заливки. СтрОки столбца "A" можно причесть туда же, не принципиально. Иными словами - задать вышеуказанные значения для всей строки, полностью. Осмелюсь только догадываться, что есть возможность дополнить скрипт, а сами параметры прописать в файле "Общий.cfg", не так ли? Пример желаемого результата в строке 19 файла "Образец.xls". |
Нагуглил вот такой вариант:
XLApp.ActiveWorkbook.ActiveSheet.Range("A28:F30").Merge(True); Теперь понять бы как это работает и куда его приткнуть, чтобы было грамотно :\ |
Вложений: 1
Существенно доработал.
Код:
^ПОЛЫ Код:
FileIn = "Z:\Soft_In\Мой Пример New.cfg" |
Вложений: 1
Цитата:
(но, как всегда, что в моём репертуаре - придумайте мне велосипед и научите ездить...) Конечно понимаю, что "в край оборзел" и крайне не удобно спрашивать у Вас что-либо ещё, но: - Зачем в скрипте задаётся формула для столбца "A"? В рабочем .xls, согласно стандарту оформления, происходит нумерация "производимых работ" столбца "B" - от 1 и до max кол-ва (для каждого пункта каждого из разделов). //пример приложил (выделено жёлтеньким) Можно ли такое как-нибудь исполнить? Если это слишком трудоёмко - может и вовсе не производить запись данных в этот столбец? Значит будет делаться ручками. - Ещё момент с ячейками столбца "G"... Они объединены в каждом разделе и носят имя "Устройство монолитных ж/б и бетонных конструкций". Так тоже можно сделать? //пример приложил (выделено жёлтеньким) P.S. Опять же отсылка на трудоёмкость. Возможно это не стоит Ваших усилий и тогда уж "хрен с ним", пусть остаётся так. - Не особо понял момент "запуск скрипта с с аргументами". Подразумевается указание параметров запуска, или как? Если я не указываю аргумент, то скрипт не отрабатывает :( Может тогда ну их, эти танцы? Ведь (повторюсь) пользователь не будет напрямую взаимодействовать со скриптами, а только с визуальным интерфейсом, так что скрипты вполне могут находиться в постоянной боеготовности. |
Цитата:
Код:
Цитата:
Если в тексте скрипта указаны реальные пути файлов, то при отсутствии аргументов при запуске, возьмутся указанные файлы. Если указаны аргумент(ы) (сначала cfg затем xls) - то возьмется то, что в аргументе Остальные идеи пока не осознал. |
Цитата:
Цитата:
- Тогда самый главный момент. Какие процедуры или функции необходимо исключить для отмены своего рода "бэкапа" (.done)? (вопрос из разряда: "на будущее") |
Цитата:
Код:
я191223.vbs "Z:\Soft_In\Мой Пример New.cfg" "Z:\Soft_In\Мой Пример New.xls" При отсутствии втрорго аргумента (файла XLS) его имя возьмется из текста скрипта Цитата:
Код:
''''''''''FSO.MoveFile FileIn, FileIn + ".Done" |
Время: 22:48. |
Время: 22:48.
© OSzone.net 2001-