2015-10-05 76 views
0

在Win32 :: OLE模塊中使用Perl我試圖將表插入到Microsoft Word文檔中,然後修改列寬。我可以毫無困難地插入表格,但修改列寬變得更加困難。創建宏,並試圖將VBA翻譯成Perl中後,這裏是我有:如何使用Perl修改Word表格的列寬?

my $word = Win32::OLE->new('Word.Application', sub {$_[0]->Quit;}); 
my $doc = $word->Documents->Open('myfile.doc'); 

### Code to find and select a tag to replace with a table goes here ### 

my $table = $doc->Tables->Add($word->Selection->Range, 4, 4); 
$table->Columns(1)->{PreferredWidthType} = wdPreferredWidthPoints; 
$table->Columns(1)->{PreferredWidth} = 200; 

不幸的是這給在最後兩行「不能用一個未定義的值作爲散列引用」錯誤。我已經嘗試了其他幾種變體,但都沒有奏效,谷歌也沒有幫助。我真的很感謝有關如何做到這一點的答案。

謝謝。

+0

我建議使用'Data :: Dumper'來打印'$ table - > Columns(1)',因爲這個錯誤意味着'Columns(1)'是未定義的。 – Sobrique

+1

@Sobrique,注意:如果在OLE對象上使用Data :: Dumper *確保*設置了'$ Data :: Dumper :: MaxDepth' - 特別是在處理Microsoft應用程序對象時,通常每個對象都有指向到包含所有內容的Application對象。 Win32 :: OLE默認情況下不會生成唯一的對象,並且會簡單地使用內存重新創建同一個Application對象,並再次重新創建。 – Axeman

+0

你也可以在加載模塊時指定'_Unique':http://search.cpan.org/~jdb/Win32-OLE-0.1712/lib/Win32/OLE.pm#_Unique – Axeman

回答

0

一些試驗和錯誤之後,我發現,這做的工作:

$table->Rows(1)->Select; 
$word->Selection->Columns(1)->{Width} = 200; 

這足以調整隻是行1列,受此影響所有其他行。當你知道如何時很容易!