Что нового

Анализ Excel документа, чтение данных

Maggot_515

Новичок
Сообщения
11
Репутация
0
Версия AutoIt: 3.3.14.2

Описание: Задача найти строку в excel документе которая начинается
с текста Прил.**** ; где **** - всегда разные цифры; cоздать папку с номером ****
Затем выполнить сравнение по байтно файлов с ячейкой в excel документе и переместить их в папку соответствующую номеру приложения. Все что не соответствует объему не перемещать, название файлов в учет не брать сравнивать только объем в байтах.

Примечания: Прикрепляю два архива До и После преобразования. Таблица с которой берутся данные 20180420.xls имя каждый день меняется.
 

Вложения

  • До.rar
    11.5 КБ · Просмотры: 5
  • После.rar
    11.6 КБ · Просмотры: 4

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пробуйте этот вариант:
Код:
#include <Excel.au3>

$sExcelFile = FileOpenDialog('Выбрать файл EXCEL', @ScriptDir & '\', 'Файл EXCEL (*.xls;*.xlsx)', 1 + 2)
If Not @error Then
	$oExcel = _Excel_Open(False)
	$oWorkBook = _Excel_BookOpen($oExcel, $sExcelFile)
	$aExcelData = _Excel_RangeRead($oWorkBook)
	_Excel_Close($oExcel)
	For $i = 0 To UBound($aExcelData) - 1
		$PathName = StringRegExp($aExcelData[$i][0], '(?:прил.)(.*)', 1)
		If Not @error Then
			If Not FileExists(@ScriptDir & '\' & $PathName[0]) Then DirCreate(@ScriptDir & '\' & $PathName[0])
			$FileName = StringSplit($aExcelData[$i][1], '(')
			$FileSize = StringRegExp($FileName[2], '(\d*)', 1)
			If FileGetSize(StringStripWS($FileName[1], 8)) = $FileSize[0] Then FileMove(@ScriptDir & '\' & $FileName[1], @ScriptDir & '\' & $PathName[0])
		EndIf
	Next
EndIf
 
Автор
M

Maggot_515

Новичок
Сообщения
11
Репутация
0
Все отлично работает с тем документом что я прикрепил.
Удалось выгрузить с программы вроде все тоже самое но работать с выгруженного excel документа не хочет.
Поменял (прил.) на (Прил.) в коде программы.
Очистил формат и сделал формат ячейки текстовый. в excel документе, заработало, но создает папки даже там где файлы не совпали по объему.

p.s не думал что формат ячейки может как то влиять. Посмотрите пожалуйста прикрепленный файл.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Попробуйте так: не будет создавать пустые папки, исправлен поиск в нужном столбце.
Код:
#include <Excel.au3>

$sExcelFile = FileOpenDialog('Выбрать файл EXCEL', @ScriptDir & '\', 'Файл EXCEL (*.xls;*.xlsx)', 1 + 2)
If Not @error Then
	$oExcel = _Excel_Open(False)
	$oWorkBook = _Excel_BookOpen($oExcel, $sExcelFile)
	$aExcelData = _Excel_RangeRead($oWorkBook)
	_Excel_Close($oExcel)
	For $i = 0 To UBound($aExcelData) - 1
		$PathName = StringRegExp($aExcelData[$i][1], '(?:Прил.)(.*)', 1)
		If Not @error Then
			$FileName = StringSplit($aExcelData[$i][2], '(')
			$FileSize = StringRegExp($FileName[2], '(\d*)', 1)
			If FileGetSize(StringStripWS($FileName[1], 8)) = $FileSize[0] Then
				If Not FileExists(@ScriptDir & '\' & $PathName[0]) Then DirCreate(@ScriptDir & '\' & $PathName[0])
				FileMove(@ScriptDir & '\' & $FileName[1], @ScriptDir & '\' & $PathName[0])
			EndIf
		EndIf
	Next
EndIf
 
Автор
M

Maggot_515

Новичок
Сообщения
11
Репутация
0
Огромное спасибо , программа работает отлично ! Читаю ваш код и большую половину не понимаю вообще начиная с
Код:
For $i = 0 To UBound($aExcelData) - 1
и до конца :stars: где почитать что бы самому понять работу вашего скрипта ?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Дописал комментарии к каждой строке скрипта:
Код:
#include <Excel.au3>
;Открываем диалог выбора файла EXCEL с сохранением результата в переменную $sExcelFile
$sExcelFile = FileOpenDialog('Выбрать файл EXCEL', @ScriptDir & '\', 'Файл EXCEL (*.xls;*.xlsx)', 1 + 2)
If Not @error Then
	;Создаём экземплер EXCEL (скрытый)
    $oExcel = _Excel_Open(False)
	;Подключаем книгу Excel
    $oWorkBook = _Excel_BookOpen($oExcel, $sExcelFile)
	;Читаем содержимое книги в двумерный массив $aExcelData
    $aExcelData = _Excel_RangeRead($oWorkBook)
	;Закрываем Excel
    _Excel_Close($oExcel)
	;Создаём цикл обработки массива с самого начала (индекс "0") по максимальный индекс массива
	;Так как нумерация индекса массивов начинается с "0" , то последний индекс будет равен количеству элементов в массиве минус 1
    For $i = 0 To UBound($aExcelData) - 1
		;Перебирая все элементы массива в первой колонке пытаемся выделить часть строки после "Прил." , используя регулярное выражение
        $PathName = StringRegExp($aExcelData[$i][1], '(?:Прил.)(.*)', 1)
		;Если регулярное выражение сработало ( в ячейке было "Прил.") , то:
        If Not @error Then
			;Делим строку в столбце 3 (для массива колонка №2) по разделителю "(" , т.е отделяем название файла от размера
            $FileName = StringSplit($aExcelData[$i][2], '(')
			;Использую регулярное выражение выделяем цифровое значение размера файла из второй части разделённой строки
            $FileSize = StringRegExp($FileName[2], '(\d*)', 1)
			;Получаем размер файла в байтах из имени файла из первой части разделённой строки (На всякий случай убираем все пробелы функцией StringStripWS)
			;И если размер файла равен размеру файла полученному из Excel , то :
            If FileGetSize(StringStripWS($FileName[1], 8)) = $FileSize[0] Then
				;Если ещё нет папки с именем , полученным ранее из Excel , то создаём её
                If Not FileExists(@ScriptDir & '\' & $PathName[0]) Then DirCreate(@ScriptDir & '\' & $PathName[0])
				;Перемещаем файл  в эту папку
                FileMove(@ScriptDir & '\' & $FileName[1], @ScriptDir & '\' & $PathName[0])
            EndIf
        EndIf
    Next
EndIf
где почитать что бы самому понять работу вашего скрипта ?
На этом сайте очень хорошо реализована справка - просто нажимайте на имя функции в примере и Вы увидите описание этой функции, есть, правда и исключения , к ним относятся , например в данном скрипте все функции работы с Excel (так , как эти функции в таком виде появились в последних версиях AutoIt и на русский язык ещё не переведены) , в таком случае ищите описание этих функция на англоязычных сайтах.
 
Автор
M

Maggot_515

Новичок
Сообщения
11
Репутация
0
Спасибо что потратили свое время и очень помогли ! Буду искать в англоязычных сайтах :IL_AutoIt_1:
 
Верх