如何在Perl中禁止Excel的密码提示?

时间:2009-02-20 09:43:01

标签: perl excel passwords

请告诉我一个禁止密码提示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 个答案:

答案 0 :(得分:5)

如果您知道密码,可以使用open命令的密码和/或writerespassword参数提供密码。如果以这种方式提供密码,Excel将不会提示输入密码。

如果您不知道密码但想要阻止显示对话框,则可以在这些参数中提供虚拟密码(例如,“ThisIsNotAPassword”)。我没有在文档中找到它,但在Excel 2003中进行了测试:

  • 如果Excel文件没有密码,则会打开它。
  • 如果它有密码(提供的除外),它不会要求用户输入密码,但会因您检测到错误而失败。

答案 1 :(得分:1)

您可以将以下vb代码转换为perl并试一试, 请注意,此代码适用于vbproject,类似于您可以检查工作表,单元格或整个工作表,方法相同。

如果活动文档中的VB项目受到保护,则

'返回TRUE '请不要

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方法 对象,需要12个参数。要打开具有密码保护的工作簿,您需要编写以下代码:

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

您也可以使用空参数检查perl。我不确定如何给...

答案 2 :(得分:0)

解决lakshmanaraj的想法,以及未知的回应:

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 )
     ;