mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 13:46:17 +08:00
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:
parent
e75ecc745c
commit
ff8cd877f9
|
@ -99,11 +99,12 @@ private section.
|
||||||
FIELD-SYMBOLS: <worksheet> TYPE t_worksheet.
|
FIELD-SYMBOLS: <worksheet> TYPE t_worksheet.
|
||||||
|
|
||||||
DATA: node TYPE REF TO if_ixml_node,
|
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,
|
si TYPE REF TO if_ixml_node_list,
|
||||||
row TYPE REF TO if_ixml_node_list,
|
row TYPE REF TO if_ixml_node_list,
|
||||||
row_iterator TYPE REF TO if_ixml_node_iterator,
|
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,
|
attributes TYPE REF TO if_ixml_named_node_map,
|
||||||
attribute TYPE REF TO if_ixml_node,
|
attribute TYPE REF TO if_ixml_node,
|
||||||
col_attributes TYPE REF TO if_ixml_named_node_map,
|
col_attributes TYPE REF TO if_ixml_named_node_map,
|
||||||
|
@ -119,6 +120,7 @@ private section.
|
||||||
values TYPE stringtab,
|
values TYPE stringtab,
|
||||||
value_index TYPE i,
|
value_index TYPE i,
|
||||||
cell_value TYPE zexcel_cell_value,
|
cell_value TYPE zexcel_cell_value,
|
||||||
|
cell_formula TYPE zexcel_cell_formula,
|
||||||
stripped_name TYPE chkfile,
|
stripped_name TYPE chkfile,
|
||||||
dirname TYPE string.
|
dirname TYPE string.
|
||||||
|
|
||||||
|
@ -232,34 +234,40 @@ private section.
|
||||||
worksheet_index = worksheet_index + 1.
|
worksheet_index = worksheet_index + 1.
|
||||||
row = node->get_children( ).
|
row = node->get_children( ).
|
||||||
row_iterator = row->create_iterator( ).
|
row_iterator = row->create_iterator( ).
|
||||||
col = row_iterator->get_next( ).
|
cell ?= row_iterator->get_next( ).
|
||||||
WHILE NOT col IS INITIAL.
|
WHILE NOT cell IS INITIAL.
|
||||||
col_attributes = col->get_attributes( ).
|
col_attributes = cell->get_attributes( ).
|
||||||
attribute ?= col_attributes->get_named_item_ns( 'r' ).
|
attribute ?= col_attributes->get_named_item_ns( 'r' ).
|
||||||
r = attribute->get_value( ).
|
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' ).
|
attribute ?= col_attributes->get_named_item_ns( 't' ).
|
||||||
IF attribute IS BOUND.
|
IF attribute IS BOUND.
|
||||||
cell_data_type = attribute->get_value( ).
|
cell_data_type = attribute->get_value( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
" WRITE: / r, cell_data_type.
|
|
||||||
value_node = col->get_first_child( ).
|
value_elem = cell->find_from_name( name = 'v' ).
|
||||||
|
|
||||||
CASE cell_data_type.
|
CASE cell_data_type.
|
||||||
WHEN 's'. " String
|
WHEN 's'. " String values are stored as index in shared string table
|
||||||
value_index = value_node->get_value( ) + 1.
|
value_index = value_elem->get_value( ) + 1.
|
||||||
READ TABLE values INTO cell_value INDEX value_index.
|
READ TABLE values INTO cell_value INDEX value_index.
|
||||||
WHEN 'b'. " Boolean
|
WHEN 'inlineStr'. " inlineStr values are kept in special node
|
||||||
" TODO
|
value_elem = cell->find_from_name( name = 'is' ).
|
||||||
WHEN 'inlineStr'. " inlineStr
|
IF value_elem IS BOUND.
|
||||||
" TODO
|
cell_value = value_elem->get_value( ).
|
||||||
WHEN 'e'. " Error
|
ENDIF.
|
||||||
" TODO
|
WHEN OTHERS. "other types are stored directly
|
||||||
WHEN OTHERS.
|
IF value_elem IS BOUND.
|
||||||
IF value_node IS BOUND.
|
cell_value = value_elem->get_value( ).
|
||||||
cell_value = value_node->get_value( ).
|
|
||||||
ENDIF.
|
ENDIF.
|
||||||
ENDCASE.
|
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(
|
zcl_excel_common=>convert_columnrow2column_a_row(
|
||||||
EXPORTING
|
EXPORTING
|
||||||
i_columnrow = r
|
i_columnrow = r
|
||||||
|
@ -272,9 +280,11 @@ private section.
|
||||||
ip_column = cell_column " Cell Column
|
ip_column = cell_column " Cell Column
|
||||||
ip_row = cell_row " Cell Row
|
ip_row = cell_row " Cell Row
|
||||||
ip_value = cell_value " Cell Value
|
ip_value = cell_value " Cell Value
|
||||||
|
ip_formula = cell_formula
|
||||||
|
ip_data_type = cell_data_type
|
||||||
).
|
).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
col = row_iterator->get_next( ).
|
cell ?= row_iterator->get_next( ).
|
||||||
ENDWHILE.
|
ENDWHILE.
|
||||||
ENDWHILE.
|
ENDWHILE.
|
||||||
ENDWHILE.
|
ENDWHILE.
|
||||||
|
|
|
@ -174,7 +174,8 @@ public section.
|
||||||
!IP_VALUE type SIMPLE optional
|
!IP_VALUE type SIMPLE optional
|
||||||
!IP_FORMULA type ZEXCEL_CELL_FORMULA optional
|
!IP_FORMULA type ZEXCEL_CELL_FORMULA optional
|
||||||
!IP_STYLE type ZEXCEL_CELL_STYLE 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
|
methods SET_CELL_STYLE
|
||||||
importing
|
importing
|
||||||
!IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA
|
!IP_COLUMN type ZEXCEL_CELL_COLUMN_ALPHA
|
||||||
|
@ -3224,14 +3225,15 @@ endmethod.</source>
|
||||||
endmethod.</source>
|
endmethod.</source>
|
||||||
<methodDocumentation/>
|
<methodDocumentation/>
|
||||||
</method>
|
</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">
|
<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="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_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="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_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="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_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="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_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="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_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="20101212" CHANGEDBY="BCUSER" CHANGEDON="20110218" PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="3" TYPE="ZCL_EXCEL_HYPERLINK" 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"/>
|
||||||
<source>method SET_CELL.
|
<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,
|
DATA: lv_column TYPE zexcel_cell_column,
|
||||||
ls_sheet_content TYPE zexcel_s_cell_data,
|
ls_sheet_content TYPE zexcel_s_cell_data,
|
||||||
|
@ -3253,6 +3255,12 @@ endmethod.</source>
|
||||||
lv_style_guid = ip_style.
|
lv_style_guid = ip_style.
|
||||||
|
|
||||||
IF ip_value IS SUPPLIED.
|
IF ip_value IS SUPPLIED.
|
||||||
|
"if data type is passed just write the value. Otherwise map abap type to excel and perform conversion
|
||||||
|
"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.
|
DESCRIBE FIELD ip_value TYPE lv_value_type.
|
||||||
CASE lv_value_type.
|
CASE lv_value_type.
|
||||||
WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2 OR
|
WHEN cl_abap_typedescr=>typekind_int OR cl_abap_typedescr=>typekind_int1 OR cl_abap_typedescr=>typekind_int2 OR
|
||||||
|
@ -3288,6 +3296,8 @@ endmethod.</source>
|
||||||
ENDCASE.
|
ENDCASE.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
IF ip_hyperlink IS BOUND.
|
IF ip_hyperlink IS BOUND.
|
||||||
ip_hyperlink->set_cell_reference( ip_column = ip_column
|
ip_hyperlink->set_cell_reference( ip_column = ip_column
|
||||||
ip_row = ip_row ).
|
ip_row = ip_row ).
|
||||||
|
|
Loading…
Reference in New Issue
Block a user