【问题标题】:Help with Spreadsheet::WriteExcel perl电子表格帮助::WriteExcel perl
【发布时间】:2011-09-15 13:55:24
【问题描述】:

我很难找到让 Spreadsheet::WriteExcel 的 write_row/write_col 打印 Excel 工作表中的行的方法。

我有这种工作方法可以将它们打印为文本文件。但是将它们作为行/列写入excel工作表是我失败的地方。 我的 $com_sam 是这样的。它是一个多级哈希,它包含所有匹配的样本及其百分比作为键,以及它们与每个样本匹配的所有其他细节。(X3,X32,E32_P,E32_PL 是样本)



    'X3' => {
                                 '100.00' => [
                                               {
                                                 'NoofCalls' => 30,
                                                 'percent' => '100.00',
                                                 'NoofNs' => 0,
                                                 'match' => 30,
                                                 'sample' => 'X3'
                                               },
                                               {
                                                 'NoofCalls' => 30,
                                                 'percent' => '100.00',
                                                 'NoofNs' => 0,
                                                 'match' => 30,
                                                 'sample' => 'X32'
                                               },
                                               {
                                                 'NoofCalls' => 30,
                                                 'percent' => '100.00',
                                                 'NoofNs' => 0,
                                                 'match' => 30,
                                                 'sample' => 'E32_P'
                                               },
                                               {
                                                 'NoofCalls' => 30,
                                                 'percent' => '100.00',
                                                 'NoofNs' => 0,
                                                 'match' => 30,
                                                 'sample' => 'E32_PL'

                                               },

这是我尝试使用 WriteExcel 将它们打印到 excel 的代码。


    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 中得到这样的结果。 (当然不是逗号分隔:))


    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? 提前致谢

【问题讨论】:

  • $array_ref_log 似乎没有设置 - 这不可能是您运行以获得该输出的实际代码...?
  • 对不起,我已经评论过了。但是我运行脚本时没有注释。问题就在这一点上。这就是我努力发布整个脚本的原因。

标签: perl


【解决方案1】:

仅从这段代码很难判断问题出在哪里,但我可以提出一些建议。

首先是不要使用write_row(),因为它只是语法糖,而是使用你自己的for()循环和write()

第二个是,如果你使用write_row(),请确保你清楚它在嵌套数组引用中的行为方式。研究write_row documentation 中的示例,看看它是否符合您的期望。可能你需要write_col()

最后,这并不是真正的Spreadsheet::WriteExcel 问题,它更多地与数据结构的处理有关。您可以将 write* 函数替换为简单的 print() 语句,直到您确定已捕获需要捕获的数据,然后添加所需的 WriteExcel 函数。

【讨论】:

    【解决方案2】:

    要在 XLSX 文件中写入大量数据,可以使用 Excel_Writer_XLSX perl mudule。并且在 XLSX 中迭代打印数据非常简单,如下所示

         my@records = ( [ "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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多