xslt导出excel,动态最后一行生成公式
由于最近工作中需要实现大数据量(10万以上)导出Excel,所以学习xslt去实现;把这个过程中的关于动态实现最后一行插入公式的方法分享一下:
需求:导出的excel中可能用户会修改数据或增加数据,然后对一列去统计求和
在模板中sheet的数据循环完后加上统计这行,如:
<xsl:for-each select="DATAS/DATA">
<Row ss:AutoFitHeight="0" ss:Height="15">
<Cell><Data ss:Type="String"> </Data></Cell>
<Cell ss:StyleID="s35"><Data ss:Type="Number"><xsl:value-of select="fe_riPremNet"/></Data></Cell>
<Cell><Data ss:Type="String"> </Data></Cell>
</Row>
</xsl:for-each>
<Row ss:AutoFitHeight="0" ss:Height="15">
<Cell ss:StyleID="s33"><Data ss:Type="String">总计</Data></Cell>
<Cell ss:StyleID="s32"><xsl:attribute name="ss:Formula">=SUM(R[-<xsl:value-of select="size"/>]C:R[-1]C)</xsl:attribute><Data ss:Type="Number"></Data></Cell>
<Cell><Data ss:Type="String"> </Data></Cell>
</Row>
其中公式=SUM(R[-<xsl:value-of select="size"/>]C:)
公式说明:1.size是从后台统计每一个sheet页多少数据;
2.R表示行,C表示列;RC表示公式所在的本单元格;
3.[-1]表示相对于本单元格的前一列或前一行;
4.如R[-1]C就是表示同列的上一个单元格。
定义的xml:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<ROOT>
<SHEET>
<DATAS>
<DATA>
<fe_riPremNet>22</fe_riPremNet>
<ic_riRate>2</ic_riRate>
<ic_clmMoney>22</ic_clmMoney>
</DATA>
......
<DATA>
<fe_riPremNet>22</fe_riPremNet>
<ic_riRate>2</ic_riRate>
<ic_clmMoney>22</ic_clmMoney>
</DATA>
</DATAS>
<sheet_code>CSSQ</sheet_code>
<size>5</size>
</SHEET>
</ROOT>
<DATA>一条数据, <DATAS>是数据的集合,<SHEET>一个sheet,<ROOT>根节点;(注:定义的有点复杂,这是截取的部分,实际中因为导出的excel中有4个不同模板,
所以分为不同的<SHEET>;<sheet_code>是模板中去判断使用哪个sheet页模板)
最后,有没有大侠直接在模板中实现动态实现动态公式,请指教!
开始的想法就是用position()获取循环次数,然后传给公式,但xslt中定义参数和变量都要在一个<xsl:template>下而没实现,所以使用后台统计数据条数;
我同事使用sunifs()函数去实现,但他实现是要去判断前一列是否有一个固定值,感觉很难懂,如:
<Cell ss:StyleID="s101" ss:Formula="=SUMIFS(C,C[-28],"S")+SUMIFS(C,C[-28],"Y")"><Data ss:Type="Number"></Data></Cell>