
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sap="http://www.sap.com/sapxsl"
>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
HERE WE INSERT OUR COPY OF EXCEL FILE
</xsl:template>
</xsl:transform>
<Worksheet ss:Name="Лист1">
<Table ss:ExpandedRowCount="2" >
<xsl:for-each select="//TAB1/*"> - TAB1 is a SOURCE parameter for CALL TRANSFORMATION
here <ROW></ROW> which we want to repeat after header.
</xsl:for-each>
"itab
DATA: lt_t TYPE TABLE OF ls_t.
...
CALL TRANSFORMATION ('ZCH_NESTED_ITABS')
SOURCE
tab1 = lt_t
RESULT XML
l_ostream.
<Cell>
<Data ss:Type="Number">
<xsl:value-of select="INDEX"/> - index is a field in out TAB1 internal table
</Data>
</Cell>
<xsl:for-each select="//T1/*">
<xsl:for-each select="T2/*"> - here without // becouse of T1/T2
<Row>
<Cell>
<Data ss:Type="Number"><xsl:value-of select="INDEX"/></Data>
</Cell>
</Row>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="//DATA/*">
<xsl:variable name="ops_row" select="2 + position()"/> - that is how we create varibles
<Row ss:Index="{$ops_row}"> <!-- {} - attribute value template -->
<Table> <!-- without ss:ExpandedColumnCount -->
<Column/> <!-- Column tag set Style for columns, we loopt it first -->
<xsl:for-each select="//T2/*">
<Column/>
</xsl:for-each>
<Row> <!-- one row with T2 columns -->
<Cell>
</Cell>
<xsl:for-each select="//T2/*">
<Cell>
</Cell>
</xsl:for-each>
</Row>
<!-- dynamic rows and dynamic columns -->
<xsl:for-each select="//T1/*"> <!-- loop at rows -->
<Row>
<xsl:for-each select="//T2/*"> <!-- loop at columns -->
<Cell ss:Index="{1 + position()}"> </Cell>
</xsl:for-each>
</Row>
</xsl:for-each>
<xsl:for-each select="//T1/*">
<xsl:variable name="t1_num" select="NUM"/> <!-- inner loop T2 hide fields of T1 -->
<xsl:variable name="t1_count" select="COUNT"/>
<xsl:for-each select="T2/*">
<xsl:variable name="t2_count" select="COUNT"/>
<xsl:variable name="t2_pos" select="position()"/>
<xsl:variable name="t2_org" select="ORG"/>
<xsl:for-each select="T3/*">
<Row>
<xsl:if test="($t2_pos=1) and (position()=1)"> <!-- top cell with merge and skip below ones-->
<Cell ss:MergeDown="{$t1_count - 1}"><Data ss:Type="String"><xsl:value-of select="$t1_num"/></Data></Cell>
</xsl:if>
<xsl:if test="position()=1"> <!-- for cell after skipped ones we must specify ss:Index-->
<Cell ss:MergeDown="{$t2_count - 1}" ss:Index="2"><Data ss:Type="String"><xsl:value-of select="$t2_org"/></Data></Cell>
</xsl:if>
<Cell ss:Index="3"><xsl:value-of select="PLANS"/></Cell>
</Row>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
LOOP AT T1 ASSIGNING <T1>.
LOOP AT <T1>-T2 ASSIGNING <T2>.
<T2>-count = lines( <T2>-T3 ). "for T2 just all nested lines
IF <T2>-count <> 0.
<T1>-count = <T1>-count + <T2>-count. "for T1 we sum all T2 tables, empty = 1 line.
ELSE.
<T1>-count = <T1>-count + 1.
ENDIF.
ENDLOOP.
ENDLOOP.
<xsl:if test="INDEX=1">
</xsl:if>
<xsl:choose>
<xsl:when test="SYMB='+'">
<Cell ss:StyleID="s26"><Data ss:Type="String"><xsl:value-of select="SYMB"/></Data></Cell>
</xsl:when>
<xsl:otherwise>
<Cell ss:StyleID="s18"><Data ss:Type="String"></Data></Cell>
</xsl:otherwise>
</xsl:choose>
<Cell ss:StyleID="s133" ss:Formula="=SUM(R[-{$t1_count}]C:R[-1]C)">
<Data ss:Type="Number"></Data></Cell>
<sap:call-external class="ZMYCLASS" method="GET_XML">
<sap:callvalue param="IV_STR" select="string(position())"/> <!-- export parameter -->
<sap:callvariable name="fromclass" param="RET_VAL"/> <!-- return $fromclass
</sap:call-external>
<xsl:value-of select="$fromclass"/>
method SIMP.
CREATE OBJECT EX_OBJ.
endmethod.
<sap:call-external class=”ZCAL” method=”SIMP”> “calling static method
<sap:callvariable param=”EX_OBJ” name=”plant”/> ” Hold the objec
</sap:call-external>
<sap:call-external name=”plant” method=”ZPERIOD”> “calling instacne method
<sap:callvalue param=”IM_MHDHB” select=”string(Order/MHDHB)”/>
<sap:callvalue param=”IM_IPRKZ” select=”string(Order/IPRKZ)”/>
<sap:callvariable param=”EX_MHDHB” name=”period”/>
</sap:call-external>
<xsl:template match="PLANETS">
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:tempiate>
<xsl:template match="PLANET">
<P>
<xsl:value-of select="NAME"/>
</P>
</xsl:tempiate>
<xsl:for-each select="//T1/*">
<xsl:variable name="id" select="LV_ID"/>
<xsl:for-each select="//T2/*[LV_ID_F=$id]">
</xsl:for-each>
</xsl:for-each>
<xsl:value-of select="//T_LGART/*[PERNR=$pernr and ID_FK=$id]/*[name()='BETRG']"/>
DATA lt_data_xml TYPE swxmlcont.
DATA l_ostream TYPE REF TO if_ixml_ostream.
DATA(l_xml) = cl_ixml=>create( ).
DATA(l_stream_factory) = l_xml->create_stream_factory( ).
l_ostream = l_stream_factory->create_ostream_itable( table = lt_data_xml[] ).
CALL TRANSFORMATION ZXLST_TRANSFORMATION
SOURCE
data1 = lt_t "internal table lt_t transfered by name data1. Be careful with this names.
RESULT XML
l_ostream.
DATA workdir TYPE string.
cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = workdir ).
cl_gui_cfw=>flush( ).
CONCATENATE workdir '\' 'ZXSLT_TRANSFORMATION' sy-datum sy-uzeit '.xml' INTO DATA(filename).
* "remove special characters
REPLACE ALL OCCURRENCES OF '*' IN filename WITH space.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = filename
filetype = 'BIN'
CHANGING
data_tab = lt_data_xml[]
EXCEPTIONS
file_write_error = 1
OTHERS = 99.
CONCATENATE '"' filename '"' INTO filename.
CALL METHOD cl_gui_frontend_services=>execute
EXPORTING
application = 'Excel'
parameter = filename
operation = 'OPEN'
EXCEPTIONS
OTHERS = 1.
DATA lv_result TYPE xstring.
CALL TRANSFORMATION ZXSLT_TRANSFORMATION
SOURCE
data = lt_t
RESULT XML lv_result
.
CHECK lv_result IS NOT INITIAL.
CALL METHOD cl_wd_runtime_services=>attach_file_to_response
EXPORTING
i_filename = 'a.xml'
i_content = lv_result
i_mime_type = 'application/msexcel'
i_inplace = abap_true.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
5 | |
3 | |
2 | |
2 | |
2 | |
2 | |
2 | |
2 | |
1 | |
1 |