Что нового

Определить открыт ли файл Excel

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Приведённый код открывает файл Excel Temp.xls, вносит необходимые изменения и сохраняет файл.

Код:
local $oExcel = _ExcelBookNew() ;Create new book, make it visible
_ExcelWriteSheetFromArray($oExcel, $aCoords, 1, 1, 0, 0) ;0-Base Array parameters
_ExcelBookSaveAs($oExcel, @ScriptDir & "\Temp.xls", "xls", 0, 1) ;


Но если Temp.xls уже открыт, то происходит ошибка:

C:\Program Files\AutoIt3\Include\Excel.au3 (356) : ==> The requested action with this object has failed.:
If $sPassword = "" And $sWritePassword = "" Then $oExcel.ActiveWorkBook.SaveAs($sFilePath, $sType, Default, Default, Default, Default, $iAccessMode, $iConflictResolution)
If $sPassword = "" And $sWritePassword = "" Then $oExcel.ActiveWorkBook.SaveAs($sFilePath, $sType, Default, Default, Default, Default, $iAccessMode, $iConflictResolution)^ ERROR

Как это обойти?
Как определить открыт ли уже файл Temp.xls?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Dreadfulangel
Как я понял ситуацию: если открыта книга temp.xls, то повторное ее открытие возможно в режиме "Только для чтения"...
Режим "Только для чтения" в функции _ExcelBookOpen() по умолчанию отключен, поэтому данная функция должна выдать ошибку при повторном открытии одного и того же файла, а она не выдает ошибку...
Возможно, баг... Требуется дополнительное исследование...
 
Автор
D

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
Если использовать _ExcelBookOpen, то если открыта книга temp.xls, то ее открытие происходит в режиме "Только для чтения".
При сохранении книги функцией _ExcelBookSaveAs выдаёт ошибку:

C:\Program Files\AutoIt3\Include\Excel.au3 (356) : ==> The requested action with this object has failed.:
If $sPassword = "" And $sWritePassword = "" Then $oExcel.ActiveWorkBook.SaveAs($sFilePath, $sType, Default, Default, Default, Default, $iAccessMode, $iConflictResolution)
If $sPassword = "" And $sWritePassword = "" Then $oExcel.ActiveWorkBook.SaveAs($sFilePath, $sType, Default, Default, Default, Default, $iAccessMode, $iConflictResolution)^ ERROR

При сохранении книги функцией _ExcelBookSave сохраняет книгу в "Мои Документы", что тоже не правильно.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Dreadfulangel
Вроде бы удалось через прямое обращение к объекту:

Код:
; НАЧАЛО

 $BOOK="Temp.xls"
 $PATH=@ScriptDir&"\"&$BOOK

 MsgBox(0,"",IsOpen($PATH))

; Функция возвращает 0, если книга не открыта
; Функция возвращает 1, если книга открыта

 Func IsOpen($PATH)
  $oExcel=ObjGet("","Excel.Application")
  if $oExcel=0 then Return 0
  $R=0
  for $element in $oExcel.Application.Workbooks
   if $element.FullName=$PATH Then $R=1
  next
  Return $R
 EndFunc

; КОНЕЦ
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Dreadfulangel
Ну или вот такой вариант "танцы с бубном" из того что есть :smile:
Код:
#include <Excel.au3>
$sName = "Temp.xls"
$sFilePath = @ScriptDir & "\" & $sName ;This file should already exist

If ProcessExists("excel.exe") Then
   If WinExists("Microsoft Excel - "&$sName) Then
      WinActivate("Microsoft Excel - "&$sName)
   EndIf
   Dim $iMsgBox
       $iMsgBox = MsgBox(266545,"Внимание!","Excel уже открыт и используется! Закрыть без сохранения и продолжить работу скрипта?")
    Select
      Case $iMsgBox = 1 ;OK
         ProcessClose("excel.exe")
      Case $iMsgBox = 2 ;Cancel
         Exit
   EndSelect
EndIf
$oExcel = _ExcelBookOpen($sFilePath)
   Local $aArray[5][2] = [["LocoDarwin", 1],["Jon", 2],["big_daddy", 3],["DaleHolm", 4],["GaryFrost", 5]] ;0-Base Array
_ExcelWriteSheetFromArray($oExcel, $aArray, 1, 1, 0, 0) ;0-Base Array
_ExcelBookSaveAs($oExcel, @ScriptDir & "\"&$sName, "xls", 0, 1) ;
 
Верх