The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

###############################################################################
#
# Example of how to add sparklines to an Excel::Writer::XLSX file.
#
# Sparklines are small charts that fit in a single cell and are
# used to show trends in data. This example shows the majority of
# options that can be applied to sparklines.
#
# reverse ('(c)'), November 2011, John McNamara, jmcnamara@cpan.org
#

use strict;
use warnings;
use Excel::Writer::XLSX;

my $workbook    = Excel::Writer::XLSX->new( 'sparklines2.xlsx' );
my $worksheet1  = $workbook->add_worksheet();
my $worksheet2  = $workbook->add_worksheet();
my $bold        = $workbook->add_format( bold => 1 );
my $str;
my $row = 1;

# Set the columns widths to make the output clearer.
$worksheet1->set_column( 'A:A', 14 );
$worksheet1->set_column( 'B:B', 50 );
$worksheet1->set_zoom( 150 );

# Headings.
$worksheet1->write( 'A1', 'Sparkline',   $bold );
$worksheet1->write( 'B1', 'Description', $bold );


###############################################################################
#
$str = 'A default "line" sparkline.';

$worksheet1->add_sparkline(
    {
        location => 'A2',
        range    => 'Sheet2!A1:J1',
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'A default "column" sparkline.';

$worksheet1->add_sparkline(
    {
        location => 'A3',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'A default "win/loss" sparkline.';

$worksheet1->add_sparkline(
    {
        location => 'A4',
        range    => 'Sheet2!A3:J3',
        type     => 'win_loss',
    }
);

$worksheet1->write( $row++, 1, $str );
$row++;


###############################################################################
#
$str = 'Line with markers.';

$worksheet1->add_sparkline(
    {
        location => 'A6',
        range    => 'Sheet2!A1:J1',
        markers  => 1,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Line with high and low points.';

$worksheet1->add_sparkline(
    {
        location   => 'A7',
        range      => 'Sheet2!A1:J1',
        high_point => 1,
        low_point  => 1,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Line with first and last point markers.';

$worksheet1->add_sparkline(
    {
        location    => 'A8',
        range       => 'Sheet2!A1:J1',
        first_point => 1,
        last_point  => 1,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Line with negative point markers.';

$worksheet1->add_sparkline(
    {
        location        => 'A9',
        range           => 'Sheet2!A1:J1',
        negative_points => 1,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Line with axis.';

$worksheet1->add_sparkline(
    {
        location => 'A10',
        range    => 'Sheet2!A1:J1',
        axis     => 1,
    }
);

$worksheet1->write( $row++, 1, $str );
$row++;


###############################################################################
#
$str = 'Column with default style (1).';

$worksheet1->add_sparkline(
    {
        location => 'A12',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with style 2.';

$worksheet1->add_sparkline(
    {
        location => 'A13',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
        style    => 2,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with style 3.';

$worksheet1->add_sparkline(
    {
        location => 'A14',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
        style    => 3,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with style 4.';

$worksheet1->add_sparkline(
    {
        location => 'A15',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
        style    => 4,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with style 5.';

$worksheet1->add_sparkline(
    {
        location => 'A16',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
        style    => 5,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with style 6.';

$worksheet1->add_sparkline(
    {
        location => 'A17',
        range    => 'Sheet2!A2:J2',
        type     => 'column',
        style    => 6,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Column with a user defined colour.';

$worksheet1->add_sparkline(
    {
        location     => 'A18',
        range        => 'Sheet2!A2:J2',
        type         => 'column',
        series_color => '#E965E0',
    }
);

$worksheet1->write( $row++, 1, $str );
$row++;


###############################################################################
#
$str = 'A win/loss sparkline.';

$worksheet1->add_sparkline(
    {
        location => 'A20',
        range    => 'Sheet2!A3:J3',
        type     => 'win_loss',
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'A win/loss sparkline with negative points highlighted.';

$worksheet1->add_sparkline(
    {
        location        => 'A21',
        range           => 'Sheet2!A3:J3',
        type            => 'win_loss',
        negative_points => 1,
    }
);

$worksheet1->write( $row++, 1, $str );
$row++;


###############################################################################
#
$str = 'A left to right column (the default).';

$worksheet1->add_sparkline(
    {
        location => 'A23',
        range    => 'Sheet2!A4:J4',
        type     => 'column',
        style    => 20,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'A right to left column.';

$worksheet1->add_sparkline(
    {
        location => 'A24',
        range    => 'Sheet2!A4:J4',
        type     => 'column',
        style    => 20,
        reverse  => 1,
    }
);

$worksheet1->write( $row++, 1, $str );


###############################################################################
#
$str = 'Sparkline and text in one cell.';

$worksheet1->add_sparkline(
    {
        location => 'A25',
        range    => 'Sheet2!A4:J4',
        type     => 'column',
        style    => 20,
    }
);

$worksheet1->write( $row,   0, 'Growth' );
$worksheet1->write( $row++, 1, $str );
$row++;


###############################################################################
#
$str = 'A grouped sparkline. Changes are applied to all three.';

$worksheet1->add_sparkline(
    {
        location => [ 'A27',          'A28',          'A29' ],
        range    => [ 'Sheet2!A5:J5', 'Sheet2!A6:J6', 'Sheet2!A7:J7' ],
        markers  => 1,
    }
);

$worksheet1->write( $row++, 1, $str );




###############################################################################
#
# Create a second worksheet with data to plot.
#

$worksheet2->set_column( 'A:J', 11 );

my $data = [

    # Simple line data.
    [ -2, 2, 3, -1, 0, -2, 3, 2, 1, 0 ],

    # Simple column data.
    [ 30, 20, 33, 20, 15, 5, 5, 15, 10, 15 ],

    # Simple win/loss data.
    [ 1, 1, -1, -1, 1, -1, 1, 1, 1, -1 ],

    # Unbalanced histogram.
    [ 5, 6, 7, 10, 15, 20, 30, 50, 70, 100 ],

    # Data for the grouped sparkline example.
    [ -2, 2,  3, -1, 0, -2, 3, 2, 1, 0 ],
    [ 3,  -1, 0, -2, 3, 2,  1, 0, 2, 1 ],
    [ 0,  -2, 3, 2,  1, 0,  1, 2, 3, 1 ],


];

# Write the sample data to the worksheet.
$worksheet2->write_col( 'A1', $data );


__END__