mirror of
https://github.com/abap2xlsx/abap2xlsx.git
synced 2025-05-05 14:06:24 +08:00
Merge pull request #333 from oliver-huetkoeper/master
Ignore merged cells when calculating column width
This commit is contained in:
commit
01739b8676
|
@ -65,6 +65,7 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING "#AU Risk_Level Harmles
|
||||||
METHODS: describe_structure FOR TESTING.
|
METHODS: describe_structure FOR TESTING.
|
||||||
METHODS: calculate_cell_distance FOR TESTING.
|
METHODS: calculate_cell_distance FOR TESTING.
|
||||||
METHODS: shift_formula FOR TESTING.
|
METHODS: shift_formula FOR TESTING.
|
||||||
|
METHODS: is_cell_in_range FOR TESTING.
|
||||||
ENDCLASS. "lcl_Excel_Common_Test
|
ENDCLASS. "lcl_Excel_Common_Test
|
||||||
|
|
||||||
|
|
||||||
|
@ -1036,9 +1037,117 @@ CLASS lcl_excel_common_test IMPLEMENTATION.
|
||||||
'A1+$A1+A$1+$A$1+B2' -1 -1 '#REF!+#REF!+#REF!+$A$1+A1'. " Referencing error , row and column , underflow
|
'A1+$A1+A$1+$A$1+B2' -1 -1 '#REF!+#REF!+#REF!+$A$1+A1'. " Referencing error , row and column , underflow
|
||||||
ENDMETHOD. "SHIFT_FORMULA
|
ENDMETHOD. "SHIFT_FORMULA
|
||||||
|
|
||||||
|
METHOD is_cell_in_range.
|
||||||
|
DATA ep_cell_in_range TYPE abap_bool.
|
||||||
|
|
||||||
|
* Test 1: upper left corner (in range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'B'
|
||||||
|
ip_row = 2
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_true
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
* Test 2: lower right corner (in range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'D'
|
||||||
|
ip_row = 4
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_true
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
* Test 3: left side (out of range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'A'
|
||||||
|
ip_row = 3
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_false
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
* Test 4: upper side (out of range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'C'
|
||||||
|
ip_row = 1
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_false
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
* Test 5: right side (out of range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'E'
|
||||||
|
ip_row = 3
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_false
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
* Test 6: lower side (out of range)
|
||||||
|
TRY.
|
||||||
|
ep_cell_in_range = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = 'C'
|
||||||
|
ip_row = 5
|
||||||
|
ip_range = 'B2:D4' ).
|
||||||
|
|
||||||
|
zcl_excel_common=>assert_equals(
|
||||||
|
act = ep_cell_in_range
|
||||||
|
exp = abap_false
|
||||||
|
msg = 'Check cell in range failed'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
CATCH zcx_excel.
|
||||||
|
zcl_excel_common=>fail(
|
||||||
|
msg = 'Unexpected exception'
|
||||||
|
level = if_aunit_constants=>critical ).
|
||||||
|
ENDTRY.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
ENDCLASS. "lcl_Excel_Common_Test</localTestClasses>
|
ENDCLASS. "lcl_Excel_Common_Test</localTestClasses>
|
||||||
<textPool>
|
<textPool>
|
||||||
|
@ -1886,6 +1995,46 @@ endmethod.</source>
|
||||||
|
|
||||||
ENDLOOP.
|
ENDLOOP.
|
||||||
|
|
||||||
|
endmethod.</source>
|
||||||
|
</method>
|
||||||
|
<method CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" VERSION="1" LANGU="E" DESCRIPT="Check if cell is part of a range" EXPOSURE="2" STATE="1" EDITORDER="24 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="1" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" SCONAME="IP_COLUMN" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="SIMPLE"/>
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" SCONAME="IP_ROW" VERSION="1" LANGU="E" DESCRIPT="Cell Row" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_ROW"/>
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" SCONAME="IP_RANGE" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="CLIKE"/>
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" SCONAME="RP_IN_RANGE" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="4 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="ABAP_BOOL"/>
|
||||||
|
<exception CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="IS_CELL_IN_RANGE" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
|
||||||
|
<source>method IS_CELL_IN_RANGE.
|
||||||
|
DATA lv_column_start TYPE zexcel_cell_column_alpha.
|
||||||
|
DATA lv_column_end TYPE zexcel_cell_column_alpha.
|
||||||
|
DATA lv_row_start TYPE zexcel_cell_row.
|
||||||
|
DATA lv_row_end TYPE zexcel_cell_row.
|
||||||
|
DATA lv_column_start_i TYPE zexcel_cell_column.
|
||||||
|
DATA lv_column_end_i TYPE zexcel_cell_column.
|
||||||
|
DATA lv_column_i TYPE zexcel_cell_column.
|
||||||
|
|
||||||
|
|
||||||
|
* Split range and convert columns
|
||||||
|
convert_range2column_a_row(
|
||||||
|
exporting
|
||||||
|
i_range = ip_range
|
||||||
|
IMPORTING
|
||||||
|
e_column_start = lv_column_start
|
||||||
|
e_column_end = lv_column_end
|
||||||
|
e_row_start = lv_row_start
|
||||||
|
e_row_end = lv_row_end ).
|
||||||
|
|
||||||
|
lv_column_start_i = convert_column2int( ip_column = lv_column_start ).
|
||||||
|
lv_column_end_i = convert_column2int( ip_column = lv_column_end ).
|
||||||
|
|
||||||
|
lv_column_i = convert_column2int( ip_column = ip_column ).
|
||||||
|
|
||||||
|
* Check if cell is in range
|
||||||
|
IF lv_column_i >= lv_column_start_i AND
|
||||||
|
lv_column_i <= lv_column_end_i AND
|
||||||
|
ip_row >= lv_row_start AND
|
||||||
|
ip_row <= lv_row_end.
|
||||||
|
rp_in_range = abap_true.
|
||||||
|
ENDIF.
|
||||||
endmethod.</source>
|
endmethod.</source>
|
||||||
</method>
|
</method>
|
||||||
<method CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="NUMBER_TO_EXCEL_STRING" VERSION="1" LANGU="E" DESCRIPT="Converts number to string representation in Excel format" EXPOSURE="2" STATE="1" EDITORDER="13 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="1" BCMTDCAT="00" BCMTDSYN="0">
|
<method CLSNAME="ZCL_EXCEL_COMMON" CMPNAME="NUMBER_TO_EXCEL_STRING" VERSION="1" LANGU="E" DESCRIPT="Converts number to string representation in Excel format" EXPOSURE="2" STATE="1" EDITORDER="13 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="1" BCMTDCAT="00" BCMTDSYN="0">
|
||||||
|
|
|
@ -3162,6 +3162,10 @@ ENDMETHOD.</source>
|
||||||
* col_alpha = zcl_excel_common=>convert_column2alpha( <auto_size>-col_index )." issue #155 - less restrictive typing for ip_column
|
* col_alpha = zcl_excel_common=>convert_column2alpha( <auto_size>-col_index )." issue #155 - less restrictive typing for ip_column
|
||||||
count = 1.
|
count = 1.
|
||||||
WHILE count <= highest_row.
|
WHILE count <= highest_row.
|
||||||
|
* Do not check merged cells
|
||||||
|
IF is_cell_merged(
|
||||||
|
ip_column = <auto_size>-col_index
|
||||||
|
ip_row = count ) = abap_false.
|
||||||
* Start of change # issue 139 - Dateretention of cellstyles
|
* Start of change # issue 139 - Dateretention of cellstyles
|
||||||
* IF cell_style IS BOUND.
|
* IF cell_style IS BOUND.
|
||||||
* CREATE OBJECT cell_style.
|
* CREATE OBJECT cell_style.
|
||||||
|
@ -3183,11 +3187,12 @@ ENDMETHOD.</source>
|
||||||
* width = cell_style->font->calculate_text_width( cell_value ).
|
* width = cell_style->font->calculate_text_width( cell_value ).
|
||||||
* ENDIF.
|
* ENDIF.
|
||||||
* width = calculate_cell_width( ip_column = col_alpha " issue #155 - less restrictive typing for ip_column
|
* width = calculate_cell_width( ip_column = col_alpha " issue #155 - less restrictive typing for ip_column
|
||||||
width = calculate_cell_width( ip_column = <auto_size>-col_index " issue #155 - less restrictive typing for ip_column
|
width = calculate_cell_width( ip_column = <auto_size>-col_index " issue #155 - less restrictive typing for ip_column
|
||||||
ip_row = count ).
|
ip_row = count ).
|
||||||
* End of change # issue 139 - Dateretention of cellstyles
|
* End of change # issue 139 - Dateretention of cellstyles
|
||||||
IF width > <auto_size>-width.
|
IF width > <auto_size>-width.
|
||||||
<auto_size>-width = width.
|
<auto_size>-width = width.
|
||||||
|
ENDIF.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
count = count + 1.
|
count = count + 1.
|
||||||
ENDWHILE.
|
ENDWHILE.
|
||||||
|
@ -4221,6 +4226,30 @@ ENDMETHOD.</source>
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
endmethod.</source>
|
endmethod.</source>
|
||||||
|
</method>
|
||||||
|
<method CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="IS_CELL_MERGED" VERSION="1" LANGU="E" DESCRIPT="Checks if a cell is merged" EXPOSURE="2" STATE="1" EDITORDER="59 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" MTDNEWEXC="X" BCMTDCAT="00" BCMTDSYN="0">
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="IS_CELL_MERGED" SCONAME="IP_COLUMN" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="1 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="SIMPLE"/>
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="IS_CELL_MERGED" SCONAME="IP_ROW" VERSION="1" LANGU="E" DESCRIPT="Cell Row" CMPTYPE="1" MTDTYPE="0" EDITORDER="2 " DISPID="0 " PARDECLTYP="0" PARPASSTYP="1" TYPTYPE="1" TYPE="ZEXCEL_CELL_ROW"/>
|
||||||
|
<parameter CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="IS_CELL_MERGED" SCONAME="RP_IS_MERGED" VERSION="1" LANGU="E" CMPTYPE="1" MTDTYPE="0" EDITORDER="3 " DISPID="0 " PARDECLTYP="3" PARPASSTYP="0" TYPTYPE="1" TYPE="ABAP_BOOL"/>
|
||||||
|
<exception CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="IS_CELL_MERGED" SCONAME="ZCX_EXCEL" VERSION="1" LANGU="E" DESCRIPT="Exceptions for ABAP2XLSX" MTDTYPE="0" EDITORDER="1 "/>
|
||||||
|
<source>method IS_CELL_MERGED.
|
||||||
|
DATA lt_merge_range TYPE string_table.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS <lv_merge_range> LIKE LINE OF lt_merge_range.
|
||||||
|
|
||||||
|
|
||||||
|
lt_merge_range = me->get_merge( ).
|
||||||
|
|
||||||
|
LOOP AT lt_merge_range ASSIGNING <lv_merge_range>.
|
||||||
|
rp_is_merged = zcl_excel_common=>is_cell_in_range(
|
||||||
|
ip_column = ip_column
|
||||||
|
ip_row = ip_row
|
||||||
|
ip_range = <lv_merge_range> ).
|
||||||
|
IF rp_is_merged = abap_true.
|
||||||
|
EXIT.
|
||||||
|
ENDIF.
|
||||||
|
ENDLOOP.
|
||||||
|
endmethod.</source>
|
||||||
</method>
|
</method>
|
||||||
<method CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="PRINT_TITLE_SET_RANGE" VERSION="1" LANGU="E" DESCRIPT="Update range for print title" EXPOSURE="0" STATE="1" EDITORDER="58 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
|
<method CLSNAME="ZCL_EXCEL_WORKSHEET" CMPNAME="PRINT_TITLE_SET_RANGE" VERSION="1" LANGU="E" DESCRIPT="Update range for print title" EXPOSURE="0" STATE="1" EDITORDER="58 " DISPID="0 " MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
|
||||||
<source>method PRINT_TITLE_SET_RANGE.
|
<source>method PRINT_TITLE_SET_RANGE.
|
||||||
|
|
|
@ -142,6 +142,23 @@ START-OF-SELECTION.
|
||||||
column_dimension = lo_worksheet->get_column_dimension( 'C' ).
|
column_dimension = lo_worksheet->get_column_dimension( 'C' ).
|
||||||
column_dimension->set_auto_size( ip_auto_size = abap_true ).
|
column_dimension->set_auto_size( ip_auto_size = abap_true ).
|
||||||
|
|
||||||
|
" Add sheet for merged cells
|
||||||
|
lo_worksheet = lo_excel->add_new_worksheet( ).
|
||||||
|
lo_worksheet->set_title( ip_title = 'Merged cells' ).
|
||||||
|
|
||||||
|
lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'This is a very long header text' ).
|
||||||
|
lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = 'Some data' ).
|
||||||
|
lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = 'Some more data' ).
|
||||||
|
|
||||||
|
lo_worksheet->set_merge(
|
||||||
|
EXPORTING
|
||||||
|
ip_column_start = 'A'
|
||||||
|
ip_column_end = 'C'
|
||||||
|
ip_row = 1 ).
|
||||||
|
|
||||||
|
column_dimension = lo_worksheet->get_column_dimension( 'A' ).
|
||||||
|
column_dimension->set_auto_size( ip_auto_size = abap_true ).
|
||||||
|
|
||||||
lo_excel->set_active_sheet_index( i_active_worksheet = 1 ).
|
lo_excel->set_active_sheet_index( i_active_worksheet = 1 ).
|
||||||
|
|
||||||
*** Create output
|
*** Create output
|
||||||
|
|
Loading…
Reference in New Issue
Block a user