Что нового

Чтение Excel в массив

maxd2007

Новичок
Сообщения
89
Репутация
0
Здравствуйте, столкнулся с такой проблемой:
Написал такой код:

Код:
$FileExelOpen = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel ($FileExelOpen)
_ArrayDisplay ($aResult)
Func _open_read_excel ($FileExelOpen) 
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook) 
	_Excel_Close ( $oExcel )
	_ArrayDisplay ($aResult)
	Return $aResult
EndFunc

в $aResult получается нужный массив, но проблема возникает когда я удаляю ечейки из Excel (самостоятельно выделяю ненужные и нажимаю delete) тогда на выходе я получаю массив с тем количеством ячеек как был в прошлый раз (на рисунке 1 excel до редактирования и результат работы функции _ArrayDisplay на фото 2 отредактированный Excel и результат работы функции _ArrayDisplay), но они пустые, вопрос: как сделать так что бы он не считал удаленные ячейки и не записывал их в массив?
 

Вложения

  • 1.png
    1.png
    33.2 КБ · Просмотры: 38
  • 2.png
    2.png
    29.4 КБ · Просмотры: 37

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Может, проще удалить не нужные колонки уже из массива:
Код:
#include <Array.au3>
_ArrayColDelete ( ByRef $aArray, $iColumn [, $bConvert = False] )
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
ra4o сказал(а):
Может, проще удалить не нужные колонки уже из массива:
Код:
#include <Array.au3>
_ArrayColDelete ( ByRef $aArray, $iColumn [, $bConvert = False] )
А как я узнаю какие ячейки удалять?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вы же как-то определяете какие ячейки из Excel удалить хотите ? Читайте весь Excel в массив и не нужные колонки - удаляйте , только учтите, что номер колонки в массве на 1 меньше, чем в Excel. Упс, вам не колонки , а строки удалить нужно, тогда
Код:
#include <Array.au3>
_ArrayDelete ( ByRef $aArray, $vRange )
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Попробовал так
Код:
Func _open_read_excel ($FileExelOpen) 
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook) 
	_Excel_Close ( $oExcel )

	_ArrayDisplay ($aResult)
	For $i = 1 To UBound($aResult) Step 1
		If $aResult[$i][1] = "" Then
			_ArrayDelete ($aResult, $i)
		EndIf
	Next
	_ArrayDisplay ($aResult)
	Return $aResult
EndFunc

Ругается судя по всему на то что я выхожу за рамки массива если делаю так
Код:
For $i = 1 To UBound($aResult) - 1 Step 1
тоже ругается, если так
Код:
For $i = 1 To UBound($aResult) - 2 Step 1
, тогда последний элемент массива все равно пустой
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно без удаления пустых строк, а на оборот - сохранить все НЕ пустые строки
Код:
#include <array.au3>
#include <excel.au3>

$FileExelOpen = FileOpenDialog("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel($FileExelOpen)

Func _open_read_excel($FileExelOpen)
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook)
	_Excel_Close($oExcel)
	_ArrayDisplay($aResult)

	Local $iMaxY = UBound($aResult, 2);Количество столбцов
	Local $aTemp[0][$iMaxY];Временный массив НЕ пустых строк, пока "0" размера
	Local $iMax = 0
	For $i = 0 To UBound($aResult) - 1
		If $aResult[$i][1] <> "" Then ;Если значение не пустое, то во временный массив записываем данные
			$iMax += 1
			ReDim $aTemp[$iMax][$iMaxY]
			For $j = 0 To $iMaxY - 1 ;Запись всех столбцов во временный массив
				$aTemp[$iMax - 1][$j] = $aResult[$i][$j]
			Next
		EndIf
	Next
	$aResult = $aTemp
	_ArrayDisplay($aResult)
	Return $aResult
EndFunc   ;==>_open_read_excel
 
A

Alofa

Гость
maxd2007 сказал(а):
... тогда на выходе я получаю массив с тем количеством ячеек как был в прошлый раз
Не знаю, у меня все нормально работает (Win7x64, Office2010, Autoit v3.3.12.0).
Код:
#include <Excel.au3>
#include <Array.au3>

$FileExelOpen = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")

$aArray = _open_read_excel($FileExelOpen)
_ArrayDisplay($aArray)

Func _open_read_excel ($FileExelOpen) 
    Local $oExcel = _Excel_Open(False)
    Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
    Local $aResult = _Excel_RangeRead($oWorkbook)
    _Excel_Close($oExcel)
    Return $aResult
EndFunc

- Открыл рабочую книгу --> запустил скрипт --> получил массив 13 строк;
- Удалил три строки --> запустил скрипт --> получил массив 13 строк;
- Нажал на "сохранить" --> запустил скрипт --> получил массив 10 строк (пустых нет);
Все логично.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
но они пустые, вопрос: как сделать так что бы он не считал удаленные ячейки и не записывал их в массив?
В excel вы удаляете содержимое ячеек, а не сами ячейки. Удалив выделяя строки мышкой по самой левой кромке документа, вы не получите этой пустоты в массиве.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
OffTopic:
когда я удаляю ечейки из Excel (самостоятельно выделяю ненужные и нажимаю delete)
зачем самому удалять, у Вас в руках такой прекрасный инструмент, как AutoIt , пусть он всё делает за Вас , только расскажите ему , что нужно делать !
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Alofa сказал(а):
maxd2007 сказал(а):
... тогда на выходе я получаю массив с тем количеством ячеек как был в прошлый раз
Не знаю, у меня все нормально работает (Win7x64, Office2010, Autoit v3.3.12.0).
Код:
#include <Excel.au3>
#include <Array.au3>

$FileExelOpen = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")

$aArray = _open_read_excel($FileExelOpen)
_ArrayDisplay($aArray)

Func _open_read_excel ($FileExelOpen) 
    Local $oExcel = _Excel_Open(False)
    Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
    Local $aResult = _Excel_RangeRead($oWorkbook)
    _Excel_Close($oExcel)
    Return $aResult
EndFunc

- Открыл рабочую книгу --> запустил скрипт --> получил массив 13 строк;
- Удалил три строки --> запустил скрипт --> получил массив 13 строк;
- Нажал на "сохранить" --> запустил скрипт --> получил массив 10 строк (пустых нет);
Все логично.
У меня Win 8.1 x64, office 2013, AutoIt Version: 3.3.14.0, но проблема показана выше на скринах =(
 
A

Alofa

Гость
maxd2007 сказал(а):
У меня Win 8.1 x64, office 2013, AutoIt Version: 3.3.14.0...
ma:rofl:2007, а попробуйте эти библиотеки:
Так, в качестве эксперимента.
 

Вложения

  • Excel (v3.3.12.0).7z
    11.2 КБ · Просмотры: 8
  • Excel (v3.3.15.0).7z
    11.4 КБ · Просмотры: 12
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
Alofa сказал(а):
maxd2007 сказал(а):
У меня Win 8.1 x64, office 2013, AutoIt Version: 3.3.14.0...
ma:rofl:2007, а попробуйте эти библиотеки:
Так, в качестве эксперимента.
Если я Вас правильно понял (распаковать архив в "Include" с заменой, пробовал оба) и запустить
Код:
#include <array.au3>
#include <excel.au3>
#include <ExcelConstants.au3>

Global $aResult

$FileExelOpen = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel ($FileExelOpen)
_ArrayDisplay ($aResult)
Func _open_read_excel ($FileExelOpen)
    Local $oExcel = _Excel_Open(False)
    Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
    Local $aResult = _Excel_RangeRead($oWorkbook)
    _Excel_Close ( $oExcel )
    _ArrayDisplay ($aResult)
    Return $aResult
EndFunc

Результат тот же (см. картинку во вложении)
PS
ra4o спасибо большое все работает как надо =)


Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
maxd2007 сказал(а):
У меня Win 8.1 x64, office 2013, AutoIt Version: 3.3.14.0...
ma:rofl:2007, а попробуйте эти библиотеки:
Так, в качестве эксперимента.
Я думаю отличие заключается в том что Вы редактировали xls а у меня xlsx, щас проверил на xls изменений при удалении ячеек не происходит, а в xlsx если удалять ячейку происходит много изменений
 

Вложения

  • КоординатыEdit.png
    КоординатыEdit.png
    20 КБ · Просмотры: 18

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вариант удаления пустых значений из массива :
Код:
#include <array.au3>
#include <excel.au3>

$FileExelOpen = FileOpenDialog("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel($FileExelOpen)

Func _open_read_excel($FileExelOpen)
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook)
	_Excel_Close($oExcel)
	_ArrayDisplay($aResult)

	Local $iMax = UBound($aResult) - 1
	$i = 0
	Do

		If StringStripWS($aResult[$i][0],8) <> "" Then
			$i += 1
		Else
			_ArrayDelete($aResult, $i)
			$iMax -= 1
		EndIf

	Until $i > $iMax

	_ArrayDisplay($aResult)
	Return $aResult
EndFunc   ;==>_open_read_excel
или так :
Код:
#include <array.au3>
#include <excel.au3>

$FileExelOpen = FileOpenDialog("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel($FileExelOpen)

Func _open_read_excel($FileExelOpen)
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook)
	_Excel_Close($oExcel)
	_ArrayDisplay($aResult)

	$iMax = UBound($aResult) - 1
	For $i = 0 To $iMax
		If StringStripWS($aResult[$i][0], 8) = "" Then
			_ArrayDelete($aResult, $i)
			$i -= 1
			$iMax -= 1
		EndIf
		If $i=$iMax Then ExitLoop
	Next

	_ArrayDisplay($aResult)
	Return $aResult
EndFunc   ;==>_open_read_excel
то-же самое, только с "While"
Код:
#include <array.au3>
#include <excel.au3>

$FileExelOpen = FileOpenDialog("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
_open_read_excel($FileExelOpen)

Func _open_read_excel($FileExelOpen)
	Local $oExcel = _Excel_Open(False)
	Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
	Local $aResult = _Excel_RangeRead($oWorkbook)
	_Excel_Close($oExcel)
	_ArrayDisplay($aResult)

	$i = 0
	$iMax = UBound($aResult) - 1
	While $i <= $iMax
		If StringStripWS($aResult[$i][0], 8) = "" Then
			_ArrayDelete($aResult, $i)
			$i -= 1
			$iMax -= 1
		EndIf
		$i += 1
	WEnd

	_ArrayDisplay($aResult)
	Return $aResult
EndFunc   ;==>_open_read_excel
 
Верх