Как я могу подавить запрос пароля Excel в Perl? - PullRequest
2 голосов
/ 20 февраля 2009

Подскажите, пожалуйста, решение для подавления запроса пароля к файлу Excel.

    use Win32::OLE;

      my $xlApp = Win32::OLE->new('Excel.Application');

      $xlApp->{Visible} = 0;

      $xlApp->{DisplayAlerts} = 0;

      # Open excel file.
      my $xlBook = $xlApp->Workbooks->Open("C:\\Documents and Settings\\username\\Desktop\\testfile.xls");
      my $Sheet1 = $xlBook->Worksheets(1);

        my $row = 1;
        my $col = 1;

       $Sheet1->Cells($row,$col)->{'Value'} = 5;

        if (Win32::OLE->LastError) 
        {
                print "File protected";
        }

      $xlBook ->Close();

  undef $xlBook;

Ответы [ 3 ]

5 голосов
/ 20 февраля 2009

Если вы знаете пароли, вы можете указать их в аргументах пароля и / или writerespassword команды open. Excel не будет запрашивать пароли, если они введены таким образом.

Если вы не знаете пароли, но хотите запретить отображение диалогового окна, вы можете указать фиктивные пароли в этих параметрах (например, «ThisIsNotAPassword»). Я не нашел этого в документации, но проверил это в Excel 2003:

  • Если файл Excel не имеет паролей, он открывается.
  • Если у него есть пароли (отличные от поставляемых), он не будет запрашивать пароль у пользователя, но потерпит неудачу с обнаруженной ошибкой.
1 голос
/ 20 февраля 2009

Вы можете преобразовать следующий код VB в Perl и попробовать, Обратите внимание, что этот код предназначен для vbproject, аналогично, вы можете проверять таблицы, ячейки или весь лист аналогичным образом.

'возвращает TRUE, если проект VB в активном документе защищен «Пожалуйста, не

Function ProtectedVBProject(ByVal wb As Workbook) As Boolean

Dim VBC As Integer

  VBC = -1

  On Error Resume Next

  VBC = wb.VBProject.VBComponents.Count

  On Error GoTo 0

  If VBC = -1 Then

    ProtectedVBProject = True

  Else

    ProtectedVBProject = False

  End If

End Function

Пример:

If ProtectedVBProject(ActiveWorkbook) Then Exit Sub

Для рабочего листа

If ActiveWorkbook.ProtectStructure=True  Then Exit Sub

Для активной рабочей книги Windows

If ActiveWorkbook.ProtectWindows= True Then Exit sub

и т. Д.

Или Вы можете открыть лист Excel с паролем

Открытый метод для Workbook объект, принимает 12 аргументов. Чтобы открыть книгу с защитой паролем, вам нужно написать следующий код:

 Workbooks.Open "Book1.xls", , , ,"pswd"

Вы можете также проверить с помощью perl пустые аргументы. Я не уверен, как дать ...

0 голосов
/ 20 февраля 2009

Отработка идеи Лакшманараджа и неизвестного ответа:

use Win32::OLE;

sub is_protected_vb_project { 
    my $work_book = shift;
    eval { 
        my $count = $work_book->{VBProject}{VBComponents}{Count};
    };
    Carp::carp $@ if $@;
    return $@ ? 1 : 0;
}

my $work_book = Win32::OLE->GetObject( 'd:/some/path/somewhere.xls' );
printf "is_protected_vb_project( \$work_book )=%s\n"
     , is_protected_vb_project( $work_book )
     ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...