I am currently finishing up a hack to extract objects from a
spreadsheet, tentatively called Spreadsheet::Table::Extract.  Here's the
summary:

    =head1 SYNOPSIS

        # say we have a checkbook with five columns that we want to
        # turn into a set of Checkbook::Entry objects:
        my $slot_from_heading = {
                # column      => object slot name
                'number'      => 'check_no',
                'date'        => 'date_days',
                'description' => 'description',
                'descr.'          => 'description',     # synonym
                'payment'     => 'payment_value',
                'deposit'     => 'deposit_value'
        };

        use Spreadsheet::Table::Extract;
        use Spreadsheet::Read;
        use Checkbook::Entry;   # for example

        my $book = ReadData('some-spreadsheet.xlsx');
        my $sheet1 = $book->[1];
        my @tables = Spreadsheet::Table::Extract->find_tables
            ($sheet, $slot_from_heading,
             validate_object => Checkbook::Entry->can('validate'));
        # assume we have only one table; if there are multiple heading
        # rows, there could be several.
        my @entries = $checkbook_table->extract($tables[0]);
        say "have ", scalar(@entries), " checkbook transactions.";

    =head1 DESCRIPTION

    C<Spreadsheet::Table::Extract> identifies subsets of spreadsheets
    and/or CSV files read with C<Spreadsheet::Read> that are conceptually
    equivalent to database tables.  Each such table is found by looking
    for its heading row(s) in the spreadsheet, and results in a
    C<Spreadsheet::Table::Extract> instance.  The instance can then
    extract the table into an arrayref of objects of a designated object
    class.  Multiple tables of different types can be combined side by
    side or above one another on the same sheet.

    The full process goes like this:

    =over

    =item 1.

    Call L</find_tables> to extract table definitions from a sheet,
    passing it a hashref that tells it how to identify the heading row.
    Do this once for each combination of sheet and table type.

    =item 2.

    Call L</make_disjoint> on all tables to adjust their boundaries for
    potential overlap.

    =item 3.

    Call L</extract> on each table to produce a list of objects of the
    desired application class.

    =back

(If you want to see it all, it's at
https://git.sr.ht/~rgrjr/Spreadsheet-Table-Extract .)

   The thing is, I'm not completely happy with the name.  It extracts
tables from spreadsheets, sure enough, but "extract" is more of a verb
than a noun, and the key method makes instances of itself that represent
table-like subsets of the spreadsheet.  Which are in fact extracts, but
it might be more accurate to make those Spreadsheet::Table instances.
But that seems overly grandiose for such a small module (it's 550 lines
all told).  Spreadsheet::ExtractedTable?  Suggestions?

                                        -- Bob Rogers
                                           http://www.rgrjr.com/

Reply via email to