簡體   English   中英

使用Perl Win32 :: OLE從Excel工作表獲取超鏈接列表

[英]Getting list of hyperlinks from an Excel worksheet with Perl Win32::OLE

我想在Excel電子表格中更改一堆超鏈接的路徑。 在搜索Google之后,我遇到了向電子表格添加超鏈接但不更改它們的問題的解決方案 微軟在這里展示了如何與VBA關系密切。

由於我想編輯文檔中的每個超鏈接,因此我不知道如何解決的關鍵步驟是:

  1. 獲取Perl中的超鏈接對象列表

  2. 逐個地提取他們的地址和

  3. 運行正則表達式以使路徑更改

  4. 將更新的路徑存儲在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.comA2包含http://stackoverflow.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM