【问题标题】:How can I suppress Excel's password prompt in Perl?如何在 Perl 中禁止 Excel 的密码提示?
【发布时间】:2023-04-15 05:26:01
【问题描述】:

请告诉我一个抑制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;

【问题讨论】:

标签: perl excel passwords


【解决方案1】:

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

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

  • 如果 Excel 文件没有密码,则会打开它。
  • 如果它确实有密码(除了提供的密码),它不会要求用户输入密码,但会失败并显示您可以检测到的错误。

【讨论】:

  • 那么下面的说法正确吗?我的 $xlBook = $xlApp->Workbooks->Open("D:\\Perl\\bin\\search tool\\test.xls","ThisIsNotAPassword");
  • 抱歉,这行不通。 open方法的签名是Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, /* others deleted */),这个可以在Excel vba ide的帮助中找到。您需要按名称指定参数或提供所有内容,包括 writerespassword。
  • 你的意思是这样的:Open("D:\\Perl\\bin\\search tool\\test.xls",Password ="ThisIsNotAPassword");
  • 我不确定 Perl 是否允许这样做。如果是这样,我的意思是:-) 您还需要提供 WiteResPassword,因为 Excel 允许使用两个不同的密码,用于阅读和编辑。
  • vba 语法将打开(Filename:=("D:\\Perl\\bin\\search tool\\test.xls",Password:="ThisIsNotAPassword",WriteResPassword:=" ThisIsNotAPassword")
【解决方案2】:

你可以把下面的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表格

工作簿的打开方法 对象,接受 12 个参数。要打开带有密码保护的工作簿,您需要编写以下代码:

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

你也可以用 perl 来检查空参数。我不知道怎么给...

【讨论】:

  • 如何将代码转换为 Perl ?有帮助文档吗?
  • 可能是 $xlBook->Worksheets(1)->Protectstructure 。我也在 VB 中做同样的事情
【解决方案3】:

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

【讨论】: