2013-02-11 83 views
1

我正在通過Win32::OLE以自動化的方式在Perl中創建Word文檔。我當前的代碼看起來是這樣的,它的離開WINWORD.EXE的情況下,內存:在Perl中編寫OLE代碼的簡潔方法?

my $range = $select->Range; 
my $table = $doc->Tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    for my $colnum (0 .. $#{ $rows[$rownum] }) { 
     my @cellpos = ($rownum + 1, $colnum + 1); 
     my $data = $rows[$rownum][$colnum]; 
     $table->Cell(@cellpos)->Range->{'Text'} = $data; 
     1; 
    } 
} 

不過,如果我是重構每Microsoft recommendation for Visual Studio .NET我的代碼,它應該是這樣的:

my $range = $select->Range; 
my $tables = $doc->Tables; 
my $table = $tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    for my $colnum (0 .. $#{ $rows[$rownum] }) { 
     my @cellpos = ($rownum + 1, $colnum + 1); 
     my $data = $rows[$rownum][$colnum]; 
     my $cell = $table->Cell(@cellpos); 
     my $cell_range = $cell->Range; 
     $cell_range->{'Text'} = $data; 
    } 
} 

這段代碼可以完成這項工作,但它對我來說非常「嘈雜」。有沒有更乾淨的方法來做到這一點?

回答

1

它可以稍微改善。不需要變量@cellpos$data變量,並且在內循環內使用提取對@rows的當前元素的引用更爲整齊。

my $range = $select->Range; 
my $tables = $doc->Tables; 
my $table = $tables->Add($range, scalar @rows, scalar @{ $rows[0] }); 
for my $rownum (0 .. $#rows) { 
    my $cols = $rows[$rownum]; 
    for my $colnum (0 .. $#$cols) { 
     my $cell = $table->Cell($rownum + 1, $colnum + 1); 
     my $cell_range = $cell->Range; 
     $cell_range->{Text} = $cols->[$colnum]; 
    } 
} 
相關問題