My personal favourite is
HTML::Template you can do something very simple like this (untested):
<table>
<TMPL_LOOP NAME=FINANCIALS>
<tr>
<td><TMPL_VAR NAME=SALES></td>
<td><TMPL_VAR NAME=Q1></td>
<td><TMPL_VAR NAME=Q2></td>
</tr>
</TMPL_LOOP>
</table>
$template->param(FINANCIALS => [
{
SALES => "Low Power Components",
Q3 => 3000000,
Q4 => 4600000
},
{
SALES => "Virtual Wire Products",
Q3 => 2700000,
Q4 => 2300000
},
]
);
Its then relativly easy to loop thru your Excel output and create the array of hashes needed to fill the template.
Then again, there is always Text::Template to use as well.. ;-)