前言:在日常的开发批导报表中,使用的excel上载标准函数ALSM_EXCEL_TO_INTERNAL_TABLE,其中存放数据的内表结构,行列数4位长度最大只支持到9999,这样在遇到一些数据量比较大的文件就不满足需求了,所以就需要对该函数进行扩展,保证它能够满足我们的需求。

扩展步骤:

1.复制标准函数ALSM_EXCEL_TO_INTERNAL_TABLE

扩展EXCEL上载函数 - 图1

2.编辑自定义函数

扩展EXCEL上载函数 - 图2
扩展EXCEL上载函数 - 图3

  1. TYPE-POOLS: ole2.
  2. * value of excel-cell
  3. TYPES: ty_d_itabvalue TYPE zalsmex_tabline-value, "注意:若表结构更改了,这个也要改为对应的类型"
  4. * internal table containing the excel data
  5. ty_t_itab TYPE zalsmex_tabline OCCURS 0, "注意:若表结构更改了,这个也要改为对应的类型"
  6. * line type of sender table
  7. BEGIN OF ty_s_senderline,
  8. line(4096) TYPE c,
  9. END OF ty_s_senderline,
  10. * sender table
  11. ty_t_sender TYPE ty_s_senderline OCCURS 0.
  12. *
  13. CONSTANTS: gc_esc VALUE '"'.

扩展EXCEL上载函数 - 图4
扩展EXCEL上载函数 - 图5

引用:INCLUDE LALSMEXF01.

扩展EXCEL上载函数 - 图6
扩展EXCEL上载函数 - 图7
扩展EXCEL上载函数 - 图8

结构的内容如下:

扩展EXCEL上载函数 - 图9
扩展EXCEL上载函数 - 图10

3.扩展sheet

如果还想让函数根据sheet 页来读取数据,需要在自定义函数里添加参数:

扩展EXCEL上载函数 - 图11

然后在程序源代码里加入以下代码:

扩展EXCEL上载函数 - 图12

4.附加函数代码

  1. FUNCTION zfm_excel_to_internal_table .
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *" IMPORTING
  5. *" VALUE(FILENAME) LIKE RLGRAP-FILENAME
  6. *" VALUE(I_BEGIN_COL) TYPE I
  7. *" VALUE(I_BEGIN_ROW) TYPE I
  8. *" VALUE(I_END_COL) TYPE I
  9. *" VALUE(I_END_ROW) TYPE I
  10. *" VALUE(I_SHEET_NAME) TYPE CHAR50 OPTIONAL
  11. *" TABLES
  12. *" INTERN STRUCTURE ZALSMEX_TABLINE
  13. *" EXCEPTIONS
  14. *" INCONSISTENT_PARAMETERS
  15. *" UPLOAD_OLE
  16. *"----------------------------------------------------------------------
  17. DATA: excel_tab TYPE ty_t_sender.
  18. DATA: ld_separator TYPE c.
  19. DATA: application TYPE ole2_object,
  20. workbook TYPE ole2_object,
  21. range TYPE ole2_object,
  22. worksheet TYPE ole2_object.
  23. DATA: h_cell TYPE ole2_object,
  24. h_cell1 TYPE ole2_object.
  25. DATA:
  26. ld_rc TYPE i.
  27. * Rückgabewert der Methode "clipboard_export "
  28. * Makro für Fehlerbehandlung der Methods
  29. DEFINE m_message.
  30. CASE sy-subrc.
  31. WHEN 0.
  32. WHEN 1.
  33. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  34. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  35. WHEN OTHERS. RAISE upload_ole.
  36. ENDCASE.
  37. END-OF-DEFINITION.
  38. * check parameters
  39. IF i_begin_row > i_end_row. RAISE inconsistent_parameters. ENDIF.
  40. IF i_begin_col > i_end_col. RAISE inconsistent_parameters. ENDIF.
  41. * Get TAB-sign for separation of fields
  42. CLASS cl_abap_char_utilities DEFINITION LOAD.
  43. ld_separator = cl_abap_char_utilities=>horizontal_tab.
  44. * open file in Excel
  45. IF application-header = space OR application-handle = -1.
  46. CREATE OBJECT application 'Excel.Application'.
  47. m_message.
  48. ENDIF.
  49. CALL METHOD OF application 'Workbooks' = workbook.
  50. m_message.
  51. CALL METHOD OF workbook 'Open' EXPORTING #1 = filename.
  52. m_message.
  53. * set property of application 'Visible' = 1.
  54. * m_message.
  55. *<START>------「Add By ZYH Time: 17.12.2021 15:07:51」-------<START>*
  56. IF i_sheet_name = space.
  57. GET PROPERTY OF application 'ACTIVESHEET' = worksheet.
  58. m_message.
  59. ELSE.
  60. CALL METHOD OF application 'WORKSHEETS' = worksheet
  61. EXPORTING #1 = i_sheet_name.
  62. CALL METHOD OF worksheet 'Activate'.
  63. m_message.
  64. ENDIF.
  65. *<END>--------「Add By ZYH Time: 17.12.2021 15:07:51」---------<END>*
  66. * mark whole spread sheet
  67. CALL METHOD OF worksheet 'Cells' = h_cell
  68. EXPORTING #1 = i_begin_row #2 = i_begin_col.
  69. m_message.
  70. CALL METHOD OF worksheet 'Cells' = h_cell1
  71. EXPORTING #1 = i_end_row #2 = i_end_col.
  72. m_message.
  73. CALL METHOD OF worksheet 'RANGE' = range
  74. EXPORTING #1 = h_cell #2 = h_cell1.
  75. m_message.
  76. CALL METHOD OF range 'SELECT'.
  77. m_message.
  78. * copy marked area (whole spread sheet) into Clippboard
  79. CALL METHOD OF range 'COPY'.
  80. m_message.
  81. * read clipboard into ABAP
  82. CALL METHOD cl_gui_frontend_services=>clipboard_import
  83. IMPORTING
  84. data = excel_tab
  85. EXCEPTIONS
  86. cntl_error = 1
  87. * ERROR_NO_GUI = 2
  88. * NOT_SUPPORTED_BY_GUI = 3
  89. OTHERS = 4.
  90. IF sy-subrc <> 0.
  91. MESSAGE a037(alsmex).
  92. ENDIF.
  93. PERFORM separated_to_intern_convert TABLES excel_tab intern
  94. USING ld_separator.
  95. * clear clipboard
  96. REFRESH excel_tab.
  97. CALL METHOD cl_gui_frontend_services=>clipboard_export
  98. IMPORTING
  99. data = excel_tab
  100. CHANGING
  101. rc = ld_rc
  102. EXCEPTIONS
  103. cntl_error = 1
  104. * ERROR_NO_GUI = 2
  105. * NOT_SUPPORTED_BY_GUI = 3
  106. OTHERS = 4.
  107. * quit Excel and free ABAP Object - unfortunately, this does not kill
  108. * the Excel process
  109. CALL METHOD OF application 'QUIT'.
  110. m_message.
  111. * >>>>> Begin of change note 575877
  112. * to kill the Excel process it's necessary to free all used objects
  113. FREE OBJECT h_cell. m_message.
  114. FREE OBJECT h_cell1. m_message.
  115. FREE OBJECT range. m_message.
  116. FREE OBJECT worksheet. m_message.
  117. FREE OBJECT workbook. m_message.
  118. FREE OBJECT application. m_message.
  119. * <<<<< End of change note 575877
  120. ENDFUNCTION.