Raku Land

Spreadsheet::Libxlsxio

cpan:FRITH

Actions Status

NAME

Spreadsheet::Libxlsxio - An interface to libxlsxio, a C library to read and write XLSX files

SYNOPSIS

use Spreadsheet::Libxlsxio;
use Spreadsheet::Libxlsxio::Constants;

my @values;

my $ss = Spreadsheet::Libxlsxio::Read.new: 'mydata.xlsx';
$ss.sheet-list(-> $name {
  @values.push: "[$name]";
  $ss.process: $name,
               -> $, $, $value { @values.push: $value with $value; XLSXIOREAD_CONTINUE },
               -> $, $ { XLSXIOREAD_CONTINUE }
});

# Do something with @values

DESCRIPTION

Spreadsheet::Libxlsxio is an interface to libxlsxio, a C library to read and write XLSX files

libxlsxio is a fast C library released under the terms of the MIT License. It has a nice API, which translates easily using Raku pointy blocks (or closures, or lambdas).

Please check the limitations of this library here: https://brechtsanders.github.io/xlsxio/.

This module exports two classes:

The Read class offers two ways to read an XLSX file:

The Write class has methods for writing one row at the time, cell after cell, with no random access to a single cell.

Spreadsheet::Libxlsxio::Read

new(Str $file!)

new(Str :$file!)

new(Buf $data!)

new(Buf :$data!)

This multi method constructor requires one simple or named argument, the file name or the Buf variable into which the spreadsheet data has been read.

version(--> Str)

This method returns the C library version as a Str or a List, if evaluated in a List context.

my $ss = Spreadsheet::Libxlsxio::Read.new: :file('mydata.xlsx');
my $version = $ss.version;
say $version;      # '0.2.29'
say $version.List; # (0 2 29)

Methods to iterate through worksheets, rows, and cells

sheetlist-open(--> xlsxioreadersheetlist)

This method opens the worksheet list. It return the worksheet list handler.

sheetlist-next(xlsxioreadersheetlist $sheetlisthandler --> Str)

This method accepts a worksheet list handler and returns the name of the next available worksheet.

For example:

my $ss = Spreadsheet::Libxlsxio::Read.new: :file('mydata.xlsx');
my $sl = $ss.sheetlist-open;
while $ss.sheetlist-next($sl) -> $sheetname { say $sheetname }
$ss.sheetlist-close($sl);

sheetlist-close(xlsxioreadersheetlist $sheetlisthandler)

Closes the worksheet list handler.

sheet-open(Str :$name, Int :$flag = XLSXIOREAD_SKIP_EMPTY_ROWS --> xlsxioreadersheet)

Opens a worksheet by name. The flag values are defined in the Spreadsheet::Libxlsxio::Constants module:

This method returns a handler to the specified worksheet.

sheet-close(xlsxioreadersheet $sheet)

This method takes the worksheet handler and closes the worksheet.

sheet-flags(xlsxioreadersheet $sheet --> UInt)

This method takes the worksheet handler and returns the flags set when opening the worksheet.

last-row-read(xlsxioreadersheet $sheet --> UInt)

This method takes the worksheet handler and returns the index of the last row read.

last-column-read(xlsxioreadersheet $sheet --> UInt)

This method takes the worksheet handler and returns the index of the last column read.

next-cell(xlsxioreadersheet $sheet --> Str)

This method takes the worksheet handler and returns the value of the last cell read, or a false value if there are no more cells available in the current row.

next-row(xlsxioreadersheet $sheet --> UInt)

This method takes the worksheet handler and gets the next row, or a false value if there are no more rows available.

This method must be called before each row.

Methods that use callback functions for each cell and after each row

sheet-list(&callback)

This method sets a callback to be called on each worksheet.

The callback function receives the worksheet name. The actual processing can be done by the following method.

process(Str $sheetname, &cell-callback, &row-callback, UInt :$flags = XLSXIOREAD_SKIP_EMPTY_ROWS --> Int)

This method processes all rows and columns of a worksheet in a XLSX file.

It takes the sheet name, two callback functions and a flag and returns zero on success or non-zero on error. The first callback is called when a cell value is available; it receives three arguments: the row, the column, and the value contained in the cell. It must return one of these two values, available defined in the Spreadsheet::Libxlsxio::Constants module:

The second callback is called after each row; it receives two arguments: the row number (starting from 1) and the maximum column number on the row (starting from 1).

For example one might use both the previous methods to scan the entire spreadsheet:

my $ss = Spreadsheet::Libxlsxio::Read.new: 't/test.xlsx';

my @values;

$ss.sheet-list(-> $name {
  note "Processing worksheet [$name]";
  $ss.process: $name,
               -> $, $, $value { @values.push: $value with $value; XLSXIOREAD_CONTINUE },
               -> $, $ { XLSXIOREAD_CONTINUE }
});

dd @values;

NOTE

All the cell values are returned as Str. A helper sub is provided to convert a date cell to a Raku DateTime object:

sub to-date(Str() $value --> DateTime)

Spreadsheet::Libxlsxio::Write

use Spreadsheet::Libxlsxio;

my $ss = Spreadsheet::Libxlsxio::Write.new: :file('mydata.xlsx'), :sheet('Sheet1');
$ss.detection-rows(10)
   .row-height(10)
   .add-column('Col1', 16)
   .add-column('Col2', 0)
   .add-column('Col3', 0)
   .add-column('Col4', 0)
   .write-row;
my $dt = DateTime.new('2021-07-25T00:00:00').Instant.to-posix[0];
for ^10 -> $i {
  $ss.add-string("Test$i").add-int($i).add-num(π).add-datetime($dt).write-row;
}
$ss.close;

new(Str $file!, Str $sheet?)

new(Str :$file, Str :$sheet)

This multi method constructor requires two simple or named arguments: the file name and the worksheet name.

close

This method closes the spreadsheet file.

version(--> Str)

This method returns the C library version as a Str or a List, if evaluated in a List context.

my $ss = Spreadsheet::Libxlsxio::Write.new: :file('mydata.xlsx');
my $version = $ss.version;
say $version;      # '0.2.29'
say $version.List; # (0 2 29)

All the following methods return their object, so they may be chained.

detection-rows(UInt $rows --> Spreadsheet::Libxlsxio::Write)

This method specifies how many initial rows will be buffered in memory to determine column widths.

row-height(UInt $height --> Spreadsheet::Libxlsxio::Write)

This method specifies the row height in text lines to use for the current and next rows.

add-column(Str $name, UInt $width --> Spreadsheet::Libxlsxio::Write)

This method adds a column label cell. It takes two arguments: the label and the column width in characters. It must be called for each column; the row is committed by calling the write-row method.

write-row(--> Spreadsheet::Libxlsxio::Write)

This method marks the end of a row.

add-string(Str() $value --> Spreadsheet::Libxlsxio::Write)

This method adds a cell containing Str data.

add-int(Int() $value --> Spreadsheet::Libxlsxio::Write)

This method adds a cell containing Int data.

add-num(Num() $value --> Spreadsheet::Libxlsxio::Write)

This method adds a cell containing Num data.

add-datetime(DateTime() $value --> Spreadsheet::Libxlsxio::Write)

This method adds a cell containing DateTime data.

Installation

To use this module one has to install the libxlsxio C library first.

The library home page is here: https://brechtsanders.github.io/xlsxio/ and the GitHub project page is https://github.com/brechtsanders/xlsxio.

The C library has two dependencies: expat (available as libexpat1 on Ubuntu and Debian Linux systems) and one of minizip or libzip (libminizip1 and libzip5 on Ubuntu or Debian Linux systems).

Installing the library is as simple as typing:

sudo make install
sudo ldconfig

To install the Raku module using zef (a module management tool):

$ zef install Spreadsheet::Libxlsxio

AUTHOR

Fernando Santagata nando.santagata@gmail.com

COPYRIGHT AND LICENSE

Copyright 2021 Fernando Santagata

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.