用Win32 :: OLE使用perl修改excel电子表格中的单元格范围

我想将一列数组中的值添加到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; 

上面的代码更新单元格B5:C6与(2,2,2),而不是(0,1,2,3),我无法弄清这个原因…我做错了什么?

文档示例传递一个数组引用 :

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

改变你的代码做同样的事情:

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

数字2可能来自@matrix的大小。

检查一下从单元格范围设置到一个值的数组,每个单元格设置一个值,一次一个单元格的速度提高:

处理时间:

 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 (ie 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;