导语:最近在利用abap2xls做excel的导出,不同的是需要动态计算有多少列,分别把数据指定到ABCDE列当中去,所以有需求对字母进行递增递减的计算,例如:A+1=C Z+1=AA,
一、原理
原理是利用字母对应的unicode编码,A-Z的unicode的编码是65-99,先将字母转换成unicode编码进行数学运算并进行2位数的同步进位,再根据得到的unicode编码拆分转换为字母,再拼接到一起,具体代码和测试结果如下。
二、代码示例
这里封装到Henry的工具箱中


METHOD letter_calculation.
"实现字母加减 (EXCEL使用 最多支持999列)
DATA : lv_single TYPE i,
lv_ten TYPE i,
lv_hundreds TYPE i,
lv_strlen TYPE i.
DATA : lv_single_cal TYPE i,
lv_ten_cal TYPE i,
lv_hundreds_cal TYPE i.
DATA : lv_letter TYPE char3.
lv_letter = iv_letter.
"计算输入字母的长度
lv_strlen = strlen( lv_letter ).
CASE lv_strlen.
WHEN '1'.
lv_letter = | { lv_letter }|.
WHEN '2'.
lv_letter = | { lv_letter }|.
WHEN OTHERS.
ENDCASE.
"识别每一位的unicode编码
IF lv_letter+2(1) IS NOT INITIAL.
lv_single = cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter+2(1) ) ).
ENDIF.
IF lv_letter+1(1) IS NOT INITIAL.
lv_ten = cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter+1(1) ) ).
ELSE.
lv_ten = 64.
ENDIF.
IF lv_letter(1) IS NOT INITIAL.
lv_hundreds = cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter(1) ) ).
ELSE.
lv_hundreds = 64.
ENDIF.
"识别每一位增加了几位
lv_single_cal = iv_numc MOD 26.
lv_ten_cal = iv_numc DIV 26.
lv_hundreds_cal = iv_numc DIV 26 DIV 26.
CASE iv_sign.
WHEN '+'.
lv_single = lv_single + lv_single_cal.
IF lv_single > 90. "如果超过Z 要进一位
lv_single = lv_single - 90 + 65 - 1.
lv_ten_cal = lv_ten_cal + 1.
ENDIF.
lv_ten = lv_ten + lv_ten_cal.
IF lv_ten > 90 .
lv_ten = lv_ten - 90 + 65 - 1.
lv_hundreds_cal = lv_hundreds_cal + 1.
ENDIF.
lv_hundreds = lv_hundreds_cal + lv_hundreds.
WHEN '-'.
"lv_single = lv_single - lv_hundreds_cal * 10000 - lv_ten_cal * 100 - lv_single_cal.
ENDCASE.
IF lv_hundreds > 90 or lv_single < 65.
EXIT.
ENDIF.
IF lv_hundreds < 65.
CLEAR lv_hundreds.
ENDIF.
IF lv_ten < 65.
CLEAR lv_ten.
ENDIF.
IF lv_single IS NOT INITIAL.
ev_letter+2(1) = cl_abap_conv_in_ce=>uccpi( CONV #( lv_single ) ).
ENDIF.
IF lv_ten IS NOT INITIAL.
ev_letter+1(1) = cl_abap_conv_in_ce=>uccpi( CONV #( lv_ten ) ).
ENDIF.
IF lv_hundreds IS NOT INITIAL.
ev_letter(1) = cl_abap_conv_in_ce=>uccpi( CONV #( lv_hundreds ) ).
ENDIF.
CONDENSE ev_letter.
ENDMETHOD.
三、测试结果
计算应该结果同Excel的列一样,A+3=D,AZ+3=BC

作者:小飞猪猪猪猪猪猪猪–CSDN

927

被折叠的 条评论
为什么被折叠?



