work.log

エンジニアの備忘録的ブログ

Spreadsheet::WriteExcel で数字の独自フォーマットを描画

投稿:2013-02-18 18:26  更新:

みんな大好き Excel ファイルを perl で書くメモ。

数字を 3 桁毎にカンマで区切って表示する方法。

add_format に num_format を設定する。こんな感じに。
フォーマットは Excel のユーザ定義を参照。

    my $format1 = $book->add_format(
                                     font   => $font_name,
                                     size   => $font_size,
                                     bold   => 1,
                                     border => 1,
                                     valign => 'vcenter',
                                     align  => 'right',
                                     num_format => '#,##0'
                                   );

追記したソース。

#!/usr/bin/perl

use strict;
use warnings;

use Spreadsheet::WriteExcel;

    my $file = "dir/perl.xls";
    my $font_name = 'MS UI Gothic';
    my $font_size = '11';

    my $book  = Spreadsheet::WriteExcel->new("$file");
    my $sheet = $book->add_worksheet();

    my $format0 = $book->add_format(
                                     font   => $font_name,
                                     size   => $font_size,
                                     bold   => 1,
                                     border => 1,
                                     valign => 'vcenter',
                                     align  => 'center'
                                   );

    my $format1 = $book->add_format(
                                     font   => $font_name,
                                     size   => $font_size,
                                     bold   => 1,
                                     border => 1,
                                     valign => 'vcenter',
                                     align  => 'right',
                                     num_format => '#,##0'
                                   );

    my $x = '0';
    my $y = '0';

    $sheet->merge_range( $x, $y, $x, $y + 5, "write start", $format0 );
    $x++;

    for (my $i = '0'; $i <= '5'; $i++ ) {

        for (my $j = '1'; $j <= '20'; $j++ ) {

            $sheet->write( $x, $y + $i, int( rand(5000) ), $format1 );
            $x++;

            if ( $j == '20' ) {

                my $abc = &column_abc( $y + $i );
                my $range = $abc . ($x - $j) . ":" . $abc . $x;
                my $excel_func = "=SUM($range)";

                $sheet->write( $x, $y + $i, $excel_func, $format1 );

            }
        }

        $x = '1';

    }

    $book->close();

sub column_abc {

    my $position = shift;

    my @abc = ( 'A'..'Z' );
    my ( $abc, $i, $j );

    if ( $position > '701' ) {

        $abc = "over";

    } elsif ( $position > '51' ) {

        $i = int( $position / 26 ) - 1;
        $j = $position - ( $i + 1 ) * 26;

        $abc = "$abc[$i]$abc[$j]";

    } elsif ( $position > '25' ) {

        $i = int( $position / 26 ) - 1;
        $j = $position - 26;

        $abc = "$abc[$i]$abc[$j]";

    } else {

        $i = $position;

        $abc = "$abc[$i]";

    }

    return( $abc );

}

exit;

これを実行するとこんなやつができます。

perl_excel3

数値は +/- どちらでもこの方法で対応できます。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間