Что нового

[Массивы] Построчное использование данных из таблицы Excel

Статус
Закрыто для дальнейших ответов.

rout

Новичок
Сообщения
11
Репутация
0
Здравствуйте,
Поясните мне про массивы, на примере таблицы в Excel, как организовать массив и как данные из него построчно использовать. Не могу себе представить как это "выглядит".

В таблице три колонки: А1, B1, С1 и 200 строк. А1 и B1 содержат в себе данные, которые используются в дальнейшем А1 как имя файла, а B1 - его основа (текст), а в С1 нужно записывать некий результат на основе А1.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Для версии AutoIt 3.3.12.0
Код:
#include <Excel.au3>
#include <Array.au3> ; для просмотра массивов

; создаём объект
$oExcel = _Excel_Open()

; открываем файл
$oBook = _Excel_BookOpen($oExcel, @ScriptDir & "\test.xls")

; читаем всю таблицу в массив
$aRange = _Excel_RangeRead($oBook)
_ArrayDisplay($aRange) ; проверяем

; создаём новый массив, в который
; будем сохранять результат действий
; и который будет колонкой "C"
; размер этого массива будет, как у прочитанного
Global $aC[UBound($aRange)]

; перебираем строки прочитанной таблицы
; делаем с ними что-то и
; сохраняем в соответствующем элементе
; созданного массива
For $i = 0 To UBound($aRange) - 1
  $aC[$i] = $aRange[$i][0] & ":" & $aRange[$i][1]
Next
_ArrayDisplay($aC) ; проверяем

; записываем массив с результатами в колонку "C"
_Excel_RangeWrite($oBook, Default, $aC, "C1")

; закрываем файл с сохранением
_Excel_Close($oExcel)
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
InnI сказал(а):
Для версии AutoIt 3.3.12.0
Код:
#include <Excel.au3>
#include <Array.au3> ; для просмотра массивов

; создаём объект
$oExcel = _Excel_Open()

; открываем файл
$oBook = _Excel_BookOpen($oExcel, @ScriptDir & "\test.xls")

; читаем всю таблицу в массив
$aRange = _Excel_RangeRead($oBook)
_ArrayDisplay($aRange) ; проверяем

; создаём новый массив, в который
; будем сохранять результат действий
; и который будет колонкой "C"
; размер этого массива будет, как у прочитанного
Global $aC[UBound($aRange)]

; перебираем строки прочитанной таблицы
; делаем с ними что-то и
; сохраняем в соответствующем элементе
; созданного массива
For $i = 0 To UBound($aRange) - 1
  $aC[$i] = $aRange[$i][0] & ":" & $aRange[$i][1]
Next
_ArrayDisplay($aC) ; проверяем

; записываем массив с результатами в колонку "C"
_Excel_RangeWrite($oBook, Default, $aC, "C1")

; закрываем файл с сохранением
_Excel_Close($oExcel)
InnI,
Спасибо, мне очень нравится - все подробно откомментировано, попробовать пока не могу, но хочу порассуждать. Получается, вот в этом блоке:
Код:
; перебираем строки прочитанной таблицы
; делаем с ними что-то и
; сохраняем в соответствующем элементе
; созданного массива
For $i = 0 To UBound($aRange) - 1
  $aC[$i] = $aRange[$i][0] & ":" & $aRange[$i][1]
Next

$aRange[$i][0] и $aRange[$i][1] - это первый и второй столбец соответственно? И их можно не объявлять как отдельные массивы?

Если это так, то тогда вот это запишет эти столбцы в файл с разделителем ":", верно?
Код:
For $i = 0 To UBound($aRange) - 1
	FileWriteLine(@ScriptDir & "\db.txt",$aRange[$i][0] & ":" & $aRange[$i][1])
  ;$aC[$i] = $aRange[$i][0] & ":" & $aRange[$i][1]
Next

А вот это запишет 10 файлов с названиями из первого столбца и содержимым из второго?
Код:
For $i = 0 To UBound($aRange) - 1
	While $i <= 10
		FileWriteLine(@ScriptDir & "\" & $aRange[$i][0] & ".txt", $aRange[$i][1])
		$i = $i + 1
	WEnd	
  ;$aC[$i] = $aRange[$i][0] & ":" & $aRange[$i][1]
Next
А что бы сохранить так весь (а не только первые 10 записей) массив нужно в условии While $i <= 10, $i приравнять к $aRange?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
rout
попробовать пока не могу, но хочу порассуждать
Как говорится, лучше один раз увидеть. Посмотрите на вывод _ArrayDisplay и сразу всё поймёте.

это первый и второй столбец соответственно?
Да.

И их можно не объявлять как отдельные массивы?
В данном случае у вас получается один двумерный массив, а не много одномерных.

это запишет эти столбцы в файл с разделителем ":", верно?
Верно.

это запишет 10 файлов с названиями из первого столбца и содержимым из второго?
Нет (см. далее).

чтобы сохранить так весь массив
Вот так будут созданы файлы с названием из первого столбца и содержимым соответствующей ячейки второго столбца
Код:
For $i = 0 To UBound($aRange) - 1
  FileWriteLine(@ScriptDir & "\" & $aRange[$i][0] & ".txt", $aRange[$i][1])
Next


А так будут созданы файлы с названиями из столбца A, но в каждом из них будет полное содержимое столбца B.
Т.е. внешний цикл (по $i) работает с первым столбцом, а внутренний (по $j) - со вторым
Код:
For $i = 0 To UBound($aRange) - 1
  For $j = 0 To UBound($aRange) - 1
    FileWriteLine(@ScriptDir & "\" & $aRange[$i][0] & ".txt", $aRange[$j][1])
  Next
Next
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
InnI сказал(а):
rout
попробовать пока не могу, но хочу порассуждать
Как говорится, лучше один раз увидеть. Посмотрите на вывод _ArrayDisplay и сразу всё поймёте.

это первый и второй столбец соответственно?
Да.

И их можно не объявлять как отдельные массивы?
В данном случае у вас получается один двумерный массив, а не много одномерных.

это запишет эти столбцы в файл с разделителем ":", верно?
Верно.

это запишет 10 файлов с названиями из первого столбца и содержимым из второго?
Нет (см. далее).

чтобы сохранить так весь массив
Вот так будут созданы файлы с названием из первого столбца и содержимым соответствующей ячейки второго столбца
Код:
For $i = 0 To UBound($aRange) - 1
  FileWriteLine(@ScriptDir & "\" & $aRange[$i][0] & ".txt", $aRange[$i][1])
Next


А так будут созданы файлы с названиями из столбца A, но в каждом из них будет полное содержимое столбца B.
Т.е. внешний цикл (по $i) работает с первым столбцом, а внутренний (по $j) - со вторым
Код:
For $i = 0 To UBound($aRange) - 1
  For $j = 0 To UBound($aRange) - 1
    FileWriteLine(@ScriptDir & "\" & $aRange[$i][0] & ".txt", $aRange[$j][1])
  Next
Next

InnI,
ну теперь понятно, спасибо, пришло осознание что такое массив и как с ним работать. Вчера проверял работу скрипта, пробовал варианты - все отлично работает. Пример то же удачный получился, я еще попрактикуюсь, но уже сам конечно же.
Остался один маленький вопрос и закрываю тему.
Есть функция
Код:
_Excel_RangeWrite
которая используется в примере для записи массива в колонку "С" данным в ней можно придать разнообразный вид, в том числе вид ссылки, но такая ссылка не указывает (естественно) на файл а является записью пути к нему.
И есть функция
Код:
_Excel_RangeLinkAddRemove
но у нее нет значений для работ с массивом
И не выходит у меня заставить ее работать кроме как вот так:
Код:
For $i = 0 To UBound($aRange) - 1
	$j = $i + 1
	_Excel_RangeLinkAddRemove($oWorkbook, $oWorkbook.Activesheet, "C" & $j, $aC[$i], Default)
Next

Оно конечно работает, но правильно ли это?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
rout [?]
Остался один маленький вопрос
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Автор
R

rout

Новичок
Сообщения
11
Репутация
0
madmasles сказал(а):
rout [?]
Остался один маленький вопрос
[warn]За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.[/warn]









Спорить с модератором всегда чревато, можете влепить мне РО
Но, вопрос в рамках этой темы, он так же про работу с массивом в том же (первоначальном, от InnI) примере. И на примере это скрипта я спрашиваю об использовании массива в другой, схожей функции. А вопрос у меня как раз про Excel и массивы. Ради этого вопроса отдельную тему создавать точно не стоит - она будет с тем же примером.
И в данном конкретном примере
"Остался один маленький вопрос по этой теме"
и
"Ребят, а ещё такой вопрос... по другой теме".
- созвучны но не однозначны.
Спасибо.
 
Статус
Закрыто для дальнейших ответов.
Верх