簡體   English   中英

使用perl和Win32 :: OLE修改Excel電子表格中的單元格范圍

[英]modify a range of cells in an excel spreadsheet using perl with Win32::OLE

我想在Excel電子表格中將一系列數組中的值添加到一系列單元格中; 我寫了以下內容但它失敗了:

use Win32::OLE;
use Cwd;

eval {$excel = Win32::OLE->GetActiveObject('Excel.Application')};
die "Excel not installed" if $@;
unless (defined $excel) 
{
    $excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
    or die "Oops, cannot start Excel";
}

$workbook = $excel->Workbooks->Open(getcwd() . "/test.xlsx");
$worksheet = $workbook->Worksheets(1);
@matrix = ( [0, 1], [2, 3] );

$worksheet->Range("B5:C6")->{Value} = @matrix;

$worksheet->Save;

上面的代碼用(2,2,2,2)而不是(0,1,2,3)更新單元格B5:C6,我無法弄清楚這個的原因......我做錯了什么?

文檔示例傳遞數組引用

$sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ],
                                   [ 42,    'Perl',  3.1415  ]];

更改您的代碼以執行相同的操作:

$worksheet->Range("B5:C6")->{Value} = \@matrix;

數字2可能來自@matrix的大小。

檢查我從設置一系列單元格到一系列值得到的速度改進,並將每個單元格設置為一個值,每次1個單元格:

處理時間:

start 29:29 to stop 31:41    = 2 min, 12 sec    (The SLOW WAY)  
start 19:55 to stop 20:33    = 0 min, 38 sec    (The SPEEDY WAY) 

那是132秒對38秒

碼:

use Win32::OLE; 
$EXCEL = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit; print "MS-Excel is shutting 
down.\n"; sleep 2;}); 
$EXCEL->{SheetsInNewWorkbook} = 1; 
$BOOK       = $EXCEL->Workbooks->Add(); 
$SHEET      = $BOOK->Worksheets(1);

$SHEET->Range( "A1" )->{Value} = "Book"; 
$SHEET->Range( "B1" )->{Value} = "Chapter";
$SHEET->Range( "C1" )->{Value} = "Verse";
$SHEET->Range( "D1" )->{Value} = "Text"; 

$start=1; $stop=66; 
$row=1;   $cnt=0;

@worksheet_array=();

#-- Process the MS-Access database (ODBC connection), SQL Query Result Set, 
#-- which selected all Bible verses from Books 1-66 (i.e. Genesis thru Revelation).

while ($db->FetchRow()) {  
   $row++;   $cnt++;  
    if (($cnt % 1000) == 0) { 
       print "Processed ($cnt Verses from the Bible Database: Books ($start-$stop) of 66\n";
    } 

   $worksheet_array[$row-2][0] = $book        = $db->Data("book");   
   $worksheet_array[$row-2][1] = $chapter     = $db->Data("chapter");
   $worksheet_array[$row-2][2] = $verse       = $db->Data("verse"); 
   $worksheet_array[$row-2][3] = $verse_text  = $db->Data("verse_text"); 

   print OUT "$book|$chapter|$verse|$verse_text\n";  #-- This output goes to a text (*.txt) file

   #-- The Too Slow Way!  Write data 1 cell at a time.
   #  $SHEET->Range( "A$row" )->{Value} = $book; 
   #  $SHEET->Range( "B$row" )->{Value} = $chapter; 
   #  $SHEET->Range( "C$row" )->{Value} = $verse;
   #  $SHEET->Range( "D$row" )->{Value} = $verse_text; 
}

一次寫下所有數據......快速的方式!

$SHEET->Range( "A2:D$row" )->{Value} = \@worksheet_array;   #-- $row = 31102 (total nbr verses)
$SHEET->Columns("A")->AutoFilter; 
$SHEET->Columns( "A:D" )->AutoFit(); 
$EXCEL->Windows(1)->{SplitRow}    = 1;
$EXCEL->Windows(1)->{FreezePanes} = 1;
$BOOK->SaveAs($excel97outputfile_dot_xls);
$BOOK->Close();       sleep 1;   
$EXCEL->Quit;         sleep 1;
undef $BOOK;  undef $EXCEL;

暫無
暫無

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

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