Помощь с электронной таблицей :: WriteExcel perl - PullRequest
1 голос
/ 15 сентября 2011

Мне трудно найти способ записи write_row / write_col в Spreadsheet :: WriteExcel для печати строк в листе 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.


    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

Как работать с array_ref для write_row / write_col? Заранее спасибо

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Трудно сказать, в чем проблема только из этого фрагмента кода, но я могу сделать несколько предложений.

Во-первых, не используйте write_row(), поскольку это просто синтаксический сахар, и используйте вместо этого собственный цикл for() и write().

Во-вторых, если вы используете write_row(), убедитесь, что вы четко понимаете, как он ведет себя с ссылками на вложенные массивы. Изучите пример в документации write_row , чтобы убедиться, что он соответствует вашим ожиданиям. Возможно, вам нужен write_col().

Наконец, на самом деле это не проблема Spreadsheet :: WriteExcel , которая больше относится к обработке структуры данных. Вы можете заменить функцию write * простым оператором print() до тех пор, пока вы не будете уверены, что захватили данные, которые необходимо захватить, а затем добавили требуемую функцию WriteExcel.

0 голосов
/ 18 мая 2017

Чтобы записать большой набор данных в файл XLSX, можно использовать perl mudule Excel_Writer_XLSX. И очень просто перебрать и распечатать данные в 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++;
        }
    }   

Для получения дополнительной информации см. «Write_largeData_XLSX.pl» по этой ссылке https://github.com/AarthiRT/Excel_Writer_XLSX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...