Что нового

Подсчет файлов .xlsx в активной папке

Dazmond

Новичок
Сообщения
3
Репутация
0
Есть папка с файлами. Мне нужно подсчитать именно файлы с расширением .xlsx в активной папке и подставить это значение в переменную, которая будет взаимодействовать с циклом.
В ней может быть 1 файл .xlsx, а может и 10.

1.jpg2.jpg

поковырявшись на форуме нашел отдельно решения для поиска пути активной директории и отдельно подсчет количества файлов.
Вот какой код получился, но он выдает ошибку.

Код:
#include <Array.au3>
#include <File.au3>
#include <Word.au3>

WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами

Func check()
   $title = WinGetTitle("[ACTIVE]")
   $text = WinGetText ($title)
   $lines = StringSplit($text, @LF, 1)
   if IsArray($lines) Then
      $adres = StringRegExpReplace($lines[15],"Адрес: ","")
      ConsoleWrite($adres&@CRLF)
   Else
   EndIf
EndFunc

$sMask = '*.xlsx'
$sFPath = check()
$aFiles = _FileListToArray($sFPath, $sMask, 1)
ConsoleWrite('"'&$aFiles&@CRLF&'"')
$iFiles = $aFiles[0]

ConsoleWrite('"'&$iFiles&@CRLF&'"')


Ниже цикл который выполняется корректно в него надо подставить цифру с количеством файлов в переменную $i, сейчас там статичная цифра 8

Код:
for $i = 8 to 1 step -1
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{F2}")
Sleep (500)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (500)
Send("{ALTDOWN}{TAB}{ALTUP}") ;переключение между окнами
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Sleep (500)
Send("{CTRLDOWN}v{CTRLUP}")
Send("{ENTER 2}")
Send("{ALTDOWN}{TAB}{ALTUP}") ;переключение между окнами
WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами
Sleep (500)
Send("{ENTER}")

WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
MouseClick("left",155, 359,1);Тыкнул в таблицу
Sleep (1000)
Send("{CTRLDOWN}a{CTRLUP}") ;Выбрал все в таблице
Sleep (1000)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (1000)
MouseClick("left",171, 1064,1) ;переключение на WORD
Sleep (1000)
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{CTRLDOWN}v{CTRLUP}")
Sleep (1000)

;блок форматирования таблицы
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{UP 1}")
Send("{CTRLDOWN}{ALTDOWN}g{CTRLUP}{ALTUP}") ;выделение таблицы
Sleep (1000)
Send("{CTRLDOWN}{ALTDOWN}j{CTRLUP}{ALTUP}") ;автоподбор ширины
Sleep (1000)
MouseClick("left",1137, 45,1) ;макет
Sleep (1000)
MouseClick("left",1003, 82,1) ;высота
Sleep (1000)
Send("0")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
Send("{CTRLDOWN}e{CTRLUP}") ;выравнивание по середине
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
;блок форматирования таблицы

MouseClick("left",216, 1066,1) ;переключение на EXEL
Sleep (1000)
WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
Send("{ALTDOWN}{F4}{ALTUP}") ;закрытие EXEL
Sleep (1000)
MouseClick("left",269, 1065,1) ;папка с файлами
WinWaitActive ("[CLASS:CabinetWClass]", "")

Next


по итогу хотелось бы чтобы в переменную $i в цикле подставлялось значение количества файлов .xlsx (в примере сейчас там статично цифра 8)

P.S. Система Windows 10
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Код:
;папка, в которой необходимо подсчитать файлы
$sDirIn = @ScriptDir
;тип файлов, которые будут подсчитаны
$sFileType = '*.xlsx'
;0 - подсчитать файлы только в указанной папке
;1 - подсчитать файлы в указанной папке и подпапках
$iSubDir = 0

$iResult = FileCalc_($sDirIn, $sFileType, $iSubDir)
MsgBox(0, '', $iResult)

Func FileCalc_($_sDirIn = @ScriptDir, $_sFileType = '*.*', $_iSubDir = 0)
   Local $_sFindFile, $_iResult
   Local $_hFindList = FileFindFirstFile($_sDirIn& '\'& $_sFileType)
   While 1
      $_sFindFile = FileFindNextFile($_hFindList)
      If @error Then ExitLoop
      If @extended Then
         If Not $_iSubDir Then ContinueLoop
         $_iResult += FileCalc_($_sDirIn& '\'& $_sFindFile, $_sFileType, $_iSubDir)
      Else
         $_iResult += 1
      EndIf
   WEnd
   Return $_iResult
EndFunc
 
Автор
D

Dazmond

Новичок
Сообщения
3
Репутация
0
Код:
;папка, в которой необходимо подсчитать файлы
$sDirIn = @ScriptDir
;тип файлов, которые будут подсчитаны
$sFileType = '*.xlsx'
;0 - подсчитать файлы только в указанной папке
;1 - подсчитать файлы в указанной папке и подпапках
$iSubDir = 0

$iResult = FileCalc_($sDirIn, $sFileType, $iSubDir)
MsgBox(0, '', $iResult)

Func FileCalc_($_sDirIn = @ScriptDir, $_sFileType = '*.*', $_iSubDir = 0)
   Local $_sFindFile, $_iResult
   Local $_hFindList = FileFindFirstFile($_sDirIn& '\'& $_sFileType)
   While 1
      $_sFindFile = FileFindNextFile($_hFindList)
      If @error Then ExitLoop
      If @extended Then
         If Not $_iSubDir Then ContinueLoop
         $_iResult += FileCalc_($_sDirIn& '\'& $_sFindFile, $_sFileType, $_iSubDir)
      Else
         $_iResult += 1
      EndIf
   WEnd
   Return $_iResult
EndFunc
Этот вариант @ScriptDir мне не подходит, потому что он предполагает чтобы скрипт лежал в папке с файлами, а у меня скрипт автоматически перемещается между десятками папок, поэтому мне нужно чтобы путь был активного окна папки

так выглядит блок перемещения между папками, набор примитивных команд
Код:
;блок перемещения между папками
Sleep (1000)
Send("{BACKSPACE}")
Sleep (1000)
Send("{BACKSPACE}")
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{UP 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
;блок перемещения между папками


возможно я что то не понимаю, не кидайте помидорами пожалуйста, может можно это как то решить проще?
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
не кидайте помидорами пожалуйста
Не вопрос, возьмем что-нить потяжелее :smile:

На самом деле действительно, реализация очень плохая, всё это можно сделать не через GUI и работать это будет гораздо быстрее и надежнее. Только для этого нужно точно описать исходные условия и какой результат Вы хотите получить.

Сначала Вы говорите, что нужно посчитать перечень файлов .xlsx в "активной папке", думаю, что большинство это поймут как рабочий каталог т.е. каталог, в котором находится скрипт, но потом выясняется, что это не так и под активной папкой подразумевается что-то другое. Не понятно что делает "блок перемещения между папками", он вводит данные в окно, о котором участники форума ничего не знают.
 
Последнее редактирование:
Автор
D

Dazmond

Новичок
Сообщения
3
Репутация
0
Не вопрос, возьмем что-нить потяжелее :smile:

На самом деле действительно, реализация очень плохая, всё это можно сделать не через GUI и работать это будет гораздо быстрее и надежнее. Только для этого нужно точно описать исходные условия и какой результат Вы хотите получить.

Сначала Вы говорите, что нужно посчитать перечень файлов .xlsx в "активной папке", думаю, что большинство это поймут как рабочий каталог т.е. каталог, в котором находится скрипт, но потом выясняется, что это не так и под активной папкой подразумевается что-то другое. Не понятно что делает "блок перемещения между папками", он вводит данные в окно, о котором участники форума ничего не знают.
Расскажу все по порядку.
Есть папки которые располагаются по пути
C:\Работа\готовое\0000001_г. Сосенский, автодорога по ул. Заводская\0,000-1,680 км
C:\Работа\готовое\0000002_г. Сосенский, автодорога по ул. 25 лет Октября\0,000-0,187 км
C:\Работа\готовое\0000003_г. Сосенский, автодорога по ул. Космонавтов\0,000-0,630 км
C:\Работа\готовое\***
и т.д. так 60 шт папок. Структура что находиться в каждой такой папке показана на скриншотах в 1 посте.

1. Открываю путь C:\Работа\готовое\0000001_г. Сосенский, автодорога по ул. Заводская\0,000-1,680 км
2. Открываю файл "Ведомости.docx"
3. Копирую название файла ".xslx" и вставляю в файл "Ведомости.docx" перед каждой таблицей как заголовок.
4. Открываю по очереди файлы ".xslx" (там содержаться таблицы) и копирую содержимое каждого файла ".xslx" в файл "Ведомости.docx" друг за другом сверху вниз. Внутри каждую таблицу форматирую как мне нужно. После каждого копирования закрываю файлы ".xslx".
5. Закрываю файл "Ведомости.docx"
6. Перехожу в следующую папку и делаю ровно тоже самое

P.S. Количество файлов ".xslx" меняется в каждой папке.

Я реализовал это топорным способом, как я это понимаю, сейчас наконец все работает. Но если есть более простой способ как это реализовать, буду премного благодарен если подскажете куда копать

Сейчас весь код выглядит вот так
Код:
for $j = 4 to 1 step -1

;блок вычисления количества файлов

$sFileType = '*.xlsx';тип файлов, которые будут подсчитаны

;0 - подсчитать файлы только в указанной папке
;1 - подсчитать файлы в указанной папке и подпапках
$iSubDir = 0 ;0 - подсчитать файлы только в указанной папке, 1 - подсчитать файлы в указанной папке и подпапках

WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами

Send("{CTRLDOWN}l{CTRLUP}")
Send("{CTRLDOWN}c{CTRLUP}")
MouseClick("left",826, 814,1) ;Тыкнуть в папку
$sDirIn = ClipGet()
$iResult = FileCalc_($sDirIn, $sFileType, $iSubDir)
$iResultMinus = $iResult - 1

ConsoleWrite($iResultMinus&@CRLF)
;блок вычисления количества файлов

WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")

WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Sleep (1000)

Send("{ALTDOWN}{TAB}{ALTUP}") ;переключение между окнами
WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)

;блок копирования колонтитула
WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
MouseClick("left",305, 308,1);Тыкнул в таблицу
Sleep (1000)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (1000)
MouseClick("left",171, 1064,1) ;переключение на WORD
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Sleep (1000)
MouseClick("left",507, 259,3) ;открыть колонтитул
Send("{CTRLDOWN}v{CTRLUP}")
Sleep (1000)
Send("{BACKSPACE}")
Sleep (1000)
Send("{ESC}")
;блок копирования колонтитула

;блок отступа от шапки
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (500)
;блок отступа от шапки

;блок для 1 таблицы
MouseClick("left",269, 1065,1) ;папка с файлами
WinWaitActive ("[CLASS:CabinetWClass]", "")
Send("{F2}")
Sleep (500)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (500)
MouseClick("left",171, 1064,1) ;переключение на WORD
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Sleep (1000)
Send("{CTRLDOWN}v{CTRLUP}")
Sleep (1000)
Send("{ENTER 2}")
MouseClick("left",216, 1066,1) ;переключение на EXEL
Sleep (1000)
WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
MouseClick("left",155, 359,1);Тыкнул в таблицу
Sleep (1000)
Send("{CTRLDOWN}a{CTRLUP}") ;Выбрал все в таблице
Sleep (1000)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (1000)
MouseClick("left",171, 1064,1) ;переключение на WORD
Sleep (1000)
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{CTRLDOWN}v{CTRLUP}")
Sleep (1000)

;блок форматирования таблицы
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{UP 1}")
Send("{CTRLDOWN}{ALTDOWN}g{CTRLUP}{ALTUP}") ;выделение таблицы
Sleep (1000)
Send("{CTRLDOWN}{ALTDOWN}j{CTRLUP}{ALTUP}") ;автоподбор ширины
Sleep (1000)
MouseClick("left",1137, 45,1) ;макет
Sleep (1000)
MouseClick("left",1003, 82,1) ;высота
Sleep (1000)
Send("0")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
Send("{CTRLDOWN}e{CTRLUP}") ;выпавнивание по середине
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
;блок форматирования таблицы

MouseClick("left",216, 1066,1) ;переключение на EXEL
Sleep (1000)
WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
Send("{ALTDOWN}{F4}{ALTUP}") ;закрытие EXEL
Sleep (1000)
MouseClick("left",269, 1065,1) ;папка с файлами
WinWaitActive ("[CLASS:CabinetWClass]", "")
;блок для 1 таблицы

;блок для последующих таблиц
for $i = $iResultMinus to 1 step -1
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{F2}")
Sleep (500)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (500)
Send("{ALTDOWN}{TAB}{ALTUP}") ;переключение между окнами
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Sleep (500)
Send("{CTRLDOWN}v{CTRLUP}")
Send("{ENTER 2}")
Send("{ALTDOWN}{TAB}{ALTUP}") ;переключение между окнами
WinWaitActive ("[CLASS:CabinetWClass]", "") ;папка с файлами
Sleep (500)
Send("{ENTER}")

WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
MouseClick("left",155, 359,1);Тыкнул в таблицу
Sleep (1000)
Send("{CTRLDOWN}a{CTRLUP}") ;Выбрал все в таблице
Sleep (1000)
Send("{CTRLDOWN}c{CTRLUP}")
Sleep (1000)
MouseClick("left",171, 1064,1) ;переключение на WORD
Sleep (1000)
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{CTRLDOWN}v{CTRLUP}")
Sleep (1000)

;блок форматирования таблицы
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{UP 1}")
Send("{CTRLDOWN}{ALTDOWN}g{CTRLUP}{ALTUP}") ;выделение таблицы
Sleep (1000)
Send("{CTRLDOWN}{ALTDOWN}j{CTRLUP}{ALTUP}") ;автоподбор ширины
Sleep (1000)
MouseClick("left",1137, 45,1) ;макет
Sleep (1000)
MouseClick("left",1003, 82,1) ;высота
Sleep (1000)
Send("0")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
Send("{CTRLDOWN}e{CTRLUP}") ;выравнивание по середине
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
;блок форматирования таблицы

MouseClick("left",216, 1066,1) ;переключение на EXEL
Sleep (1000)
WinWaitActive ("[CLASS:XLMAIN]", "") ;открытие EXEL
Sleep (1000)
Send("{ALTDOWN}{F4}{ALTUP}") ;закрытие EXEL
Sleep (1000)
MouseClick("left",269, 1065,1) ;папка с файлами
WinWaitActive ("[CLASS:CabinetWClass]", "")

Next
;блок для последующих таблиц


;закрытие WORD
MouseClick("left",171, 1064,1) ;переключение на WORD
WinWaitActive ("[CLASS:OpusApp]", "") ;открытие WORD
Send("{ALTDOWN}{F4}{ALTUP}") ;закрытие WORD
Sleep (1000)
Send("{ENTER}")
Sleep (5000)
;закрытие WORD


;блок перемещения между папками
Sleep (1000)
Send("{BACKSPACE}")
Sleep (1000)
Send("{BACKSPACE}")
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
Send("{DOWN 1}")
Sleep (1000)
Send("{UP 1}")
Sleep (1000)
Send("{ENTER}")
Sleep (1000)
;блок перемещения между папками

Next


;функция подсчета количество файлов
Func FileCalc_($_sDirIn, $_sFileType, $_iSubDir)
   Local $_sFindFile, $_iResult
   Local $_hFindList = FileFindFirstFile($_sDirIn& '\'& $_sFileType)
   While 1
      $_sFindFile = FileFindNextFile($_hFindList)
      If @error Then ExitLoop
      If @extended Then
         If Not $_iSubDir Then ContinueLoop
         $_iResult += FileCalc_($_sDirIn& '\'& $_sFindFile, $_sFileType, $_iSubDir)
      Else
         $_iResult += 1
      EndIf
   WEnd
   Return $_iResult
EndFunc
;функция подсчета количество файлов

Безымянный.jpg

на фото поместилось только 3 таблицы, т.к. видно только 1 страницу, но их на самом деле может быть сколько угодно.

Безымянный1.jpg

P.S. Надеюсь внес ясность
 
Последнее редактирование:

vovsla

Осваивающий
Сообщения
607
Репутация
36
К сожалению не смог сделать нормального примера т.к. завяз с работой ворда и экселя, но концепт есть.
И почему-то не захотела работать функция "_Word_DocSaveAs", то ли лыжи не едут, то ли..., в общем пришлось использовать возможность VBA
Этот пример просто вписывает имена фалов, не получилось сделать вставку таблицы, у меня таблица вставлялась либо до имени файла, либо вместо.
Всё, что связано с экселем закоммечено т.к. работает криво

Код:
#include <File.au3>
#include <Array.au3>
#include <File.au3>
#include <Word.au3>
#include <Excel.au3>


$oWord = _Word_Create()
;~ $oExcel = _Excel_Open()

$FilesArr = _FileListToArrayRec (@ScriptDir&'\Готовое', '*.xlsx', 1, 1, 1, 2)

Local $oDoc
For $Num = 1 To $FilesArr[0]

    $Path = StringRegExp($FilesArr[$Num], '(.*)\\', 1)[0] & '\'
    $FileName = StringRegExp($FilesArr[$Num], '.*\\(.*)\..*', 1)[0]

    If Not IsObj($oDoc) Then
        $oDoc = _Word_DocAdd($oWord)
    EndIf

    $oRange = _Word_DocRangeSet($oDoc, -2)
    $oRange.InsertAfter($FileName)
    $oRange.InsertAfter(chr(11))

;~     $oWorkbook = _Excel_BookOpen($oExcel, $FilesArr[$Num])
;~     $oWorkbook.Activesheet.Range("E4:H8").Copy
;~     $oRange = _Word_DocRangeSet($oDoc, 0)
;~     $oRange.Paste

    $oDoc.SaveAs2($Path&'Ведомости.docx')

    If $Num = $FilesArr[0] Then
        _Word_DocClose($oDoc, $WdSaveChanges)
        $oDoc = Null
    ElseIf $Path <> StringRegExp($FilesArr[$Num+1], '(.*)\\', 1)[0] & '\' Then
        _Word_DocClose($oDoc, $WdWordDocument)
        $oDoc = Null
    EndIf

Next

_Word_Quit($oWord)
;~ _Excel_Close($oExcel)
 
Верх