2011-09-15 14 views
1

Excelシートの行を印刷するために、Spreadsheet :: WriteExcelのwrite_row/write_colを取得するのに苦労しています。Spreadsheet :: WriteExcel perlのヘルプ

私は、この作業方法をテキストファイルとして印刷しています。しかし、行/列としてそれらをExcelシートに書き込むことは、私が失敗しているところです。 My $ com_samはこれに似ています。一致するすべてのサンプルとそのパーセンテージをキーとして保持し、各サンプルとの一致の他のすべての詳細を保持するマルチレベルハッシュですか?(X3、X32、E32_P、E32_PLはサンプルです)

WriteExcelを使用してそれらを印刷しようとしたときのコードです。


    foreach my $percent (sort { $b $a } keys %{ $com_sam->{ $s1 } }){ 
    249 
    250  my $match_samples = $com_sam->{ $s1 }->{ $percent }; 
    251 
    252  foreach my $matSam(@ { $match_samples }){ 
    253  if(($s1 ne $matSam->{ sample }) and ($matSam->{ percent } >= $top_percent)) { 
    254 
    255   next if compare($s1, $matSam->{sample}); 
    256 #   print "****,$s1,$matSam->{ sample },$matSam->{ percent },$top,$top_percent,$matSam->{ NoofCalls },$matSam->{ match }, $matSam->{ NoofNs },****\n" ; 
    257   push @$log_array,($s1,$matSam->{ sample },$matSam->{ percent },$top,$top_percent,$matSam->{ NoofCalls },$matSam->{ match }, $matSam->{ NoofNs }); 
    258   push @$array_ref_log, @$log_array; 
    259   for my $col (0 ..7) { 
    260 
    261    for my $row (1 .. scalar(@sam2com)) { 
    262 
    263     $worksheet->write_row($row,$col,$array_ref_log);#Wat I get with this is just a single sample compared rather than all the sample. 

    264    } 
    265 
    266 
    267   } 
    268  }else{ 
    269 
    270   my $total_calls = $matSam->{ NoofCalls } + $matSam->{ NoofNs }; 
    271 
    272   my $l = sprintf "%s, %s, %0.2f, %s, %0.2f,%s,%s,%s", $s1, $matSam->{ sample }, $matSam->{ percent }, $top, $top_percent,$matSam->{ NoofCalls },$matSam->{ match }, $matSam->{ NoofNs } ; 
    273 
    274   if($total_calls == 97) { 
    275 
    276 #   print "$l\n" if ($matSam->{ NoofNs } { NoofNs } sample 
    287 }#end of percentage foreach loop 

私はこの


    X3,X3,100.00,X3,100.00,30,30, 0 
    X3,X32_P,100.00,X3,100.00,30,30, 0 
    X3,E32,100.00,X3,100.00,30,30, 0 

のような結果を見たいのではなく、私はExcelでこのようにそれを得ます。 (:)コンマ区切りではないofcourseの)


    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 
    X3,X32,100.00,X3,100.00,30,30, 0,X3,X32_P,100.00,X3,100.00,30,30, 0,X3,E32,100.00,X3,100.00,30,30, 0 

はどのようにwrite_row/write_colためarray_refに取り組んですべきですか? ありがとうございます

+0

'$ array_ref_log'は設定されていないようです。実際に出力するために実行したコードは...? – plusplus

+0

申し訳ありませんが、私はそれをコメントしました。しかし、私はスクリプトを実行してコメントを外された。問題はちょうどこのビットにあります。だからこそ、私はスクリプト全体を投稿するのです。 – kutipi

答えて

1

このコードスニペットの問題点は分かりませんが、私はいくつかの提案をすることができます。

最初は文法的なもので、代わりにfor()ループとwrite()を使用するので、最初はwrite_row()を使用しません。

もう1つは、write_row()を使用する場合は、ネストされた配列の参照でどのように動作するかを明確にしてください。 write_row documentationの例を調べて、それがあなたの期待に合っていることを確認してください。代わりにwrite_col()が必要な場合があります。

最後に、これは実際にはSpreadsheet::WriteExcelという問題ではなく、データ構造の処理に関連しています。キャプチャする必要のあるデータをキャプチャしてから、必要なWriteExcel関数を追加するまで、write *関数を単純な0​​文で置き換えることができます。

0

XLSXファイルに大量のデータを書き込むには、Excel_Writer_XLSX perl muduleを使用できます。そして、

 [email protected] = ([ "10001", "1/5/2011", "Jan", "Midwest", "Ami", "Binder", "94", "20" ], 
        [ "10002", "1/13/2011", "May", "West Coast", "Stevenson", "Pencil", "3", "275" ], 
        [ "10051", "2/24/2011", "Nov", "Midwest", "Jones", "Desk", "35", "4.99" ], 
        [ "10086", "3/7/2011", "Apr", "New England", "Andrews", "Pen Set", "16", "20" ], 
        [ "10450", "4/10/2011", "Dec", "Midwest", "Adams", "Ball", "20", "57.2" ], 
        [ "16001", "7/19/2011", "Mar", "West Coast", "Thompson", "Note Book", "28", "33.5" ], 
        [ "19565", "6/23/2011", "Jul", "Midwest", "Dwyer", "Scale", "15", "16" ], 
        [ "20048", "6/15/2011", "Oct", "Midwest", "Morgan", "Stickers", "96", "12" ], 
        [ "50962", "2/7/2011", "Feb", "New England", "Howard", "Clips", "52", "5.5" ],); 

my $workbook  = Excel::Writer::XLSX->new($outputFile); 
$workbook->set_optimization(); 
my $worksheet = $workbook->add_worksheet('Test'); 
my $row   = 0; 
my $col   = 0; 
foreach my $record (@records){ 
     $row++; 
     $col = 0; 

     foreach my $data (@{$record}){ 
      $worksheet->write($row,$col,$data);  
      $col++; 
     } 
    } 

は、詳細については、このリンク https://github.com/AarthiRT/Excel_Writer_XLSXから「Write_largeData_XLSX.pl」を参照してください、次のようにXLSXでデータを反復して印刷するには非常に簡単です。

関連する問題