Version 3 of Using Perl to get Excel

Updated 2002-05-31 18:19:07

This is a simple syntax that writes a Perl program to create an MS Excel spreadsheet using perl's Spreadsheet::WriteExcel.pm. Since I didn't know about tclperl I also wrote a small extension to load and eval perl code in tcl.

Find the full source here [L1 ].

And the tcl part + example:

proc workbook { name contents } {

        lappend result {

use lib "/home/john/perl/lib"; use Spreadsheet::WriteExcel;

}

        lappend result "\$workbook = Spreadsheet::WriteExcel->new(\"$name\");"
        eval $contents
        lappend result "\$workbook->close();"

        perl [join $result "\n"]

} proc format { name args } {

                upvar result result

        foreach { prop value } $args {
                lappend proplist "$prop => \"$value\""
        }

        lappend result  "\$$name = \$workbook->addformat([join $proplist ", "]);

} proc worksheet { name contents } {

                upvar result result

        lappend result  "\$worksheet = \$workbook->addworksheet(\"$name\");"
        eval $contents

}

proc starbase2excel { t { row 0 } { col 0 } } {

    upvar $t T

    set nrows [expr $T(Nrows) + $row]
    set ncols [expr $T(Ncols) + $col]

    for { set i $row } { $i < $nrows } { incr i } {
        for { set j $col } { $j < $ncols } { incr j } {
            set fmt {}
            catch { set fmt $T(format)                          }
            catch { set fmt $T(format,R[expr $i - $row + 1])            }
            catch { set fmt $T(format,C[expr $j - $col + 1])            }
            catch { set fmt $T(format,R[expr $i - $row + 1]C[expr $j - $col + 1]
            uplevel cell $i $j $T([expr $i - $row + 1],[expr $j - $col + 1]) $fm
        }
    }

} proc cell { row col cell { format {} } } {

        upvar worksheet worksheet
        upvar result    result

        if { $format != {} } { set format ", \$$format" }
        lappend result  "\$worksheet->write($row, $col, \"$cell\" $format);"

}

source /data/mmti/src/mmtitcl/starbase.tcl #load ./libperltcl.so

proc perl { code } {

         set perl [open "| perl" w]

        puts  $perl $code
        close $perl

}