使用Perl Win32 :: OLE从Excel工作表中获取超链接列表

我想更改Excel电子表格中一堆超链接的path。 在searchGoogle之后,我遇到了将超链接添加到电子表格的问题的解决scheme ,但没有改变它们。 微软在这里展示了如何与VBA接近。

由于我想编辑文档中的每个超链接,所以我不知道如何解决的关键步骤是:

  1. 获取Perl中超链接对象的列表

  2. 提取他们的地址1和1

  3. 运行正则expression式来改变path

  4. 将更新的path存储在超链接 – >对象中并重复

我是使用OLE的新手,正在被绊倒(1)。 这是我迄今为止所尝试的:

#!perl use strict; use warnings; use 5.014; use OLE; use Win32::OLE::Const "Microsoft Excel"; my $file_name = 'C:\path\to\spreadsheet.xlsx'; my $excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}); $excel->{Visible} = 1; my $workbook = $excel->Workbooks->Open($file_name); my $sheet = $workbook->Worksheets('Sheet 1'); foreach my $link (in $sheet->Hyperlinks ) { say $link->Address; } 

但是这给代码提供了错误:

Win32 :: OLE(0.1709):GetOleEnumObject()不在C:/Dwimperl/perl/vendor/lib/Win32/OLE/Lite.pm行的Win32 :: OLE :: Enum对象行。不能调用方法“超链接“在script.pl第14行没有包或对象引用。

这是select正确的工作表,所以我不知道为什么它抱怨的对象引用。 我尝试了几个变化(添加{}超链接,删除'在',试图将其存储为一个列表,作为一个散列,并作为一个哈希引用)任何人都可以给我一些指针? 谢谢!

首先,你应该设置$Win32::OLE::Warn=3这样你的脚本就会发生错误。 其次,我知道你不能在旧版本的Excel中按名称来select表单,尽pipe我不知道最新版本中的情况。 最后,我想你会发现使用Win32 :: OLE :: Enum更容易。

这里是一个例子:

 #!/usr/bin/env perl use 5.014; use warnings; use strict; use Carp qw( croak ); use Path::Class; use Try::Tiny; use Win32::OLE; use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Enum; $Win32::OLE::Warn = 3; my $book_file = file($ENV{TEMP}, 'test.xls'); say $book_file; my $excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}); $excel->{Visible} = 1; my $book = $excel->Workbooks->Open("$book_file"); my $sheet = get_sheet($book, 'Sheet with Hyperlinks'); my $links = $sheet->Hyperlinks; my $it = Win32::OLE::Enum->new($links); while (defined(my $link = $it->Next)) { my $address = $link->{Address}; say $address; if ($address =~ s/example/not.example/) { $link->{Address} = $address; $link->{TextToDisplay} = "Changed to $address"; } } $book->Save; $book->Close; $excel->Quit; sub get_sheet { my ($book, $wanted_sheet) = @_; my $sheets = $book->Worksheets; my $it = Win32::OLE::Enum->new($sheets); while (defined(my $sheet = $it->Next)) { my $name = $sheet->{Name}; say $name; if ($name eq $wanted_sheet) { return $sheet; } } croak "Could not find '$wanted_sheet'"; } 

该工作簿确实包含名为"Sheet with Hyperlinks"的工作表"Sheet with Hyperlinks" 。 该表中的单元格A1包含http://example.com包含http://stackoverflow.com