Что нового

Как в Excel узнать кол-во строк и столбцов на листе используюя COM

pvnn

Осваивающий
Сообщения
305
Репутация
32
Excel беспорядочно заполнен данными
Необходимо узнать кол-во строк и столбцов на листе, но используя COM.

Нашел скрипт здесь: http://autoit-script.ru/index.php/topic,6147.0.html

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

Код:
$sFilePath = @ScriptDir & '\table.xls'
If Not FileExists($sFilePath) Then
    MsgBox(262208, 'Ошибка!', 'Файл отсутствует!')
    Exit
EndIf
$oExcel = ObjCreate('Excel.Application') ; создаем объект Excel
If Not IsObj($oExcel) Then
    MsgBox(262208, 'Ошибка!', 'Не удалось запустить Excel!')
    Exit
EndIf

$oExcel.Visible = False ; Excel будет невидим
$oExcel.WorkBooks.Open($sFilePath, Default, False)

With $oExcel.ActiveSheet
    ConsoleWrite('Используемых строк в таблице: ' & .UsedRange.Rows.Count & @CRLF)
    ConsoleWrite('Используемых колонок в таблице: ' & .UsedRange.Columns.Count & @CRLF)
EndWith

$oExcel.Application.Quit ; закрытие Excel
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
pvnn [?]
обязательно заполнена самая первая ячейка
Ну и заполните её, если надо
Код:
If $oExcel.ActiveSheet.Cells(1, 1).Value = "" Then $oExcel.ActiveSheet.Cells(1, 1) = " "

А это можно перед закрытием добавить, чтобы не спрашивал о сохранении
Код:
$oExcel.Application.DisplayAlerts = False
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
pvnn [?]
если другого решения не будет
Посмотрите в Excel.au3 реализацию функции
Код:
_ExcelReadSheetToArray()
там другое решение
Код:
...
	; Get size of current sheet as R1C1 string
	;     Note: $xlCellTypeLastCell and $x1R1C1 are constants declared in ExcelCOM_UDF.au3
	Local $sLastCell = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address(True, True, $xlR1C1)

	; Extract integer last row and col
	$sLastCell = StringRegExp($sLastCell, "\A[^0-9]*(\d+)[^0-9]*(\d+)\Z", 3)
	Local $iLastRow = $sLastCell[0]
	Local $iLastColumn = $sLastCell[1]

	; Return 0's if the sheet is blank
	If $sLastCell = "R1C1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET
...
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Есть данные, выгруженные в Excel. И эти файлы "кривенькие" _ExcelReadSheetToArray в них не работает, поэтому мне нужно именно через COM
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
pvnn [?]
нужно именно через COM
Я не предлагаю использовать эту функцию, я предлагаю посмотреть, как она реализована. Т.е. как в этой функции получают количество столбцов и строк (а получают их именно через COM). И перенести часть функции в свой код.
Хотя, с другой стороны, если у вас не работает функция целиком, скорее всего и её часть не будет работать.
Вот попробуйте
Код:
Global Const $xlCellTypeLastCell = 11
Global Const $xlR1C1 = -4150

$sFilePath = @ScriptDir & '\table.xls'
If Not FileExists($sFilePath) Then
    MsgBox(262208, 'Ошибка!', 'Файл отсутствует!')
    Exit
EndIf
$oExcel = ObjCreate('Excel.Application') ; создаем объект Excel
If Not IsObj($oExcel) Then
    MsgBox(262208, 'Ошибка!', 'Не удалось запустить Excel!')
    Exit
EndIf

$oExcel.Visible = False ; Excel будет невидим
$oExcel.WorkBooks.Open($sFilePath, Default, False)

$sLastCell = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address(True, True, $xlR1C1)
If $sLastCell = "R1C1" And $oExcel.Activesheet.Cells(1, 1).Value = "" Then
  ConsoleWrite('Пустой лист' & @CRLF)
Else
  $sLastCell = StringRegExp($sLastCell, "\A[^0-9]*(\d+)[^0-9]*(\d+)\Z", 3)
  ConsoleWrite('Используемых строк в таблице: ' & $sLastCell[0] & @CRLF)
  ConsoleWrite('Используемых колонок в таблице: ' & $sLastCell[1] & @CRLF)
EndIf

$oExcel.Application.Quit ; закрытие Excel
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Точно... так и сделаю, об этом как-то не подумал, Как попробую отпишусь.
Спасибо


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

InnI все заработало! Спасибо :IL_AutoIt_1:
 
Верх