前言:在项目中碰到过这样的需求,用户的EXCEL文件模板里面有多个SHEET页,每个SHEET页的数据是不一样的,每一份数据对应单独的需求,这样我们就要根据具体的业务需求读取相应SHEET页的数据,在我的上一篇随笔扩展EXCEL上载函数中提到过如何自定义EXCEL上载函数针对指定SHEET页,这里就演示下怎么用该函数读取SHEET页中的数据。

1.创建一份EXCEL文件(包含数据)

示例如下: SHEET1:ABC 和SHEET2:DEF

2.读取sheet页签 - 图1
2.读取sheet页签 - 图2

2. 创示例程序:

  1. *&---------------------------------------------------------------------*
  2. *& Report ZDEMO_EXCEL_UPLOAD
  3. *&---------------------------------------------------------------------*
  4. *&
  5. *&---------------------------------------------------------------------*
  6. REPORT zdemo_excel_upload.
  7. **********************************************************************
  8. * PROGRAM DETAIL *
  9. **********************************************************************
  10. * --T-CODE:ZDEMO_EXCEL_UPLOAD
  11. * --AUTHOR:GJBOY
  12. * --CREATE DATE:17.12.2021 15:28:56
  13. * --DESCRIBLE:EXCEL 文件上传sheet页测试
  14. **********************************************************************
  15. * EDIT LOG *
  16. **********************************************************************
  17. * VERSION DATE AUTHOR REMARK
  18. * <DEVK90XXX> <YYYY/MM/DD> <...> <REASON>
  19. **********************************************************************
  20. * DECLARATIONS *
  21. **********************************************************************
  22. *TABLES: .
  23. *CONSTANTS: .
  24. TYPES:BEGIN OF ty_data,
  25. id TYPE i,
  26. name(10) TYPE c,
  27. END OF ty_data.
  28. DATA: gt_data TYPE TABLE OF ty_data WITH HEADER LINE. "SHEET1:ABC"
  29. DATA: gt_data2 TYPE TABLE OF ty_data WITH HEADER LINE. "SHEET1:DEF"
  30. **********************************************************************
  31. * SELECTION SCREEN *
  32. **********************************************************************
  33. SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  34. PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY.
  35. * SELECT-OPTIONS: .
  36. SELECTION-SCREEN: END OF BLOCK b1.
  37. **********************************************************************
  38. * INITIALIZATION *
  39. **********************************************************************
  40. INITIALIZATION.
  41. **********************************************************************
  42. * AT SELECTION SCREEN *
  43. **********************************************************************
  44. AT SELECTION-SCREEN.
  45. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  46. PERFORM frm_get_filename USING p_file.
  47. **********************************************************************
  48. * TOP OF PAGE *
  49. **********************************************************************
  50. TOP-OF-PAGE.
  51. **********************************************************************
  52. * END OF PAGE *
  53. **********************************************************************
  54. END-OF-PAGE.
  55. **********************************************************************
  56. * AT USER COMMAND *
  57. **********************************************************************
  58. AT USER-COMMAND.
  59. **********************************************************************
  60. * START OF SELECTION *
  61. **********************************************************************
  62. START-OF-SELECTION.
  63. PERFORM frm_upoload_file TABLES gt_data USING 'ABC'.
  64. PERFORM frm_upoload_file TABLES gt_data2 USING 'DEF'.
  65. **********************************************************************
  66. * END OF SELECTION *
  67. **********************************************************************
  68. END-OF-selection.
  69. IF gt_data[] IS NOT INITIAL.
  70. WRITE:/ |SHEET1:ABC数据|.
  71. LOOP AT gt_data.
  72. WRITE: / |{ gt_data-id } { gt_data-name }|.
  73. ENDLOOP.
  74. ENDIF.
  75. IF gt_data2[] IS NOT INITIAL.
  76. WRITE:/ |SHEET2:DEF数据|.
  77. LOOP AT gt_data2.
  78. WRITE: / |{ gt_data2-id } { gt_data2-name }|.
  79. ENDLOOP.
  80. ENDIF.
  81. **********************************************************************
  82. * FORMS DECLARATIONS *
  83. **********************************************************************
  84. FORM frm_get_filename USING uv_file.
  85. "出现打开文件的对话框
  86. CALL FUNCTION 'WS_FILENAME_GET'
  87. EXPORTING
  88. mask = ',*.*,*.*.'
  89. mode = 'O' "S为保存,O为打开
  90. IMPORTING
  91. filename = uv_file
  92. EXCEPTIONS
  93. inv_winsys = 1
  94. no_batch = 2
  95. selection_cancel = 3
  96. selection_error = 4
  97. OTHERS = 5.
  98. ENDFORM. "GET_FILENAME
  99. FORM frm_upoload_file TABLES lt_input TYPE STANDARD TABLE USING sheet_name.
  100. DATA lt_upload LIKE TABLE OF zalsmex_tabline WITH HEADER LINE.
  101. DATA: ls_i TYPE i.
  102. FIELD-SYMBOLS <f>.
  103. CALL FUNCTION 'ZFM_EXCEL_TO_INTERNAL_TABLE' "这里的EXCEL上传函数是已经按照上一篇随笔做了SHEET处理的"
  104. EXPORTING
  105. filename = p_file
  106. i_begin_col =
  107. i_begin_row = 2
  108. i_end_col = 6
  109. i_end_row = 50000
  110. i_sheet_name = sheet_name
  111. TABLES
  112. intern = lt_upload
  113. EXCEPTIONS
  114. inconsistent_parameters = 1
  115. upload_ole = 2
  116. OTHERS = 3.
  117. IF sy-subrc = 0.
  118. *--->处理读取出的数据
  119. SORT lt_upload BY row col.
  120. LOOP AT lt_upload.
  121. ls_i = lt_upload-col.
  122. ASSIGN COMPONENT ls_i OF STRUCTURE lt_input TO <f>.
  123. <f> = lt_upload-value.
  124. AT END OF row.
  125. APPEND lt_input TO lt_input.
  126. CLEAR:lt_input.
  127. ENDAT.
  128. ENDLOOP.
  129. ELSE.
  130. WRITE: / 'EXCEL UPLOAD FAILED ', p_file, sy-subrc.
  131. ENDIF.
  132. ENDFORM. " UPOLOAD_FILE

3.效果图:

2.读取sheet页签 - 图3