Как я могу подавить запрос пароля Excel в Perl?

Подскажите, пожалуйста, решение для подавления запроса пароля к файлу 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;

person Pankaj    schedule 20.02.2009    source источник
comment
Возможно, вам лучше использовать ‹a href=search.cpan. org/dist/› и ‹a href=search.cpan.org/dist/› чем возиться с запуском копии Excel и возиться с OLE. Это было бы намного более портативным также.   -  person David Precious    schedule 20.02.2009


Ответы (3)


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

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

  • Если файл Excel не имеет паролей, он открывается.
  • Если у него есть пароли (кроме предоставленных), он не будет запрашивать пароль у пользователя, но выдаст ошибку, которую вы можете обнаружить.
person Renze de Waal    schedule 20.02.2009
comment
Так правильно ли следующее? my $xlBook = $xlApp->Workbooks->Open(D:\\Perl\\bin\\инструмент поиска\\test.xls,ThisIsNotAPassword); - person Pankaj; 20.02.2009
comment
Извините, это не сработает. Сигнатура открытого метода — Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, /* другие удалены */), вы можете найти это в справке по Excel vba ide. Вам нужно указать параметры по имени или предоставить все до и включая авторский пароль. - person Renze de Waal; 20.02.2009
comment
Вы имеете в виду следующее: Open(D:\\Perl\\bin\\search tool\\test.xls,Password =ThisIsNotAPassword); - person Pankaj; 20.02.2009
comment
Я не уверен, позволяет ли это Perl. Если это так, я имею в виду, что :-) Вам также необходимо предоставить WiteResPassword, потому что Excel позволяет использовать два разных пароля: для чтения и для редактирования. - person Renze de Waal; 20.02.2009
comment
Синтаксис vba будет открытым (имя файла:=(D:\\Perl\\bin\\инструмент поиска\\test.xls,Password:=ThisIsNotAPassword,WriteResPassword:=ThisIsNotAPassword) - person Renze de Waal; 20.02.2009
comment
Я не знаю Perl, но надеюсь, что мой $xlBook = $xlApp->Workbooks->Open(D:\\Perl\\bin\\search tool\\test.xls,0,0,1,ThisIsNotAPassword, Это не пароль); будет работать. Я выбрал значения параметров для UpdateLinks, ReadOnly и Format, которые, надеюсь, не повредят. - person Renze de Waal; 20.02.2009
comment
Perl использует хэш-ссылку для передачи именованных параметров. Попробуйте открыть (D:\\Perl\\bin\\инструмент поиска\\test.xls, {Password=›ThisIsNotAPassword,WriteResPassword=›ThisIsNotAPassword}) - person cjm; 20.02.2009
comment
Не могли бы вы указать, что пошло не так. Вы получаете сообщение об ошибке, Excel запускается, но диалоговое окно все равно появляется? Что происходит? - person Renze de Waal; 02.03.2009
comment
Если вы не используете WriteResPassword, тогда он работает. Новая проблема заключается в том, что файлы Excel открываются в фоновом режиме (невидимом). Мы узнаем об этом, когда открываем программное обеспечение Excel. Я пытался уничтожить объект, но он все равно открывается в фоновом режиме. - person Pankaj; 02.03.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

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

If ActiveWorkbook.ProtectWindows= True Then Exit sub

и так далее..

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

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

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

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

person lakshmanaraj    schedule 20.02.2009
comment
Как преобразовать код в Perl? Есть ли справочный документ? - person Pankaj; 20.02.2009
comment
Может быть $xlBook->Worksheets(1)->Protectstructure. А также я делаю то же самое в VB - person lakshmanaraj; 20.02.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 )
     ;
person Axeman    schedule 20.02.2009