mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 05:04:11 +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.
|
||||
|
||||
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.
|
||||
|
|
|
@ -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,
|
||||
|
@ -3253,6 +3255,12 @@ endmethod.</source>
|
|||
lv_style_guid = ip_style.
|
||||
|
||||
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.
|
||||
CASE lv_value_type.
|
||||
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.
|
||||
ENDIF.
|
||||
|
||||
ENDIF.
|
||||
|
||||
IF ip_hyperlink IS BOUND.
|
||||
ip_hyperlink->set_cell_reference( ip_column = ip_column
|
||||
ip_row = ip_row ).
|
||||
|
|
Loading…
Reference in New Issue
Block a user