Hi Michael,
I think this is because at the moment in the Table widget, the tfoot part lies before tbody so it could work when "showFooter" => "top". An unintended consequence is if we stop repeating tfoot it will be shown just before tbody. For now to fix this please open the file koolreport/core/src/widgets/koolphp/Table.tpl.php and move the tfoot part to after tbody:
    <?php
        if ($this->showFooter!==null) {
        ?>
        <tfoot <?php echo ($this->showFooter==="top")?"style='display:table-row-group'":""; ?>>
            <tr>
            <?php
            foreach ($showColumnKeys as $cKey) {
                $cssStyle = Utility::get($meta["columns"][$cKey], "cssStyle", null);
                $tfStyle = is_string($cssStyle)?$cssStyle:Utility::get($cssStyle, "tf");
            ?>
                <td <?php if($tfClass){echo " class='".((gettype($tfClass)=="string")?$tfClass:$tfClass($cKey))."'";} ?> <?php echo ($tfStyle)?"style='$tfStyle'":""; ?> >
                    <?php 
                        $footerValue = "";
                        $method = strtolower(Utility::get($meta["columns"][$cKey], "footer"));
                        if( in_array($method, array("count","sum","avg","min","max","mode")) ) {
                            $footerValue = Table::formatValue($this->dataStore->$method($cKey), $meta["columns"][$cKey]);
                        }
                        $footerText = Utility::get($meta["columns"][$cKey],"footerText");
                        if ($footerText!==null) {
                            echo str_replace("@value", $footerValue, $footerText);
                        } else {
                            echo $footerValue;
                        }
                    ?>
                </td>	
            <?php	
            }
            ?>
            </tr>
        </tfoot>
        <?php	
        }
        ?>
 Hope this works for you. We will find a compatible solution for this the Table widget footer in the next release. Thanks!