Fix #82 - data types from source sheets are preserver in the reader

Fix #80 - both value and formula are read by the reader

These 2 fixes allow reading xlsx templates with values of different types and formulas and saving them back

git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@159 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049
This commit is contained in:
Tomek Mackowski 2011-04-13 22:18:10 +00:00
parent e75ecc745c
commit ff8cd877f9
2 changed files with 79 additions and 59 deletions

View File

@ -99,11 +99,12 @@ private section.
FIELD-SYMBOLS: <worksheet> TYPE t_worksheet.
DATA: node TYPE REF TO if_ixml_node,
value_node TYPE REF TO if_ixml_node,
value_elem TYPE REF TO if_ixml_element,
formula_elem TYPE REF TO if_ixml_element,
si TYPE REF TO if_ixml_node_list,
row TYPE REF TO if_ixml_node_list,
row_iterator TYPE REF TO if_ixml_node_iterator,
col TYPE REF TO if_ixml_node,
cell TYPE REF TO if_ixml_element,
attributes TYPE REF TO if_ixml_named_node_map,
attribute TYPE REF TO if_ixml_node,
col_attributes TYPE REF TO if_ixml_named_node_map,
@ -119,6 +120,7 @@ private section.
values TYPE stringtab,
value_index TYPE i,
cell_value TYPE zexcel_cell_value,
cell_formula TYPE zexcel_cell_formula,
stripped_name TYPE chkfile,
dirname TYPE string.
@ -232,34 +234,40 @@ private section.
worksheet_index = worksheet_index + 1.
row = node->get_children( ).
row_iterator = row->create_iterator( ).
col = row_iterator->get_next( ).
WHILE NOT col IS INITIAL.
col_attributes = col->get_attributes( ).
cell ?= row_iterator->get_next( ).
WHILE NOT cell IS INITIAL.
col_attributes = cell->get_attributes( ).
attribute ?= col_attributes->get_named_item_ns( 'r' ).
r = attribute->get_value( ).
CLEAR: cell_data_type, cell_value.
CLEAR: cell_data_type, cell_value, cell_formula.
attribute ?= col_attributes->get_named_item_ns( 't' ).
IF attribute IS BOUND.
cell_data_type = attribute->get_value( ).
ENDIF.
" WRITE: / r, cell_data_type.
value_node = col->get_first_child( ).
value_elem = cell->find_from_name( name = 'v' ).
CASE cell_data_type.
WHEN 's'. " String
value_index = value_node->get_value( ) + 1.
WHEN 's'. " String values are stored as index in shared string table
value_index = value_elem->get_value( ) + 1.
READ TABLE values INTO cell_value INDEX value_index.
WHEN 'b'. " Boolean
" TODO
WHEN 'inlineStr'. " inlineStr
" TODO
WHEN 'e'. " Error
" TODO
WHEN OTHERS.
IF value_node IS BOUND.
cell_value = value_node->get_value( ).
WHEN 'inlineStr'. " inlineStr values are kept in special node
value_elem = cell->find_from_name( name = 'is' ).
IF value_elem IS BOUND.
cell_value = value_elem->get_value( ).
ENDIF.
WHEN OTHERS. "other types are stored directly
IF value_elem IS BOUND.
cell_value = value_elem->get_value( ).
ENDIF.
ENDCASE.
IF NOT cell_value IS INITIAL.
formula_elem = cell->find_from_name( name = 'f' ).
IF formula_elem IS BOUND.
cell_formula = formula_elem->get_value( ).
ENDIF.
IF NOT cell_value IS INITIAL or NOT cell_formula is INITIAL.
zcl_excel_common=>convert_columnrow2column_a_row(
EXPORTING
i_columnrow = r
@ -272,9 +280,11 @@ private section.
ip_column = cell_column " Cell Column
ip_row = cell_row " Cell Row
ip_value = cell_value " Cell Value
ip_formula = cell_formula
ip_data_type = cell_data_type
).
ENDIF.
col = row_iterator->get_next( ).
cell ?= row_iterator->get_next( ).
ENDWHILE.
ENDWHILE.
ENDWHILE.

View File

@ -174,7 +174,8 @@ public section.
!IP_VALUE type SIMPLE optional
!IP_FORMULA type ZEXCEL_CELL_FORMULA optional
!IP_STYLE type ZEXCEL_CELL_STYLE optional
!IP_HYPERLINK type ref to ZCL_EXCEL_HYPERLINK optional .
!IP_HYPERLINK type ref to ZCL_EXCEL_HYPERLINK optional
!IP_DATA_TYPE type ZEXCEL_CELL_DATA_TYPE optional .
methods SET_CELL_STYLE
importing
!IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA
@ -3224,14 +3225,15 @@ endmethod.</source>
endmethod.</source>
<methodDocumentation/>
</method>
<method CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" VERSION="1" LANGU="E" DESCRIPT="Set cell value" EXPOSURE="2" STATE="1" EDITORDER="35 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_COLUMN" VERSION="1" LANGU="E" DESCRIPT="Cell Column" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_COLUMN_ALPHA"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_ROW" VERSION="1" LANGU="E" DESCRIPT="Cell Row" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_ROW"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_VALUE" VERSION="1" LANGU="E" DESCRIPT="Cell Value" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="SIMPLE" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_FORMULA" VERSION="1" LANGU="E" DESCRIPT="Cell Formula" CMPTYPE="1" MTDTYPE="0" EDITORDER="4 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_FORMULA" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_STYLE" VERSION="1" LANGU="E" DESCRIPT="Single-Character Indicator" CMPTYPE="1" MTDTYPE="0" EDITORDER="5 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_STYLE" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_HYPERLINK" VERSION="1" LANGU="E" DESCRIPT="Hyperlink" CMPTYPE="1" MTDTYPE="0" EDITORDER="6 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_HYPERLINK" PAROPTIONL="X"/>
<source>method SET_CELL.
<method CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" VERSION="1" LANGU="E" DESCRIPT="Set cell value" EXPOSURE="2" STATE="1" EDITORDER="35 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" MTDTYPE="0" MTDDECLTYP="0" R3RELEASE="702" BCMTDCAT="00" BCMTDSYN="0">
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_COLUMN" VERSION="1" LANGU="E" DESCRIPT="Cell Column" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_COLUMN_ALPHA"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_ROW" VERSION="1" LANGU="E" DESCRIPT="Cell Row" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_ROW"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_VALUE" VERSION="1" LANGU="E" DESCRIPT="Cell Value" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="SIMPLE" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_FORMULA" VERSION="1" LANGU="E" DESCRIPT="Cell Formula" CMPTYPE="1" MTDTYPE="0" EDITORDER="4 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_FORMULA" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_STYLE" VERSION="1" LANGU="E" DESCRIPT="Single-Character Indicator" CMPTYPE="1" MTDTYPE="0" EDITORDER="5 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_STYLE" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_HYPERLINK" VERSION="1" LANGU="E" DESCRIPT="Hyperlink" CMPTYPE="1" MTDTYPE="0" EDITORDER="6 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110408" CHANGEDBY="BCUSER" CHANGEDON="20110408" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_HYPERLINK" PAROPTIONL="X"/>
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="SET_CELL" SCONAME="IP_DATA_TYPE" VERSION="1" LANGU="E" DESCRIPT="Cell data type" CMPTYPE="1" MTDTYPE="0" EDITORDER="7 " DISPID="0 " AUTHOR="BCUSER" CREATEDON="20110413" CHANGEDON="00000000" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_DATA_TYPE" PAROPTIONL="X"/>
<source>METHOD set_cell.
DATA: lv_column TYPE zexcel_cell_column,
ls_sheet_content TYPE zexcel_s_cell_data,
@ -3246,46 +3248,54 @@ endmethod.</source>
IF ip_value IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;Pleas provide the value or formula&apos;.
EXPORTING
error = &apos;Pleas provide the value or formula&apos;.
ENDIF.
lv_style_guid = ip_style.
IF ip_value IS SUPPLIED.
DESCRIBE FIELD ip_value TYPE lv_value_type.
CASE lv_value_type.
WHEN cl_abap_typedescr=&gt;typekind_int OR cl_abap_typedescr=&gt;typekind_int1 OR cl_abap_typedescr=&gt;typekind_int2 OR
cl_abap_typedescr=&gt;typekind_float OR cl_abap_typedescr=&gt;typekind_packed.
lv_value = zcl_excel_common=&gt;number_to_excel_string( ip_value = ip_value ).
&quot;if data type is passed just write the value. Otherwise map abap type to excel and perform conversion
&quot;IP_DATA_TYPE is passed by excel reader so source types are preserved
IF ip_data_type IS SUPPLIED.
lv_value = ip_value.
lv_data_type = ip_data_type.
ELSE.
DESCRIBE FIELD ip_value TYPE lv_value_type.
CASE lv_value_type.
WHEN cl_abap_typedescr=&gt;typekind_int OR cl_abap_typedescr=&gt;typekind_int1 OR cl_abap_typedescr=&gt;typekind_int2 OR
cl_abap_typedescr=&gt;typekind_float OR cl_abap_typedescr=&gt;typekind_packed.
lv_value = zcl_excel_common=&gt;number_to_excel_string( ip_value = ip_value ).
WHEN cl_abap_typedescr=&gt;typekind_char OR cl_abap_typedescr=&gt;typekind_string OR cl_abap_typedescr=&gt;typekind_num.
lv_value = ip_value.
lv_data_type = &apos;s&apos;.
WHEN cl_abap_typedescr=&gt;typekind_char OR cl_abap_typedescr=&gt;typekind_string OR cl_abap_typedescr=&gt;typekind_num.
lv_value = ip_value.
lv_data_type = &apos;s&apos;.
WHEN cl_abap_typedescr=&gt;typekind_date.
lv_value = zcl_excel_common=&gt;date_to_excel_string( ip_value = ip_value ).
WHEN cl_abap_typedescr=&gt;typekind_date.
lv_value = zcl_excel_common=&gt;date_to_excel_string( ip_value = ip_value ).
IF ip_style IS NOT SUPPLIED. &quot;get default date format in case parameter is initial
lo_style = excel-&gt;add_new_style( ).
lo_style-&gt;number_format-&gt;format_code = get_default_excel_date_format( ).
lv_style_guid = lo_style-&gt;get_guid( ).
ENDIF.
IF ip_style IS NOT SUPPLIED. &quot;get default date format in case parameter is initial
lo_style = excel-&gt;add_new_style( ).
lo_style-&gt;number_format-&gt;format_code = get_default_excel_date_format( ).
lv_style_guid = lo_style-&gt;get_guid( ).
ENDIF.
WHEN cl_abap_typedescr=&gt;typekind_time.
lv_value = zcl_excel_common=&gt;time_to_excel_string( ip_value = ip_value ).
WHEN cl_abap_typedescr=&gt;typekind_time.
lv_value = zcl_excel_common=&gt;time_to_excel_string( ip_value = ip_value ).
IF ip_style IS NOT SUPPLIED. &quot;get default time format for user in case parameter is initial
lo_style = excel-&gt;add_new_style( ).
lo_style-&gt;number_format-&gt;format_code = zcl_excel_style_number_format=&gt;c_format_date_time6.
lv_style_guid = lo_style-&gt;get_guid( ).
ENDIF.
IF ip_style IS NOT SUPPLIED. &quot;get default time format for user in case parameter is initial
lo_style = excel-&gt;add_new_style( ).
lo_style-&gt;number_format-&gt;format_code = zcl_excel_style_number_format=&gt;c_format_date_time6.
lv_style_guid = lo_style-&gt;get_guid( ).
ENDIF.
WHEN OTHERS.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;Invalid data type of input value&apos;.
ENDCASE.
ENDIF.
WHEN OTHERS.
RAISE EXCEPTION TYPE zcx_excel
EXPORTING
error = &apos;Invalid data type of input value&apos;.
ENDCASE.
ENDIF.
IF ip_hyperlink IS BOUND.