<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; HTA & VBS: TXT-XLS конвертация]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15168</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15168&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «HTA & VBS: TXT-XLS конвертация».]]></description>
		<lastBuildDate>Tue, 11 Aug 2020 05:45:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: HTA & VBS: TXT-XLS конвертация]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=141606#p141606</link>
			<description><![CDATA[<p>Версия 1.78 от 07.08.2020.<br /><a href="https://www.dropbox.com/sh/tfshd52lgri01yf/AAAXzV-5Dn2mlz1aPCWWU-hha?dl=0">https://www.dropbox.com/sh/tfshd52lgri0 … U-hha?dl=0</a></p><p>&nbsp; &nbsp; * TXT-XLS конвертация.exe - скачать и запустить для установки.</p><p><em>&nbsp; &nbsp; &nbsp; &nbsp;Если файл, загруженный с интернета, не запускается - нужно открыть его свойства (ПКМ - Свойства) и поставить чек &quot;Разблокировать&quot; на вкладке &quot;Общие&quot; (в самом низу вкладки).</em></p><p>&nbsp; &nbsp; * ZTxtXls_новое.docx - описание важных изменений.</p><p>Изменения:<br />&nbsp; &nbsp; * Исправлены ошибки, улучшена стабильность работы.</p>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Tue, 11 Aug 2020 05:45:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=141606#p141606</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA & VBS: TXT-XLS конвертация]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139756#p139756</link>
			<description><![CDATA[<p>Версия 1.75 от 01.05.2020.</p><p><a href="https://www.dropbox.com/sh/tfshd52lgri01yf/AAAXzV-5Dn2mlz1aPCWWU-hha?dl=0">https://www.dropbox.com/sh/tfshd52lgri0 … U-hha?dl=0</a><br />&nbsp; &nbsp; * TXT-XLS конвертация.exe - скачать и запустить для установки.<br />&nbsp; &nbsp; * ZTxtXls_новое.docx - описание важных изменений.</p><p>Изменения:<br />&nbsp; &nbsp; * Добавлена возможность автоматического обновления программы.<br />&nbsp; &nbsp; * Личные настройки пользователя теперь хранятся в отдельном файле (файл User.ini в папке программы) и не перезаписываются при обновлении программы.<br />&nbsp; &nbsp; * Исправлены ошибки.</p>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Thu, 28 May 2020 03:52:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139756#p139756</guid>
		</item>
		<item>
			<title><![CDATA[Re: HTA & VBS: TXT-XLS конвертация]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=137928#p137928</link>
			<description><![CDATA[<p><a href="https://www.dropbox.com/s/qq4d694dm5j5zqm/TXT-XLS.zip">https://www.dropbox.com/s/qq4d694dm5j5zqm/TXT-XLS.zip</a></p><p>версия 1.70 от 19.02.2020</p><p>Изменения:<br />&nbsp; &nbsp; * Текст вида «февраль 2020» теперь конвертируется в даты со значением «01.02.2020» (формат отображения «фев-2020»).<br />&nbsp; &nbsp; * Ускорена работа интерфейса программы.<br />&nbsp; &nbsp; * Добавлены новые шаблоны.<br />&nbsp; &nbsp; * Исправлены ошибки.</p>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Thu, 20 Feb 2020 15:59:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=137928#p137928</guid>
		</item>
		<item>
			<title><![CDATA[HTA & VBS: TXT-XLS конвертация]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=137681#p137681</link>
			<description><![CDATA[<p>Всем привет!</p><p>&nbsp; &nbsp; <strong>Предисловие.</strong></p><p>Долго не решался выложить данную программу, т.к. всё время что-то менялось, постоянно программа переписывалась.<br />И сомневался, нужна ли она широким массам - хотя сам использую её постоянно (+50 пользователей).</p><p>&nbsp; &nbsp; <strong>Недостатки.</strong></p><p>Код не очень гладкий (очень даже не гладкий) - не нашёл я способа, как ловко и быстро заменить, допустим, &quot;if then else&quot; на &quot;If Then Else&quot;.<br />Код слабо комментирован - дополню, если кого заинтересует.<br />В качестве оправдания, можно сказать, что 4 года код &quot;в движении&quot;, переписывается и видоизменяется.<br />Но вроде бы работает, вопреки всем законам физики <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>&nbsp; &nbsp; <strong>Благодарности.</strong></p><p>Спасибо данному форуму, который поистине кладезь идей - и его участникам.<br />Я многие из идей и наработок использовал, и если кого-то из авторов не упомянул лично - обещаю исправить.</p><p>Далее идёт текст, который, возможно, удобнее прочитать в прилагаемом архиве, файл ZTxtXls_TechInfo.docx.</p><p>&nbsp; &nbsp; <strong>Назначение.</strong></p><p>Данная программа конвертирует текстовые файлы определённого формата (табличный вид с разделителями, наподобие CSV) в файлы Excel.</p><p>В той КИС, в которой я работаю (построенной на Оракле – OEBS), большинство отчётов получаются в виде PDF-файлов, с дополнительной возможностью выгрузки данных в текстовый файл (TXT-файл). Для этого в режиме просмотра PDF-файла нужно нажать на ссылку вида: Доступ к файлу здесь, после чего данные отчёта будет сохранены в виде TXT-файла.</p><p>После сохранения данных отчёта в TXT-файл, для дальнейшего анализа и обработки данных, перед пользователем встаёт задача конвертации этого файла в формат MS Excel (XLS-файл). Вручную пользователю предстоит выполнить следующие действия (затратив время и силы, при этом сам он должен обладать определённой квалификацией):</p><p>•	выбрать тип файлов: Текст, найти и открыть сохранённый TXT-файл;<br />•	определить формат кодировки символов: чаще всего это 866-DOS или 1251-Windows;<br />•	подобрать разделитель столбцов в TXT-файле – это могут быть (из тех, что я наблюдал в нашей КИС):<br />	«;» (точка с запятой)<br />	«,» (запятая)<br />	«:» (двоеточие)<br />	«знак табуляции»;<br />•	задать формат столбцов, содержащих числа:<br />	если оставить «Общий», то Excel будет самостоятельно определять тип данных в каждой ячейке столбца, из-за чего возникают проблемы – например, числа вида «5.2» (в отчётах КИС разделитель дробной части точка) могут быть необратимо преобразованы в даты «5.фев»;<br />	если задать «Текст», то в дальнейшем потребуются дополнительные действия для того, чтобы получить числовой столбец (например, заменить все вхождения «.» на «,»);<br />•	после открытия файла – задать шрифт, ширину столбцов, сохранить файл в формате книги Excel и т.п.<br />Данная программа предназначена для автоматизации вышеперечисленных действий.</p><p>&nbsp; &nbsp; <strong>История.</strong></p><p>Программа реализована в 2016 г. как простая утилита для загрузки TXT-файлов в Excel.</p><p>Изначально в папке программы содержался сам файл программы ZTxtXls.vbs, а также папки:<br />•	TXT\ – в эту папку нужно было текстовые (.txt, .csv) файлы для обработки.<br />•	XLS\ – в этой папке сохранялись XLS-файлы.<br />•	Архив\ – сюда переносились обработанные TXT-файлы.</p><p>Если при запуске утилиты был указан параметр (имя обрабатываемого файла) в командной строке, то обрабатывался именно этот файл, а содержимое папки TXT\ игнорировалось. </p><p>После окончания конвертации:<br />•	если конвертировался 1 файл, то открывался получившийся XLS-файл.<br />•	в случае нескольких файлов, появлялось сообщение «Файлов обработано: ...» и открывалась папка XLS\ (где хранились результаты конвертации).</p><p>С 2017 г. разработан и развивается графический интерфейс программы (Txt-в-Xls.hta). Основное его предназначение – следить за выбранной папкой TXT-файлов (по умолчанию это папка Загрузки, C:\Users\Имя пользователя\Downloads), и при сохранении в неё TXT-файла запускать его конвертацию (вызывая ZTxtXls.vbs с заданными параметрами). Кроме этого, в интерфейсе (HTA) можно наглядно задавать параметры для запуска утилиты (VBS).</p><p>&nbsp; &nbsp; <strong>Установка.</strong></p><p>•	Перед установкой необходимо закрыть окно программы «TXT-XLS конвертация» (если в данный момент запущена старая версия) и все окна программы MS Excel.</p><p>•	Сохраните прилагаемый архивный файл в любом месте (например, на Рабочий стол);</p><p>•	Извлеките содержимое – нажмите на архивный файл правой кнопкой мыши, выберите пункт меню «Извлечь в текущую папку».</p><p>Архив будет распакован в папку «Рабочий стол\TXT-XLS конвертация».</p><p>•	Системные требования: Windows XP и выше, Excel 2007 и выше.</p><p>&nbsp; &nbsp; <strong>Описание работы.</strong></p><p>Инструкция для пользователя находится в папке программы, в файле ZTxtXls.docx.</p><p>	В папке «TXT-XLS конвертация\» находится папка программы ZTxtXls\ и ярлык «Txt-в-Xls» (запускающий ZTXTXLS\txt-в-xls.hta):</p><p>В папке программы содержатся уже рассмотренные выше папки: <br />•	TXT\ – папка для обрабатываемых TXT-файлов, если не найдена папка Загрузки\.<br />•	XLS\ – в этой папке сохраняются XLS-файлы.<br />•	Архив\ – сюда переносятся обработанные TXT-файлы, а также сохраняются перезаписываемые XLS-файлы.<br />•	Шаблоны\ – здесь хранятся файлы Шаблонов, в которых листы-справочники заполняются из TXT-файлов, это уже более «продвинутое» использование программы.</p><p>Далее рассмотрим работу программных файлов HTA и VBS.</p><p>&nbsp; &nbsp; <strong>Txt-в-Xls.hta.</strong></p><p>Графический интерфейс программы:</p><p>1.	Автоматическая обработка TXT-файлов, появляющихся в папке Загрузки\, основана на механизме асинхронного отслеживания изменения содержимого данной папки:</p><p>Sink_Init()</p><div class="codebox"><pre><code>  oService.ExecNotificationQueryAsync objSinkCreat, _
    &quot;SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE &quot; &amp;_
    &quot;Targetinstance ISA &#039;CIM_DirectoryContainsFile&#039; &quot; &amp;_
    &quot; AND TargetInstance.GroupComponent= &#039;Win32_Directory.Name=&quot;&quot;&quot; &amp; Replace(sFolder, &quot;\&quot;, &quot;\\\\&quot;) &amp; &quot;&quot;&quot;&#039;&quot;
</code></pre></div><div class="codebox"><pre><code>  oService.ExecNotificationQueryAsync objSinkModif, _
    &quot;SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE &quot; &amp;_
    &quot;Targetinstance ISA &#039;CIM_DataFile&#039; &quot; &amp;_
    &quot; AND (   TargetInstance.Extension LIKE &#039;&quot; &amp; Mid(s_TxtExt, 2) &amp; &quot;%&#039; &quot; &amp;_
    &quot;      OR TargetInstance.Extension LIKE &#039;&quot; &amp; Mid(s_CsvExt, 2) &amp; &quot;%&#039; &quot; &amp;_
    &quot;      OR TargetInstance.Extension LIKE &#039;&quot; &amp; Mid(s_XlsExt, 2) &amp; &quot;%&#039;)&quot; &amp;_
    &quot; AND TargetInstance.Drive = &#039;&quot; &amp; sDrive &amp; &quot;&#039;&quot; &amp;_
    &quot; AND TargetInstance.Path = &#039;&quot; &amp; Replace(sFolder, &quot;\&quot;, &quot;\\&quot;) &amp; &quot;&#039;&quot; &#039;\\Temp\\
</code></pre></div><p>В случае появления в папке Загрузки\ файлов с нужным расширением (.csv*, .txt*, .xls*), вызывается процедура постановки файла в очередь TXT-файлов Sink_Queue().</p><p>Кроме этого, отслеживаются события завершения дочерних процессов (VBS вызывается из HTA):</p><div class="codebox"><pre><code>  oService.ExecNotificationQueryAsync objSinkExec, _ 
    &quot;SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039; AND TargetInstance.ParentProcessId = &quot; &amp; gnScriptProcessID
</code></pre></div><p>После завершения такого процесса, если в очереди есть ожидающие обработки TXT-файлы, происходит запуск конвертации очередного файла: Exec_Queue() (вызывается также из процедуры Window_Timeout(), с определённой периодичностью) – т.е., новый вызов VBS из HTA.</p><p>2.	Реализованы ведение журнала и информирование пользователя:<br />	HtaLog() – вывод сообщения в журнал;<br />	HtaStatus() – вывод сообщения в информационную область окна;<br />	HtaLogStatus() – вывод сообщения в журнал и в информационную область окна.</p><p>3.	Для наглядности в окне отражаются пути с использованием пользовательских имён папок:&nbsp; </p><p>	FolderToLocalizedNameFull() – выводит более понятное пользователю &quot;Загрузки\111\222&quot; вместо полного имени &quot;C:\Users\Пользователь\Downloads\111\222&quot;;</p><div class="codebox"><pre><code>  Set oFolder = goShellApp.NameSpace(sFolder)
  FolderToLocalizedName = oFolder.Title
</code></pre></div><p>	FolderFromLocalizedNameFull(): – при переходе в поле ввода имени папки, выводит полное имя &quot;C:\Users\Пользователь\Downloads\111\222&quot; вместо Загрузки\111\222&quot; (чтобы можно было вручную редактировать путь, либо копировать его в буфер обмена).</p><p>Из ветки реестра &quot;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders&quot;, дополнительно используя set oFolder = goShellApp.NameSpace(i), sFolder = oFolder.Self.Path.</p><p>4.	Функции, используемые и в HTA, и в VBS расположены в одном месте:&nbsp; </p><p>В HTA:<br /></p><div class="codebox"><pre><code>&lt;script language=&quot;VBScript&quot; src=&quot;ZTxtXls.vbs&quot;&gt; &lt;/script&gt;
</code></pre></div><p>В VBS (проверка существования глобальной переменной glDebug – если да, то не переопределять константы и глобальные переменные):<br /></p><div class="codebox"><pre><code>If IsEmpty(Eval(&quot;glDebug&quot;)) Then 
</code></pre></div><p>&nbsp; &nbsp; <strong>ZTxtXls.vbs.</strong></p><p>Непосредственно программа конвертации TXT в XLS:</p><p>1.	CsvProcess(): Анализ обрабатываемого TXT-файла (количество колонок, тип их данных, разделители и т.п.):</p><p>	Определяется разделитель колонок (из определённых заранее вариантов: vbTab &amp; &quot;;:,|!&quot;);</p><p>	Определяется кодовая страница (2 варианта: 866-DOS-Rus или 1251-Windows-Rus), функцию Guess_CP() я взял у <strong>yuriy2000</strong> <a href="http://forum.script-coding.com/viewtopic.php?id=9940">http://forum.script-coding.com/viewtopic.php?id=9940</a>, за что ему – Огромное Спасибо!); </p><div class="codebox"><pre><code>Function Guess_CP(byVal sStr)
   Dim sVowel    : sVowel    = &quot;[аеоиуяы]&quot; &#039;гласные (часто встречающиеся)
   Dim sNotVowel : sNotVowel = &quot;[нтсрвлкмдпзбьчгй]{1,2}&quot; &#039;согласные (часто встречающиеся)

   With New RegExp
      .Global     = True              
      .Pattern    = &quot;[\s]+&quot;            
       sStr       = .Replace(sStr, &quot; &quot;) &#039;Убрать переносы строк и двойные пробелы
      .Global     = False 
      .IgnoreCase = True 
      .Pattern    =  sNotVowel &amp; sVowel &amp; sNotVowel &amp; sVowel  
      if .Test(sStr) then 
          Guess_CP = 1251
      elseif .Test(OemToAnsi(sStr)) then 
          Guess_CP = 866
      else
          Guess_CP = 0 &#039;Не понятно
      end if
   End With

End Function
</code></pre></div><p>	Определяются типы колонок:<br />-	Время HH:MM:SS или HH:MM (если в тексте секунды не упомянуты);<br />-	Дата, включая филологию типа «12-ОКТ-2007» (разделители подбираются из &quot;.-/&quot;);<br />-	Длинное целое число (типа ИНН, 11 знаков и больше) ¬– строго тип «Число», иначе тип «Общий» покажет что-то вроде «7.445E+11»;</p><p>2.	XlsProcess(): Непосредственно конвертация, которая использует предыдущий анализ TXT-файла:</p><p>	Программа присваивает имена колонкам в XLS-файле, используя текст в распознанных заголовках колонок (что в дальнейшем может быть очень полезным, см. те же самые Шаблоны с формулами, опирающимися на имена колонок).</p><p>	Заголовки колонок определяются, выделяются, ставятся в заголовки печати и закрепляются в области просмотра, чтобы заголовки всегда были на экране.</p>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Thu, 06 Feb 2020 18:44:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=137681#p137681</guid>
		</item>
	</channel>
</rss>
