我前面文章写到通过调用API的方式,批量翻译程序,但是有的系统不支持调用第三方的程序,所以本篇将介绍通过导入excel的方式翻译
-
下载模板。
效果如下图。能够通过点击【模板下载】按钮,获取到指定程序的文本元素,通过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."检查是否输入了程序(不会校验程序是否存在
不存在就是空模板
- 获取模板数据,用于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.
- 获取程序文本元素(只有文本元素+事务代码)
*----获取程序的翻译数据
*--一般只有 文本元素: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.
- 上载模板
将标准的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.
- 上载之后会对数据进行检查 长度是否符合,现在因为会根据导入数据修改长度,所以校验部分可以去掉。 不过事务码只能36长,建议保留。
- 翻译:
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 .