[英]perl WIN32::OLE - HowTo move Excel Worksheet (or change position)
[英]Getting list of hyperlinks from an Excel worksheet with Perl Win32::OLE
我想在Excel電子表格中更改一堆超鏈接的路徑。 在搜索Google之后,我遇到了向電子表格添加超鏈接但不更改它們的問題的解決方案 。 微軟在這里展示了如何與VBA關系密切。
由於我想編輯文檔中的每個超鏈接,因此我不知道如何解決的關鍵步驟是:
獲取Perl中的超鏈接對象列表
逐個地提取他們的地址和
運行正則表達式以使路徑更改
將更新的路徑存儲在Hyperlink->對象中並重復
我是新手使用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第167行的Win32 :: OLE :: Enum對象。無法調用方法“超鏈接“在script.pl第14行沒有包或對象引用。
它正在選擇正確的工作表,所以我不確定它為什么抱怨對象引用。 我嘗試了幾種變體(在超鏈接周圍添加{},刪除'in',嘗試將其存儲為列表,作為哈希,以及作為哈希的引用)任何人都可以給我一些指示嗎? 謝謝!
首先,你應該設置$Win32::OLE::Warn=3
這樣你的腳本就會出現問題。 其次,我知道你不能在舊版本的Excel中按名稱選擇工作表,盡管我不知道最新版本中的內容是什么。 最后,我想你會發現使用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
和A2
包含http://stackoverflow.com
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.