proc perl { code } {
set perl [open "| perl" w]
puts $perl $code
close $perl
}There are four commands implemented
workbook name { } - Begin a new excel workbook.
worksheet name { } - Begin a new excel worksheet
format name spec - define a cell format
cell row col value - set a cellI also show a command starbase2excel which creates a series of cell definitions from an array defining a table. My starbase package reads and writes ascii tables to and from tcl arrays with a structure very similar to the struct:matrix guy. This could easily be adapted to extract data from the matrix or from a list of lists.The example:
workbook WorkBook.xls {
format fmt1 bold 1 color red font times
worksheet Work {
starbase_read tab.tab T
set T(format,C1) fmt1
starbase2excel T 3 3
cell 1 1 "Cell 1 1"
cell 1 2 value
cell 1 3 value fmt1
}
}And the tcl part:
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);"
}Dave Griffin: If PERL isn't available, tCOM has pretty good access to all things Microsoft, with a similar interface.

