SAP ABAP 通过导入EXCEL方式,批量翻译程序

我前面文章写到通过调用API的方式,批量翻译程序,但是有的系统不支持调用第三方的程序,所以本篇将介绍通过导入excel的方式翻译

  1. 下载模板。
    效果如下图。能够通过点击【模板下载】按钮,获取到指定程序的文本元素,通过ABAP2XLS的方式,下载到EXCEL中

    (请确保系统导入了ABAP2XLS的包,如果没有则建议下载SMW0的空模板,手填数据)

    在我的程序中,不包含CA4的获取,即GUI自定义按钮的元素,如果有需求,可以自行在代码中新增。
    在这里插入图片描述
    分三步:

1.子屏幕,输入程序(创建子程序部分略),只需要记住Dynpro类型选择对话框然后,CALL sreen的时候要限制显示位置,否则会显示为全屏。

  "输入需要翻译的程序
  CALL SCREEN 0001 STARTING AT 10  5  ENDING AT 50 10  .
  CHECK gv_prog IS NOT INITIAL."检查是否输入了程序(不会校验程序是否存在
  不存在就是空模板
  1. 获取模板数据,用于ABAP2XLS下载模板.
    模板如图。
    在这里插入图片描述
 "下载EXCEL
  DATA:
    lv_key    LIKE wwwdatatab,
    lv_rc     LIKE sy-subrc,
    lv_temp   TYPE c,
    lv_lines  TYPE i VALUE 1,
    lv_action TYPE i,
    lv_name   TYPE string,
    lv_path   TYPE string,
    lv_objid  TYPE wwwdata-objid VALUE 'ZTEST_TRAN'.
  CONSTANTS:
    cns_mi   TYPE char2  VALUE 'MI',
    cns_xlsx TYPE string VALUE '.XLSX'.
  CLEAR:lv_rc,lv_temp, lv_key.

  SELECT SINGLE wwwdata~relid wwwdata~objid
      INTO CORRESPONDING FIELDS OF lv_key
      FROM wwwdata
      WHERE wwwdata~relid = cns_mi
        AND wwwdata~objid = lv_objid
        AND wwwdata~srtf2 = 0.
  IF sy-subrc NE 0.
    MESSAGE 'EXCEL模板不存在!' TYPE 'S' DISPLAY LIKE 'E'."EXCEL模板不存在!
    RETURN.
  ENDIF.

  CONCATENATE 'Trans_' gv_prog '.XLSX' INTO lv_name .

  DATA l_desktopdirectory TYPE string.        "定义路径变量
  CALL METHOD cl_gui_frontend_services=>get_desktop_directory    "读取桌面路径
    CHANGING
      desktop_directory = l_desktopdirectory.

  CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
    EXPORTING
      file_filter       = cns_xlsx
      default_file_name = lv_name
      initial_directory = l_desktopdirectory
    IMPORTING
      fullpath          = lv_path
      user_action       = lv_action.

  IF sy-subrc = 0 AND lv_action <> 9.
    c_path = lv_path.

    DATA:lv_destination TYPE rlgrap-filename.
    lv_destination = c_path.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lv_key
        destination = lv_destination
      IMPORTING
        rc          = lv_rc
      CHANGING
        temp        = lv_temp.
  ENDIF.
  1. 获取程序文本元素(只有文本元素+事务代码)
*----获取程序的翻译数据
*--一般只有 文本元素:PRT4 , 事务代码:TRANS

  DATA:lt_pcx_s1 LIKE TABLE OF lxe_pcx_s1,
       ls_pcx_s1 TYPE lxe_pcx_s1.
  DATA:lv_objname TYPE lxeobjname.
*-----文本元素:PRT4
  SELECT DISTINCT name FROM trdir INTO TABLE @DATA(lt_trdir) WHERE name = @gv_prog.

  LOOP AT lt_trdir INTO DATA(ls_trdir).
    lv_objname = ls_trdir-name.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ_RPT4'
      EXPORTING
        t_r3_lang = '*'
        s_r3_lang = '1'
        o_r3_lang = '*'
        objtype   = 'RPT4'
        objname   = lv_objname
      TABLES
        lt_pcx_s1 = lt_pcx_s1.

    gt_rpt4[] = lt_pcx_s1[].
    CLEAR:ls_trdir,lt_pcx_s1[].
  ENDLOOP.

*----事务代码:TRANS
  SELECT tcode FROM tstc INTO TABLE @DATA(lt_tstc) WHERE pgmna = @gv_prog.
  LOOP AT lt_tstc INTO DATA(ls_tstc).
    lv_objname = ls_tstc-tcode.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ_TRAN'
      EXPORTING
        t_r3_lang = '1'
        s_r3_lang = '1'
        objtype   = 'TRAN'
        objname   = lv_objname
      TABLES
        lt_pcx_s1 = lt_pcx_s1.
    gt_tran[] = lt_pcx_s1[].
    CLEAR:ls_trdir,lt_pcx_s1[].
    CLEAR:ls_tstc.
  ENDLOOP.
  1. 上载模板
    将标准的ALSM_EXCEL_TO_INTERNAL_TABLE,复制了一份,
    ZALSM_EXCEL_TO_INTERNAL_TABLE,新增了sheet页选择,如果不需要,可使用标准的函数。
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename    = p_fname
      i_begin_col = 1
      i_begin_row = 3
      i_end_col   = 6
      i_end_row   = 1048576
      sheet_name  = 'Sheet1'
    TABLES
      intern      = lt_excel.
  1. 上载之后会对数据进行检查 长度是否符合,现在因为会根据导入数据修改长度,所以校验部分可以去掉。 不过事务码只能36长,建议保留。
  2. 翻译:
    5.1 首先会对文件名进行正则匹配,取出程序名。
  "根据正则表达取出程序名
  IF gv_prog IS INITIAL.
    pattern = 'Z.*(?=\.)'.
    w_text = p_fname.
    matcher   = cl_abap_matcher=>create( pattern = pattern  text  = w_text  ).
    matches = matcher->find_all( ).
    READ TABLE matches INTO match INDEX 1.
    gv_prog = w_text+match-offset(match-length).
  ENDIF.

5.2 根据翻译长度,更改文本元素的长度
5.3 翻译。

具体可参考代码

*----------------------------------------------所有代码如下-----------------------------------

*&---------------------------------------------------------------------*
*& Report ZTEST_TRAN
*&---------------------------------------------------------------------*
*&
*&  SYS:THINKWAY DEV
*&  ver: 1.0

*&使用说明:
*  1.模拟SE63的翻译过程,所有代码值可在程序查询。例如按钮翻译,点开GUI状态栏->转到->翻译。会看到几个对象,<XX>里面的就是翻译类型,即SE63界面选择A5下的选项
*   双击的一栏就是对象名称,所有填写翻译的上面一栏,就是文本码,可能有的中间有很多空格,但是确实是这样子的。
*  1.1. 翻译值填写顺序为:翻译类型,对象名称(程序铭、表明、数据元素 etc.),文本码,翻译文本。
*
*  2.目前仅对普通程序进行翻译,并未对SmartForms进行翻译,SSF现翻译方式为复制模板并进行硬翻译。
*
*  3.事务码长度不能超过36位,文本符号最大长度设置40以上。
*
*  4.视图翻译来源于SE11数据表及数据元素的翻译
*
*  5.黄底列为描述列,非必填。
*
*  6.文本符号的文本码,拼接格式为【TEXT    001            40】, 表示TEXT-001 最大长度为40,此处的40是自己设置的,所以文本码会根据长度变化而变化

*---2024/12/11 新增
*----1.下载模板时,直接获取指定程序的文本元素。
*----2.写入翻译时,同时将目标文本元素长度扩充到合适的长度。
*----3.!!!!!!!!!!!!!!!!!!!!! 翻译为全覆盖式更新,禁止只导入一部分翻译!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*&
*&---------------------------------------------------------------------*
REPORT zzxzw043.

INCLUDE zzxzw043_top. "数据定义

*初始化块
INITIALIZATION.
  sscrfields-functxt_01 = icon_export && '模版下载'.

AT SELECTION-SCREEN.

  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_get_model USING g_model.
    WHEN OTHERS.
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = ''
      def_path         = 'C:\'
      mask             = ',EXCEL文件(*.xlsx),*.*,'
      mode             = 'O'
      title            = '请选择文件路径'
    IMPORTING
      filename         = p_fname
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

START-OF-SELECTION.

  IF p_fname IS INITIAL .
    MESSAGE '文件路径不能为空' TYPE 'S'  DISPLAY LIKE 'E'. "文件路径不能为空
    STOP.
  ENDIF.
  PERFORM frm_upload_data.    "导入模板上载

  PERFORM frm_check.  "数据检查

  IF gt_data1[]  IS NOT INITIAL.
    PERFORM frm_alv_long.  "长度超过限制翻译会显示在这里
  ELSE.
    PERFORM frm_tran. "翻译
    PERFORM frm_alv. "翻译结果
  ENDIF.


END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_upload_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload_data .

  FIELD-SYMBOLS:  <field> TYPE any.

  DATA: lt_excel  TYPE TABLE OF zalsmex_tabline,
        lst_excel TYPE zalsmex_tabline.
  DATA:workbook    TYPE ole2_object,
       application TYPE ole2_object.       "excel object

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename    = p_fname
      i_begin_col = 1
      i_begin_row = 3
      i_end_col   = 6
      i_end_row   = 1048576
      sheet_name  = 'Sheet1'
    TABLES
      intern      = lt_excel.
  IF sy-subrc = 0.
    "保存并关闭Excel
    CALL METHOD OF workbook 'Save'.
    CALL METHOD OF workbook 'Close'
      EXPORTING
        #1 = 0.
    CALL METHOD OF application 'Quit'.
  ENDIF.

  IF lt_excel[] IS INITIAL.
    MESSAGE 'Excel文件没有数据'  TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  SORT lt_excel BY row col.
  LOOP AT lt_excel INTO lst_excel.

    AT NEW row.
      CLEAR gs_data.
    ENDAT.

    ASSIGN COMPONENT lst_excel-col OF STRUCTURE gs_data TO <field>.
    <field> = lst_excel-value.

    AT END OF row.
      APPEND gs_data TO gt_data.
    ENDAT.
  ENDLOOP.


  IF  gt_data[] IS INITIAL .
    MESSAGE '导入数据失败' TYPE 'S'  DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_tran
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_tran .
  DATA  BEGIN OF hirst2 .
  INCLUDE STRUCTURE textpool.
  DATA  END OF hirst2.
  DATA:lt_hirst2 LIKE TABLE OF hirst2.
  DATA:lv_objname TYPE lxeobjname.
  DATA:lv_txt_len TYPE i.
  DATA:lv_fname TYPE char255.

  DATA: matcher TYPE REF TO cl_abap_matcher,
        matches TYPE match_result_tab,
        match   LIKE LINE OF matches,
        w_text  TYPE string,
        pattern TYPE string.

  "根据正则表达取出程序名
  IF gv_prog IS INITIAL.
    pattern = 'Z.*(?=\.)'.
    w_text = p_fname.
    matcher   = cl_abap_matcher=>create( pattern = pattern  text  = w_text  ).
    matches = matcher->find_all( ).
    READ TABLE matches INTO match INDEX 1.
    gv_prog = w_text+match-offset(match-length).
  ENDIF.


  "调整文本元素长度
  READ TEXTPOOL gv_prog INTO lt_hirst2[] LANGUAGE sy-langu.

  CLEAR:lt_pcx1.
  LOOP AT gt_data INTO gs_data.

*---预写入翻译文本
    CASE gs_data-type.
      WHEN 'RPT4'.
        ls_pcxs-textkey = gs_data-textkey. "键值
        ls_pcxs-t_text  = gs_data-elang.  "翻译
        ls_pcxs-s_text  = gs_data-txt.
        APPEND ls_pcxs TO lt_pcx.

      WHEN 'TRAN'.
        ls_pcxs-textkey = gs_data-textkey. "键值
        ls_pcxs-t_text  = gs_data-elang.  "翻译
        ls_pcxs-s_text  = gs_data-txt.
        APPEND ls_pcxs TO lt_pcx1.
    ENDCASE.

    lv_txt_len = strlen( gs_data-elang )."翻译长度

    "预写入更新后文本元素长度
    READ TABLE lt_hirst2 ASSIGNING FIELD-SYMBOL(<fs_hirst2>) WITH KEY entry = gs_data-txt.
    IF sy-subrc = 0.
      <fs_hirst2>-length = lv_txt_len.
    ENDIF.

    CLEAR:gs_data,lv_txt_len,ls_pcxs.
  ENDLOOP.
  "更新文本元素长度
  INSERT TEXTPOOL gv_prog FROM lt_hirst2 LANGUAGE sy-langu STATE 'A'.
  COMMIT WORK AND WAIT.
  CLEAR:lt_hirst2[].

  lv_objname = gv_prog.
*-----文本元素:PRT4
  IF lt_pcx[] IS NOT INITIAL.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE' "写入翻译
      EXPORTING
        t_lang    = 'enUS'
        s_lang    = 'zhCN'
        custmnr   = '999999'
        objtype   = 'RPT4' " 翻译类型
        objname   = lv_objname "翻译对象
      IMPORTING
        pstatus   = gs_data-flag  "是否成功
      TABLES
        lt_pcx_s1 = lt_pcx.
    IF gs_data-flag = 'F'.
      gs_data-icon = icon_led_red.
    ELSE.
      gs_data-icon = icon_led_green.
    ENDIF.
    MODIFY  gt_data FROM gs_data TRANSPORTING icon WHERE icon IS INITIAL AND type = 'RPT4'.
    CLEAR:gs_data.
  ENDIF.


*-----写入TRAN
  IF lt_pcx1[] IS NOT INITIAL.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE' "写入翻译
      EXPORTING
        t_lang    = 'enUS'
        s_lang    = 'zhCN'
        custmnr   = '999999'
        objtype   = 'TRAN' " 翻译类型
        objname   = lv_objname "翻译对象
      IMPORTING
        pstatus   = gs_data-flag  "是否成功
      TABLES
        lt_pcx_s1 = lt_pcx1.
    IF gs_data-flag = 'F'.
      gs_data-icon = icon_led_red.
    ELSE.
      gs_data-icon = icon_led_green.
    ENDIF.
    MODIFY  gt_data FROM gs_data TRANSPORTING icon WHERE icon IS INITIAL AND type = 'TRAN'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_alv_long
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_long .


  DATA:ls_fcat TYPE lvc_s_fcat.
  DATA:lt_fcat TYPE lvc_t_fcat.
  DATA:ls_layo TYPE lvc_s_layo.
  DATA:ls_glay  TYPE lvc_s_glay. "定义

  ls_glay-edt_cll_cb = 'X'.  " 打上自动更新并刷新标记
  ls_layo-box_fname = 'SEL'.
  ls_layo-cwidth_opt = 'X'.    "最优宽

  REFRESH lt_fcat.
  DEFINE macr_fcat.
    ls_fcat-fieldname = &1.
    ls_fcat-scrtext_l = &2.
    ls_fcat-scrtext_m = &2.
    ls_fcat-scrtext_s = &2.
    ls_fcat-coltext = &2.
    APPEND ls_fcat TO lt_fcat.
    CLEAR ls_fcat.
  END-OF-DEFINITION.

  macr_fcat 'TYPE'  '翻译类型'   .
  macr_fcat 'TYPE_TXT'  '翻译类型描述'   .
  macr_fcat 'JNAME'  '对象'   .
  macr_fcat 'TEXTKEY'  '文本码'   .
  macr_fcat 'ELANG'  '翻译'    .
  macr_fcat 'TXT'  '原文'    .
  macr_fcat 'LEN_I'  '最大长度'    .
  macr_fcat 'LEN'  '超出长度'    .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-cprog
      i_callback_pf_status_set = 'SUB_PF_STATUS_SET'
      i_callback_user_command  = 'SUB_USER_COMMAND'
      is_layout_lvc            = ls_layo
      it_fieldcat_lvc          = lt_fcat
*     i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_data1[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

ENDFORM.



FORM sub_pf_status_set USING pa_extab TYPE slis_t_extab .

  SET PF-STATUS 'ZTEST_TRAN'.
  SET TITLEBAR '超过36位的数据'.
ENDFORM  .


FORM sub_user_command USING r_ucomm TYPE sy-ucomm
                            r_selfield TYPE slis_selfield.


  CASE r_ucomm.
    WHEN OTHERS.
  ENDCASE.

  r_selfield-col_stable = 'X'.
  r_selfield-row_stable = 'X'.
  r_selfield-refresh = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GET_MODEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_get_model  USING    p_objid TYPE wwwdata-objid.
  DATA: ls_objdata     LIKE wwwdatatab,
        lv_destination LIKE rlgrap-filename,
        lv_rc          LIKE sy-subrc,
        lv_errtxt      TYPE string,
        lv_fullpath    TYPE string,
        lv_extension   TYPE string,
        lv_fname       LIKE rlgrap-filename,
        ls_formkey     LIKE  wwwdatatab.
  DATA:
    lv_path TYPE string,
    lv_line TYPE i.
  DATA:lt_value LIKE TABLE OF sval.
  "输入需要翻译的程序
  CALL SCREEN 0001 STARTING AT 10  5  ENDING AT 50 10  .

  CHECK gv_prog IS NOT INITIAL.

  "获取模板
  PERFORM frm_download_template USING gv_prog CHANGING lv_path.
  "下载程序的文本元素
  PERFORM frm_data_get  USING gv_prog.."获取需要翻译的数据
**------------------设置EXCEL-------------------------------------*
  PERFORM frm_excel_defult."初始化

  go_worksheet = go_excel->get_active_worksheet( ).
  go_worksheet->set_title( ip_title = 'Sheet1' ).   "SHEET名
*&--定位单元格,给单元格赋值
  lv_line = 2.

  LOOP AT gt_rpt4 INTO gs_rpt4.
    lv_line += 1.

    go_worksheet->set_cell( ip_column  = 'A' ip_row    = lv_line   ip_value = 'RPT4'  ip_style = gv_style_data )."翻译类型
    go_worksheet->set_cell( ip_column  = 'C' ip_row    = lv_line   ip_value = gv_prog  ip_style = gv_style_data )."对象名称
    go_worksheet->set_cell( ip_column  = 'D' ip_row    = lv_line   ip_value = gs_rpt4-textkey ip_style = gv_style_data )."文本码
    go_worksheet->set_cell( ip_column  = 'F' ip_row    = lv_line   ip_value = gs_rpt4-s_text ip_style = gv_style_data )."翻译原文
    CLEAR:gs_rpt4.
  ENDLOOP.

  LOOP AT gt_tran INTO gs_tran.
    lv_line += 1.

    go_worksheet->set_cell( ip_column  = 'A' ip_row    = lv_line   ip_value = 'TRAN'  ip_style = gv_style_data )."翻译类型
    go_worksheet->set_cell( ip_column  = 'C' ip_row    = lv_line   ip_value = gv_prog  ip_style = gv_style_data )."对象名称
    go_worksheet->set_cell( ip_column  = 'D' ip_row    = lv_line   ip_value = gs_tran-textkey ip_style = gv_style_data )."文本码
    go_worksheet->set_cell( ip_column  = 'F' ip_row    = lv_line   ip_value = gs_tran-s_text ip_style = gv_style_data )."翻译原文
    CLEAR:gs_tran.
  ENDLOOP.

*------------------------下载文件并保存------------------------------------------------*
  " Create xlsx
  CREATE OBJECT go_excel_writer TYPE zcl_excel_writer_2007.
  DATA(lv_file_xstring) = go_excel_writer->write_file( go_excel ). " xstring

*     Convert to binary
  DATA(lt_file_tab) = cl_bcs_convert=>xstring_to_solix( iv_xstring  = lv_file_xstring ). " tab
  DATA(lv_bytecount) = xstrlen( lv_file_xstring ). " 文件xstring
  " download
  cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount
                                                    filename     = lv_path
                                                    filetype     = 'BIN'
                                           CHANGING data_tab     = lt_file_tab ).
  CLEAR: lt_file_tab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv .

  DATA:ls_fcat TYPE lvc_s_fcat.
  DATA:lt_fcat TYPE lvc_t_fcat.
  DATA:ls_layo TYPE lvc_s_layo.
  DATA:ls_glay  TYPE lvc_s_glay. "定义

  ls_glay-edt_cll_cb = 'X'.  " 打上自动更新并刷新标记
  ls_layo-box_fname = 'SEL'.
  ls_layo-cwidth_opt = 'X'.    "最优宽

  REFRESH lt_fcat.
  DEFINE macr_fcat.
    ls_fcat-fieldname = &1.
    ls_fcat-scrtext_l = &2.
    ls_fcat-scrtext_m = &2.
    ls_fcat-scrtext_s = &2.
    ls_fcat-coltext = &2.
    APPEND ls_fcat TO lt_fcat.
    CLEAR ls_fcat.
  END-OF-DEFINITION.

  macr_fcat 'ICON'  '翻译状态'   .
  macr_fcat 'TYPE'  '翻译类型'   .
  macr_fcat 'TYPE_TXT'  '翻译类型描述'   .
  macr_fcat 'JNAME'  '对象'   .
  macr_fcat 'TEXTKEY'  '文本码'   .
  macr_fcat 'ELANG'  '翻译'    .
  macr_fcat 'TXT'  '原文'    .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-cprog
      i_callback_pf_status_set = 'SUB_PF_STATUS_SET1'
      i_callback_user_command  = 'SUB_USER_COMMAND'
      is_layout_lvc            = ls_layo
      it_fieldcat_lvc          = lt_fcat
*     i_default                = 'X'
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_data[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.
FORM sub_pf_status_set1 USING pa_extab TYPE slis_t_extab .

  SET PF-STATUS 'ZTEST_TRAN'.
  SET TITLEBAR '翻译结果'.
ENDFORM  .
*&---------------------------------------------------------------------*
*& Form frm_check
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check .

  DATA:lv_lenth TYPE i.


  DATA:lv_len TYPE i.
  REFRESH gt_data1.
  LOOP AT gt_data INTO gs_data.

    IF gs_data-textkey = 'TTEXT'. " 事务码不能超过36位
      lv_len = cl_abap_list_utilities=>dynamic_output_length( gs_data-elang ).
      IF lv_len > 36.
        gs_data-len = lv_len - 36.
        APPEND gs_data TO gt_data1.
      ENDIF.
    ENDIF.


    IF gs_data-textkey = 'SCRTEXT_S'."数据元素短文本

      CLEAR lt_pcx1.
      CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'   "获取文本码
        EXPORTING
          t_lang    = 'enUS'
          s_lang    = 'zhCN'
          custmnr   = '999999'
          objtype   = gs_data-type
          objname   = gs_data-jname
        TABLES
          lt_pcx_s1 = lt_pcx1.

      READ TABLE lt_pcx1 INTO ls_pcxs WITH KEY textkey = 'SCRTEXT_S'.
      IF sy-subrc = 0.
        lv_lenth = ls_pcxs-unitmlt.
        CLEAR ls_pcxs.
      ENDIF.

      CLEAR lv_len.  "判断是否超过最小限制
      lv_len = cl_abap_list_utilities=>dynamic_output_length( gs_data-elang ).
      IF lv_len > lv_lenth.
        gs_data-len_i = lv_lenth.
        gs_data-len = lv_len - lv_lenth.
        APPEND gs_data TO gt_data1.
      ENDIF.
    ENDIF.

    CLEAR:lv_len,gs_data,lv_lenth.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_PATH
*&---------------------------------------------------------------------*
FORM frm_download_template USING gv_prog  CHANGING C_path.

  "下载EXCEL
  DATA:
    lv_key    LIKE wwwdatatab,
    lv_rc     LIKE sy-subrc,
    lv_temp   TYPE c,
    lv_lines  TYPE i VALUE 1,
    lv_action TYPE i,
    lv_name   TYPE string,
    lv_path   TYPE string,
    lv_objid  TYPE wwwdata-objid VALUE 'ZTEST_TRAN'.
  CONSTANTS:
    cns_mi   TYPE char2  VALUE 'MI',
    cns_xlsx TYPE string VALUE '.XLSX'.
  CLEAR:lv_rc,lv_temp, lv_key.

  SELECT SINGLE wwwdata~relid wwwdata~objid
      INTO CORRESPONDING FIELDS OF lv_key
      FROM wwwdata
      WHERE wwwdata~relid = cns_mi
        AND wwwdata~objid = lv_objid
        AND wwwdata~srtf2 = 0.
  IF sy-subrc NE 0.
    MESSAGE 'EXCEL模板不存在!' TYPE 'S' DISPLAY LIKE 'E'."EXCEL模板不存在!
    RETURN.
  ENDIF.

  CONCATENATE 'Trans_' gv_prog '.XLSX' INTO lv_name .

  DATA l_desktopdirectory TYPE string.        "定义路径变量
  CALL METHOD cl_gui_frontend_services=>get_desktop_directory    "读取桌面路径
    CHANGING
      desktop_directory = l_desktopdirectory.

  CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
    EXPORTING
      file_filter       = cns_xlsx
      default_file_name = lv_name
      initial_directory = l_desktopdirectory
    IMPORTING
      fullpath          = lv_path
      user_action       = lv_action.

  IF sy-subrc = 0 AND lv_action <> 9.
    c_path = lv_path.

    DATA:lv_destination TYPE rlgrap-filename.
    lv_destination = c_path.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lv_key
        destination = lv_destination
      IMPORTING
        rc          = lv_rc
      CHANGING
        temp        = lv_temp.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL_DEFULT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_excel_defult .

  "定义
  DATA:lt_mime_data TYPE TABLE OF w3mime,
       ls_id        TYPE wwwdataid,
       ls_key       TYPE wwwdatatab.
  DATA:lv_string       TYPE string,
       lv_xstring      TYPE xstring,
       lv_input_length TYPE i.

*-----获取SMW0模板
  ls_key-relid ='MI'.
  ls_key-objid = 'ZTEST_TRAN'."模板ID
  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      key               = ls_key
    TABLES
      mime              = lt_mime_data
    EXCEPTIONS
      wrong_object_type = 1
      import_error      = 2
      OTHERS            = 3.

  SELECT SINGLE value
  FROM  wwwparams
  WHERE  relid       EQ @ls_key-relid
  AND    objid       EQ @ls_key-objid
  AND name EQ 'filesize'
  INTO @DATA(lv_para_value).

  lv_input_length = lv_para_value.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_input_length
    IMPORTING
      buffer       = lv_xstring
    TABLES
      binary_tab   = lt_mime_data
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  cl_gui_cfw=>flush( ). " 初始化刷新

*---读取模板信息
  CREATE OBJECT go_reader TYPE zcl_excel_reader_2007.
  go_excel = go_reader->load( i_excel2007 =  lv_xstring ).

  go_style_data                        = go_excel->add_new_style( ).
*  go_style_data->FONT->NAME            = ZCL_EXCEL_STYLE_FONT=>C_NAME_ARIAL.
*  go_style_data->FONT->SCHEME          = ZCL_EXCEL_STYLE_FONT=>C_SCHEME_NONE.
  go_style_data->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center."左右
  go_style_data->alignment->vertical   = zcl_excel_style_alignment=>c_vertical_center."上下调整
*  go_style_data->FONT->SIZE            = 18.
*  go_style_data->ALIGNMENT->WRAPTEXT   = ABAP_TRUE. "自动换行
*  go_style_data->FONT->BOLD            = ABAP_TRUE. "加粗
  gv_style_data                        = go_style_data->get_guid( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_data_get
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_data_get USING gv_prog.
*----获取程序的翻译数据
*--一般只有 文本元素:PRT4 , 事务代码:TRANS

  DATA:lt_pcx_s1 LIKE TABLE OF lxe_pcx_s1,
       ls_pcx_s1 TYPE lxe_pcx_s1.
  DATA:lv_objname TYPE lxeobjname.
*-----文本元素:PRT4
  SELECT DISTINCT name FROM trdir INTO TABLE @DATA(lt_trdir) WHERE name = @gv_prog.

  LOOP AT lt_trdir INTO DATA(ls_trdir).
    lv_objname = ls_trdir-name.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ_RPT4'
      EXPORTING
        t_r3_lang = '*'
        s_r3_lang = '1'
        o_r3_lang = '*'
        objtype   = 'RPT4'
        objname   = lv_objname
      TABLES
        lt_pcx_s1 = lt_pcx_s1.

    gt_rpt4[] = lt_pcx_s1[].
    CLEAR:ls_trdir,lt_pcx_s1[].
  ENDLOOP.

*----事务代码:TRANS
  SELECT tcode FROM tstc INTO TABLE @DATA(lt_tstc) WHERE pgmna = @gv_prog.
  LOOP AT lt_tstc INTO DATA(ls_tstc).
    lv_objname = ls_tstc-tcode.
    CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ_TRAN'
      EXPORTING
        t_r3_lang = '1'
        s_r3_lang = '1'
        objtype   = 'TRAN'
        objname   = lv_objname
      TABLES
        lt_pcx_s1 = lt_pcx_s1.
    gt_tran[] = lt_pcx_s1[].
    CLEAR:ls_trdir,lt_pcx_s1[].
    CLEAR:ls_tstc.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0001 INPUT.
  ok_code  = sy-ucomm .
  CASE ok_code.
    WHEN 'C_OK'.
      LEAVE TO SCREEN 0.
    WHEN 'C_NO'.
      CLEAR:gv_prog.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0001 OUTPUT.
  SET PF-STATUS '443001'.
* SET TITLEBAR 'xxx'.
ENDMODULE.

TOP

*&---------------------------------------------------------------------*
*& 包含               ZZXZW043_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
DATA g_model TYPE wwwdata-objid VALUE 'ZTEST_TRAN'."模板名称

DATA:BEGIN OF gs_data,

       type     TYPE lxeobjtype,   "类型 SE63->选择对象
       type_txt TYPE lxeobjname,   "类型说明
       jname    TYPE lxeobjname,   "对象名称
       textkey  TYPE lxeunitlin,  "文本码
       elang    TYPE lxeunitlin,   "翻译
       txt      TYPE lxeunitlin,   "源文本

       flag     TYPE lxestatprc,   "翻译是否成功
       icon     TYPE icon_d,
       len_i    TYPE i,            "最大长度
       len      TYPE i,            "超出长度
       sel      TYPE c,
     END OF gs_data .

DATA gt_data LIKE TABLE OF gs_data .
DATA gt_data1 LIKE TABLE OF gs_data .

DATA:gs_rpt4 TYPE lxe_pcx_s1. "程序对应的
DATA:gt_rpt4 LIKE TABLE OF gs_rpt4.
DATA:gs_tran LIKE gs_rpt4,
     gt_tran LIKE gt_rpt4.


DATA :lt_pcx TYPE TABLE OF LXE_PCX_s1 .
DATA :lt_pcx1 TYPE TABLE OF LXE_PCX_s1 .
DATA :ls_pcxs TYPE  LXE_PCX_s1 .
DATA lv_pstatus TYPE lxestatprc . "处理状态

DATA:gv_prog TYPE char20,
     gv_ok   TYPE c,
     gv_no   TYPE c.
DATA ok_code TYPE sy-ucomm .
DATA:
  go_excel        TYPE REF TO zcl_excel,            "
  go_excel_writer TYPE REF TO zif_excel_writer,
  go_worksheet    TYPE REF TO zcl_excel_worksheet,
  go_border       TYPE REF TO zcl_excel_style_border,
  go_reader       TYPE REF TO zif_excel_reader.
DATA: go_style_data TYPE REF TO zcl_excel_style, "明细数据
      gv_style_data TYPE zexcel_cell_style.
FIELD-SYMBOLS <fs> LIKE ls_pcxs.

SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-t01.
  PARAMETERS: p_fname TYPE rlgrap-filename, "上载
              p_testp TYPE c. "测试用
  SELECT-OPTIONS: s_test FOR gs_data-jname.
SELECTION-SCREEN END OF BLOCK blk01.
SELECTION-SCREEN:FUNCTION KEY 1.
"写注释
SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE TEXT-t02.
  SELECTION-SCREEN BEGIN OF LINE .
  SELECTION-SCREEN COMMENT 01(50) TEXT-b01.
  SELECTION-SCREEN END  OF LINE.

  SELECTION-SCREEN BEGIN OF LINE .
  SELECTION-SCREEN COMMENT 01(50) TEXT-b02.
  SELECTION-SCREEN END  OF LINE.

  SELECTION-SCREEN BEGIN OF LINE .
  SELECTION-SCREEN COMMENT 01(50) TEXT-b03.
  SELECTION-SCREEN END  OF LINE.
SELECTION-SCREEN END OF BLOCK blk02 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值