1. ***********************************************************************
    2. **----------------------------T Y P E S------------------------------**
    3. ***********************************************************************
    4. TYPES:
    5. BEGIN OF TY_ALV,
    6. SEL TYPE C,
    7. ICON TYPE ICON_D,
    8. MSG TYPE CHAR255,
    9. END OF TY_ALV.
    10. ***********************************************************************
    11. **---------------------------T A B L E S-----------------------------**
    12. ***********************************************************************
    13. TABLES: SSCRFIELDS.
    14. ***********************************************************************
    15. **------------------------V A R I A B L E S--------------------------**
    16. ***********************************************************************
    17. DATA: GT_FIELDCAT TYPE LVC_T_FCAT,
    18. GS_FIELDCAT TYPE LVC_S_FCAT,
    19. GS_LAYOUT TYPE LVC_S_LAYO,
    20. G_OBJID LIKE WWWDATA-OBJID VALUE SY-REPID,
    21. GS_ALV TYPE TY_ALV,
    22. GT_ALV TYPE TABLE OF TY_ALV.
    23. FIELD-SYMBOLS:
    24. <FS_ALV> TYPE TY_ALV.
    25. ***********************************************************************
    26. **--------------------------D E F I N E------------------------------**
    27. ***********************************************************************
    28. DEFINE D_BUILD_FIELDCAT.
    29. GS_FIELDCAT-FIELDNAME = &1.
    30. GS_FIELDCAT-QFIELDNAME = &2.
    31. GS_FIELDCAT-CFIELDNAME = &3.
    32. GS_FIELDCAT-REF_TABLE = &4.
    33. GS_FIELDCAT-REF_FIELD = &5.
    34. GS_FIELDCAT-CONVEXIT = &6.
    35. GS_FIELDCAT-EMPHASIZE = &7.
    36. GS_FIELDCAT-SCRTEXT_L = &8.
    37. GS_FIELDCAT-COLDDICTXT = 'L'.
    38. APPEND GS_FIELDCAT TO GT_FIELDCAT.
    39. CLEAR: GS_FIELDCAT.
    40. END-OF-DEFINITION.
    41. ***********************************************************************
    42. **-----------------S E L E C T I O N---S C R E E N-------------------**
    43. ***********************************************************************
    44. SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE TITLE1.
    45. PARAMETERS P_FILE TYPE RLGRAP-FILENAME LOWER CASE.
    46. PARAMETERS P_ROW TYPE N LENGTH 2 DEFAULT '2' OBLIGATORY.
    47. PARAMETERS P_COL TYPE N LENGTH 2 DEFAULT '1' OBLIGATORY.
    48. SELECTION-SCREEN END OF BLOCK 001.
    49. SELECTION-SCREEN FUNCTION KEY 1.
    50. ***********************************************************************
    51. **-------------------I N I T I A L I Z A T I O N---------------------**
    52. ***********************************************************************
    53. INITIALIZATION.
    54. TITLE1 = '选择条件'.
    55. %_P_FILE_%_APP_%-TEXT = '选择文件'.
    56. %_P_ROW_%_APP_%-TEXT = '开始行'.
    57. %_P_COL_%_APP_%-TEXT = '开始列'.
    58. SSCRFIELDS-FUNCTXT_01 = '@49@下载模板'.
    59. ***********************************************************************
    60. **---------------A T S E L E C T I O N-S C R E E N-------------------**
    61. ***********************************************************************
    62. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
    63. PERFORM SELECT_EXCEL_FILE CHANGING P_FILE.
    64. AT SELECTION-SCREEN.
    65. CASE SSCRFIELDS-UCOMM.
    66. WHEN 'FC01'.
    67. PERFORM DOWNLOAD_TEMPLATE USING G_OBJID 'XLS' '批量导入模板.xls'.
    68. ENDCASE.
    69. ***********************************************************************
    70. **-----------------S T A R T-O F-S E L E C T I O N-------------------**
    71. ***********************************************************************
    72. START-OF-SELECTION.
    73. IF P_FILE IS INITIAL.
    74. MESSAGE '请选择文件' TYPE 'S'.
    75. LEAVE LIST-PROCESSING.
    76. ENDIF.
    77. "读取文件
    78. PERFORM UPLOAD_DATA USING P_ROW P_COL. "数据开始的单元格行、列数,可根据实际情况更改
    79. PERFORM CHECK_DATA.
    80. PERFORM DISPLAY_DATA.
    81. *&---------------------------------------------------------------------*
    82. *& FORM UPLOAD_DATA
    83. *&---------------------------------------------------------------------*
    84. * 读取EXCEL数据
    85. *----------------------------------------------------------------------*
    86. FORM UPLOAD_DATA USING UV_ROW UV_COL .
    87. DATA:LS_STRUCTURE TYPE REF TO DATA.
    88. DATA:LT_EXCEL LIKE ZALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
    89. FIELD-SYMBOLS:<L_FS_INTERN> TYPE ZALSMEX_TABLINE."表头行
    90. FIELD-SYMBOLS:<L_FS_ITEM> TYPE TY_ALV.
    91. FIELD-SYMBOLS:<FIELD>.
    92. DATA:LV_ROW TYPE I,
    93. LV_COL TYPE I.
    94. LV_ROW = UV_ROW.
    95. LV_COL = UV_COL.
    96. CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    97. EXPORTING
    98. FILENAME = P_FILE
    99. I_BEGIN_COL = LV_COL
    100. I_BEGIN_ROW = LV_ROW
    101. I_END_COL = 50
    102. I_END_ROW = 60000
    103. TABLES
    104. INTERN = LT_EXCEL
    105. EXCEPTIONS
    106. INCONSISTENT_PARAMETERS = 1
    107. UPLOAD_OLE = 2
    108. OTHERS = 3.
    109. IF SY-SUBRC <> 0.
    110. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    111. WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    112. ENDIF.
    113. * 转换EXCEL数据到内表
    114. CREATE DATA LS_STRUCTURE LIKE GS_ALV.
    115. LOOP AT LT_EXCEL ASSIGNING <L_FS_INTERN>.
    116. AT NEW ROW.
    117. ASSIGN LS_STRUCTURE->* TO <L_FS_ITEM>.
    118. INSERT GS_ALV INTO TABLE GT_ALV ASSIGNING <L_FS_ITEM>.
    119. ENDAT.
    120. ASSIGN COMPONENT <L_FS_INTERN>-COL OF STRUCTURE <L_FS_ITEM>
    121. TO <FIELD>.
    122. CHECK SY-SUBRC EQ 0.
    123. <FIELD> = <L_FS_INTERN>-VALUE.
    124. ENDLOOP.
    125. ENDFORM. "UPLOAD_DATA
    126. *&---------------------------------------------------------------------*
    127. *& FORM CHECK_DATA
    128. *&---------------------------------------------------------------------*
    129. * TEXT
    130. *----------------------------------------------------------------------*
    131. FORM CHECK_DATA.
    132. DATA: L_FLAG TYPE C,
    133. L_TABIX TYPE I,
    134. L_MSG TYPE STRING,
    135. L_VALUE TYPE STRING,
    136. L_INDEX TYPE I VALUE 1.
    137. DEFINE D_STORE_MESSAGE.
    138. L_FLAG = 'X'.
    139. CALL FUNCTION 'MESSAGE_STORE'
    140. EXPORTING
    141. ARBGB = &1
    142. MSGTY = &2
    143. TXTNR = &3
    144. MSGV1 = &4
    145. MSGV2 = &5
    146. MSGV3 = &6
    147. MSGV4 = &7
    148. ZEILE = L_INDEX.
    149. L_INDEX = L_INDEX + 1.
    150. END-OF-DEFINITION.
    151. CALL FUNCTION 'MESSAGES_INITIALIZE'.
    152. LOOP AT GT_ALV ASSIGNING <FS_ALV>.
    153. ** 示例
    154. * IF GS_EXCEL-FLTYPE = ''.
    155. * L_MSG = '第' && L_TABIX && '行的XX不能为空'.
    156. * D_STORE_MESSAGE: '00' 'E' '001' L_MSG '' '' ''.
    157. * ENDIF.
    158. *
    159. * MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.
    160. * APPEND GS_ALV TO GT_ALV.
    161. * CLEAR GS_ALV.
    162. ENDLOOP.
    163. IF L_FLAG = 'X'.
    164. CALL FUNCTION 'MESSAGES_SHOW'.
    165. LEAVE LIST-PROCESSING.
    166. ENDIF.
    167. ENDFORM. "CHECK_DATA
    168. *&---------------------------------------------------------------------*
    169. *& FORM SELECT_EXCEL_FILE
    170. *&---------------------------------------------------------------------*
    171. * TEXT
    172. *----------------------------------------------------------------------*
    173. FORM SELECT_EXCEL_FILE CHANGING P_FILE.
    174. DATA: LT_FILETABLE TYPE FILETABLE WITH HEADER LINE,
    175. L_RC TYPE I,
    176. L_ACTION TYPE I.
    177. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    178. EXPORTING
    179. DEFAULT_EXTENSION = 'XLSX'
    180. DEFAULT_FILENAME = '*.XLS;*.XLSX'
    181. FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
    182. MULTISELECTION = ''
    183. CHANGING
    184. FILE_TABLE = LT_FILETABLE[]
    185. RC = L_RC
    186. USER_ACTION = L_ACTION
    187. EXCEPTIONS
    188. OTHERS = 1.
    189. IF L_ACTION NE 0.
    190. EXIT.
    191. ENDIF.
    192. READ TABLE LT_FILETABLE INDEX 1.
    193. P_FILE = LT_FILETABLE-FILENAME.
    194. ENDFORM. "SELECT_EXCEL_FILE
    195. *&---------------------------------------------------------------------*
    196. *& FORM SET_STATUS_BAR
    197. *&---------------------------------------------------------------------*
    198. * TEXT
    199. *----------------------------------------------------------------------*
    200. FORM SET_STATUS_BAR USING P_PERCENT P_MESSAGE.
    201. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    202. EXPORTING
    203. PERCENTAGE = P_PERCENT
    204. TEXT = P_MESSAGE.
    205. ENDFORM. "SET_STATUS_BAR
    206. *&---------------------------------------------------------------------*
    207. *& FORM DOWNLOAD_TEMPLATE
    208. *&---------------------------------------------------------------------*
    209. * 下载模板用
    210. * P_OBJID: SMW0中的文件ID
    211. * P_EXTENSION: 文件扩展名,如XLS、DOC
    212. * P_DEFAULT_FILENAME: 默认文件名
    213. *----------------------------------------------------------------------*
    214. FORM DOWNLOAD_TEMPLATE USING P_OBJID P_EXTENSION P_DEFAULT_FILENAME.
    215. DATA: L_FILENAME TYPE STRING,
    216. L_FULLPATH TYPE STRING,
    217. L_PATH TYPE STRING,
    218. LS_OBJDATA TYPE WWWDATATAB,
    219. L_DESTINATION TYPE RLGRAP-FILENAME,
    220. L_RC TYPE I.
    221. SELECT SINGLE RELID OBJID INTO CORRESPONDING FIELDS OF LS_OBJDATA FROM WWWDATA
    222. WHERE SRTF2 = 0 AND RELID = 'MI' AND OBJID = P_OBJID.
    223. IF SY-SUBRC <> 0.
    224. MESSAGE '模板文件不存在' TYPE 'E'.
    225. ENDIF.
    226. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    227. EXPORTING
    228. DEFAULT_EXTENSION = P_EXTENSION
    229. DEFAULT_FILE_NAME = P_DEFAULT_FILENAME
    230. CHANGING
    231. FILENAME = L_FILENAME
    232. PATH = L_PATH
    233. FULLPATH = L_FULLPATH
    234. EXCEPTIONS
    235. OTHERS = 1.
    236. IF L_FULLPATH = ''.
    237. MESSAGE '没有选择文件' TYPE 'E'.
    238. ENDIF.
    239. IF STRLEN( L_FULLPATH ) > 128.
    240. MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'.
    241. STOP.
    242. ENDIF.
    243. L_DESTINATION = L_FULLPATH.
    244. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    245. EXPORTING
    246. KEY = LS_OBJDATA
    247. DESTINATION = L_DESTINATION
    248. IMPORTING
    249. RC = L_RC.
    250. IF L_RC <> 0.
    251. MESSAGE '导入模板下载失败' TYPE 'E'.
    252. ENDIF.
    253. ENDFORM. "DOWNLOAD_TEMPLATE
    254. *&---------------------------------------------------------------------*
    255. *& FORM DISPLAY_DATA
    256. *&---------------------------------------------------------------------*
    257. * 显示数据
    258. *----------------------------------------------------------------------*
    259. FORM DISPLAY_DATA.
    260. D_BUILD_FIELDCAT:
    261. * 字段 单位字段 金额字段 参照表 参照字段 转码 列颜色 描述
    262. 'ICON' '' '' '' '' '' '' '',
    263. 'MSG' '' '' '' '' '' '' '消息文本'.
    264. GS_LAYOUT-CWIDTH_OPT = 'X'.
    265. GS_LAYOUT-BOX_FNAME = 'SEL'.
    266. GS_LAYOUT-ZEBRA = 'X'.
    267. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    268. EXPORTING
    269. I_CALLBACK_PROGRAM = SY-REPID
    270. I_CALLBACK_PF_STATUS_SET = 'PF_STATUS'
    271. I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
    272. IT_FIELDCAT_LVC = GT_FIELDCAT
    273. IS_LAYOUT_LVC = GS_LAYOUT
    274. I_DEFAULT = 'X'
    275. I_SAVE = 'A'
    276. TABLES
    277. T_OUTTAB = GT_ALV
    278. EXCEPTIONS
    279. OTHERS = 1.
    280. ENDFORM. "DISPLAY_DATA
    281. *&---------------------------------------------------------------------*
    282. *& FORM PF_STATUS
    283. *&---------------------------------------------------------------------*
    284. * TEXT
    285. *----------------------------------------------------------------------*
    286. FORM PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB .
    287. SET PF-STATUS 'STATUS_ALV' EXCLUDING RT_EXTAB.
    288. ENDFORM. "PF_STATUS
    289. *&---------------------------------------------------------------------*
    290. *& FORM USER_COMMAND
    291. *&---------------------------------------------------------------------*
    292. * TEXT
    293. *----------------------------------------------------------------------*
    294. FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
    295. RS_SELFIELD TYPE SLIS_SELFIELD.
    296. CASE R_UCOMM.
    297. WHEN 'IMPORT'.
    298. READ TABLE GT_ALV WITH KEY SEL = 'X' TRANSPORTING NO FIELDS.
    299. IF SY-SUBRC <> 0.
    300. MESSAGE '请至少选择一个行项目' TYPE 'S' DISPLAY LIKE 'E'.
    301. EXIT.
    302. ENDIF.
    303. CALL FUNCTION 'MESSAGES_INITIALIZE'.
    304. "准备数据进行批导
    305. LOOP AT GT_ALV INTO GS_ALV WHERE SEL = 'X'.
    306. ENDLOOP.
    307. ENDCASE.
    308. ENDFORM. "USER_COMMAND