2016-02-03 1 views
0

J'utilise le module Excel::Writer::XLSX et que vous souhaitez modifier l'alignement à droite et à gauche dans une feuille de calcul Excel sur la base du numéro de colonne:Comment puis-je changer le format d'écriture XLSX dynamiquement?

while(my $row = $csv->getline($fh)) { 
    my $col_num = 0; 
    my $format = $std_format; 
    foreach (@$row) { 
     if ($col_num < 2) { 
      print "col num $col_num, left\n"; 
      $format->set_align('left'); 
     } 
     else { 
      print "col num $col_num, right\n"; 
      $format->set_align('right'); 
     } 

     $worksheet->write($row_num, $col_num, $_, $format); 
     $col_num++; 
    } 
    $row_num++; 
} 

Cela ne fonctionne pas dans ma feuille de calcul de sortie. L'alignement ne peut être défini qu'une seule fois dans $std_format et il ne change pas.

+0

Il est bon de mentionner (ou même de lier à) la bibliothèque que vous utilisez. – choroba

Répondre

1

Vous ne pouvez pas simplement attribuer une nouvelle variable pour contenir le format requis. Chaque format différent doit être inscrite dans la feuille de calcul en utilisant add_format

Vous ne montrez pas assez de code pour moi d'être en mesure de voir ce que $std_format est, mais si vous avez créé correctement, vous pouvez alors utiliser copy pour cloner nouveau formats intégrés qui sont disponibles pour la modification

je suggère que vous écrivez quelque chose comme ça, ce qui ajoute deux variations de $std_format et choix que l'on à utiliser lorsque la cellule est écrit

my $std_left = $std_format->copy; 
$std_left->set_align('left'); 

my $std_right = $std_format->copy; 
$std_right->set_align('right'); 

my $row_num = 0; 
while (my $row = $csv->getline($fh)) { 

    my $col_num = 0; 
    for my $cell (@$row) { 

     my $format = $col_num < 2 ? $std_left : $std_right; 
     $worksheet->write($row_num, $col_num, $cell, $format); 

     $col_num++; 
    } 

    $row_num++; 
} 

Bien sûr, vous pouvez mettre la chose entière en un seul déclaration si c'est un style que vous aimez

$worksheet->write($row_num, $col_num, $cell, $col_num < 2 ? $std_left : $std_right); 
+0

Le problème est que j'ai deux couleurs d'arrière-plan pour alterner dans la feuille de calcul et aussi différentes frontières. Si je dois créer des formats uniques pour chaque combinaison de cellules spécifique (alignement, bordure, couleur d'arrière-plan), je finirais avec 20 variables différentes. –