ABAP OLE程序DEMO

REPORT YYHD_OLE.

TYPESBEGIN OF TY_UPLOAD,    "接收excel的结构
         BUKRS   TYPE CHAR50,    "公司代码
         ANLN1   TYPE CHAR50,    "资产号
         GGJAHR  TYPE CHAR50,    "年度
         AFPER   TYPE CHAR50,    "月份
         GSTZAHL TYPE CHAR50,    "总量
         STZAHL  TYPE CHAR50,    "实际用量
       END OF TY_UPLOAD.

TYPESBEGIN OF TY_CHECK_UPLOAD,  "接收数据处理后的结构
         BUKRS   TYPE BUKRS,
         ANLN1   TYPE ANLN1,
         GGJAHR  TYPE GGJAHR,
         AFPER   TYPE AFPER,
         GSTZAHL TYPE GSTZAHL,
         STZAHL  TYPE STZAHL,
       END OF TY_CHECK_UPLOAD.


DATA: LT_UPLOAD       TYPE TABLE OF TY_UPLOAD,          "接收excel的内表
      LS_UPLOAD       TYPE TY_UPLOAD,                   "接收excel的工作区
      P_BUKRS         TYPE CHAR4,                       "用于对公司代码做检查
      LV_BOOLEAN      TYPE BOOLEAN,                     "文件路径是否存在返回结果
      LT_CHECK_UPLOAD TYPE TABLE OF TY_CHECK_UPLOAD,    "接收数据处理后的内表
      LS_CHECK_UPLOAD TYPE TY_CHECK_UPLOAD,             "接收数据处理后的工作区
      LT_LINES        TYPE TABLE OF ALSMEX_TABLINE,     "接收Excel数据的表
      LS_LINES        TYPE ALSMEX_TABLINE,
      LV_RC           TYPE I,                           "将内表数据放到excel剪切板操作的返回代码
      LT_FILE_TABLE   TYPE FILETABLE,                   "接收上传文件路径用
      LS_FILE_TABLE   TYPE FILE_TABLE,
      GS_LAYO         TYPE LVC_S_LAYO,                  "ALV显示画面用
      GT_FCAT         TYPE LVC_T_FCAT.                  "ALV字段格式设置用

"定义下载模板相关数据
DATA: APPLICATION TYPE OLE2_OBJECT,       "excel object
      WORKBOOK    TYPE OLE2_OBJECT,       "excel workbook objcet
      SHEET       TYPE OLE2_OBJECT,       "workbook sheet object
      COLUMNS     TYPE OLE2_OBJECT,       "sheet col objcet
      ROWS        TYPE OLE2_OBJECT,       "sheet row objcet
      RANGE       TYPE OLE2_OBJECT,       "range
      RANGE1      TYPE OLE2_OBJECT,       "range1
      FONT        TYPE OLE2_OBJECT,       "font
      CELL        TYPE OLE2_OBJECT,       "cell
      CELL1       TYPE OLE2_OBJECT,       "cell1
      SHEET1      TYPE OLE2_OBJECT,       "workbook sheet object
      BORDERS     TYPE OLE2_OBJECT.       "borders



SELECTION-SCREEN BEGIN OF BLOCK 1.      "选择画面
  PARAMETERS:GV_PATH TYPE CHAR255.
SELECTION-SCREEN END OF BLOCK 1.

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR  GV_PATH.     "给路径设置f4帮助
  PERFORM FRM_SCR_F4 CHANGING LT_FILE_TABLE.

*  PERFORM FRM_CHECK_FILEPATH USING lv_path.            "检查路径是否正确

START-OF-SELECTION.

  PERFORM FRM_UPLOAD_EXCEL.      "将excel数据导入到表中


*&---------------------------------------------------------------------*
*&      Form  SCR_F4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_FILE_TABLE  text
*----------------------------------------------------------------------*
FORM FRM_SCR_F4  CHANGING P_LT_FILE_TABLE.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            'File Selected'
      FILE_FILTER             'Microsoft Excel(*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|' "'Execel(*.xls,*.xlsx)|*.XLS*'
      INITIAL_DIRECTORY       'C:\'
    CHANGING
      FILE_TABLE              = LT_FILE_TABLE
      RC                      = LV_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED 1
      CNTL_ERROR              2
      ERROR_NO_GUI            3
      NOT_SUPPORTED_BY_GUI    4
      OTHERS                  5.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
  READ TABLE LT_FILE_TABLE INTO LS_FILE_TABLE INDEX 1.
  IF SY-SUBRC EQ 0.
    GV_PATH  = LS_FILE_TABLE-FILENAME.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_FILEPATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_FILEPATH USING LV_PATH.   "检查路径是否正确
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE                 = LV_PATH
    RECEIVING
      RESULT               = LV_BOOLEAN
    EXCEPTIONS
      CNTL_ERROR           1
      ERROR_NO_GUI         2
      WRONG_PARAMETER      3
      NOT_SUPPORTED_BY_GUI 4
      OTHERS               5.
  IF SY-SUBRC <> OR
     LV_BOOLEAN IS INITIAL.
    MESSAGE TEXT-016 TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  IPT_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_UPLOAD_EXCEL .   "上传EXCEL
  DATA LV_PATH TYPE RLGRAP-FILENAME.
  MOVE GV_PATH TO LV_PATH.
  FIELD-SYMBOLS: <L_VALUE> TYPE ANY.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'  "读取文件内容到LT_LINES表中
    EXPORTING
      FILENAME                = LV_PATH
      I_BEGIN_COL             1
      I_BEGIN_ROW             2
      I_END_COL               6
      I_END_ROW               999
    TABLES
      INTERN                  = LT_LINES
    EXCEPTIONS
      INCONSISTENT_PARAMETERS 1
      UPLOAD_OLE              2
      OTHERS                  3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
  SORT LT_LINES BY ROW COL.    "排序

  LOOP AT LT_LINES INTO LS_LINES.     "将EXCEL文件内容复制到LT_UPLOAD表中
    ASSIGN COMPONENT LS_LINES-COL OF STRUCTURE LS_UPLOAD TO <L_VALUE>.
    <L_VALUE> = LS_LINES-VALUE.
    AT END OF ROW.
      APPEND LS_UPLOAD TO LT_UPLOAD.
    ENDAT.
  ENDLOOP.

  LOOP AT LT_UPLOAD INTO LS_UPLOAD.   "错误消息提示等
    IF LS_UPLOAD-BUKRS ''.
      MESSAGE '模板格式错误' TYPE 'E'.
    ELSE.
      P_BUKRS = LS_UPLOAD-BUKRS.
      SELECT COUNT(*)
        FROM T001
        WHERE BUKRS = P_BUKRS.
      IF SY-SUBRC <> 0.
        MESSAGE '公司代码不存在' TYPE 'E'.
      ENDIF.
    ENDIF.
    MOVE-CORRESPONDING LS_UPLOAD TO LS_CHECK_UPLOAD.
    APPEND LS_CHECK_UPLOAD TO LT_CHECK_UPLOAD.
  ENDLOOP.

  PERFORM FRM_FIELDSET CHANGING GT_FCAT.        "ALV显示字段设置
  PERFORM FRM_LAYOUTSET CHANGING GS_LAYO.       "ALV显示界面设置

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    "调用ALV显示函数进行显示
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET 'FRM_SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND  'FRM_USER_COMMAND'
*     i_grid_settings          = i_grid_settings
      IS_LAYOUT_LVC            = GS_LAYO
      IT_FIELDCAT_LVC          = GT_FCAT
      I_SAVE                   'A'
*     IT_EVENTS                = GT_EVENTS
    TABLES
      T_OUTTAB                 = LT_CHECK_UPLOAD
    EXCEPTIONS
      PROGRAM_ERROR            1
      OTHERS                   2.
  .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDSET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_IT_FCAT  text
*----------------------------------------------------------------------*
FORM FRM_FIELDSET  CHANGING GT_FCAT TYPE LVC_T_FCAT.  "ALV显示字段设置
  DATA GS_FCAT TYPE LVC_S_FCAT.
  DATA WLV_POS TYPE I.
  DEFINE ADDFCAT.        "宏定义
    ADD TO WLV_POS.
    GS_FCAT-COL_POS     = WLV_POS.
    GS_FCAT-FIELDNAME   = &1.
    GS_FCAT-SCRTEXT_L   = &2.
    GS_FCAT-SCRTEXT_M   = &2.
    GS_FCAT-SCRTEXT_S   = &2.
    GS_FCAT-COLTEXT = &2.
    GS_FCAT-NO_ZERO 'X'.    GS_FCAT
-COL_OPT  'X'.    
APPEND GS_FCAT to GT_FCAT.    
clear GS_FCAT.  
END-OF-DEFINITION.  ADDFCAT 

'BUKRS'     '公司代码'.  ADDFCAT 
'ANLN1'     '资产号'.  ADDFCAT 
'GGJAHR'       '年度'.  ADDFCAT 
'AFPER'        '月份'.  ADDFCAT 
'GSTZAHL'   '总量'.  ADDFCAT 
'STZAHL'    '实际用量'.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUTSET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_WA_LAYO  text
*----------------------------------------------------------------------*
FORM FRM_LAYOUTSET  CHANGING GS_LAYO TYPE LVC_S_LAYO"ALV显示界面设置  GS_LAYO
-ZEBRA 'X'.

ENDFORM.

FORM FRM_USER_COMMAND USING ZCOMM LIKE SY-UCOMM    "用户按钮事件定义                              Z_SELFIELD 
TYPE SLIS_SELFIELD.  
CASE ZCOMM.    
WHEN 'ZLOAD'.      
PERFORM FRM_DOWNLOAD_ALV.    "下载事件    

WHEN OTHERS.  
ENDCASE.


ENDFORM.

FORM FRM_SET_PF_STATUS USING EXTAB TYPE SLIS_T_EXTAB.  
SET PF-STATUS 'STANDARD'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_ALV .  

DATA LV_ERROR TYPE CHAR1.  
DATA: LV_FILE    TYPE RLGRAP-FILENAME.  

PERFORM FRM_GET_FILE CHANGING GV_PATH LV_ERROR.   "获取自定义的文件路径  
CHECK LV_ERROR IS INITIAL.
*  PERFORM FRM_PROCESS_INDCATOR USING '程序正在下载模板'.  "界面友好,页面左下角显示提示  LV_FILE 
= GV_PATH.  
CONCATENATE LV_FILE                  "文件名连接            
'固定资产表'            SY
-UZEIT            
'.xls'       
INTO LV_FILE.  
"下载模板  
PERFORM FRM_DOWNLOAD_TEMPLATE USING LV_FILE       "去SMW0下载空模板                                
CHANGING LV_ERROR.  

CHECK LV_ERROR IS INITIAL.  

PERFORM FRM_OPEN_EXCEL_HIDE USING LV_FILE 'X'.   "打开空模板文件  


PERFORM FRM_WRITE_DATA.                          "把数据写入到EXCEL  

PERFORM FRM_CLOSE_EXCEL USING LV_FILE.           "关闭EXCEL  
PERFORM FRM_FREE_OBJECT.                         "释放对象



ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LV_PATH  text
*      <--P_LV_ERROR  text
*----------------------------------------------------------------------*
FORM FRM_GET_FILE  CHANGING LV_PATH                            LV_ERROR
.  
DATA: LV_FOLDER  TYPE STRING.  

CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE    
EXPORTING      WINDOW_TITLE         
'文件路径选择'
*     initial_folder       =    
CHANGING      SELECTED_FOLDER      
= LV_FOLDER    
EXCEPTIONS      CNTL_ERROR           
1      ERROR_NO_GUI         
2      NOT_SUPPORTED_BY_GUI 
3      
OTHERS               4.  
IF SY-SUBRC <> 0.    
MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO               
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4               DISPLAY 
LIKE 'E'.    LV_ERROR 
'X'.  
ELSEIF LV_FOLDER IS INITIAL.    
MESSAGE '文件下载取消!' TYPE 'S'.    LV_ERROR 
'X'.  
ELSE.    LV_PATH 
= LV_FOLDER.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_FILE  text
*      -->P_LV_ERROR  text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE  USING    LV_FILE TYPE RLGRAP-FILENAME                             
CHANGING        LV_ERROR.  
DATA: LO_OBJDATA LIKE WWWDATATAB,        LO_MIME    
LIKE W3MIME,        LS_OBJNAM  
TYPE STRING,        LI_RC      
LIKE SY-SUBRC,        LS_ERRTXT  
TYPE STRING,        LV_OBJID   
TYPE WWWDATA-OBJID.

*  LV_OBJID  = 'ZOLE_EXCEL'.  LV_OBJID  
'YYHD_OLE_TEST'.  
CONCATENATE LV_OBJID '.XLSX' INTO LS_OBJNAM.  
CONDENSE LS_OBJNAM NO-GAPS.  

SELECT SINGLE RELID OBJID FROM WWWDATA  
INTO CORRESPONDING FIELDS OF LO_OBJDATA  
WHERE SRTF2    0    
AND RELID    'MI'    
AND OBJID    = LV_OBJID.  

IF SY-SUBRC NE OR LO_OBJDATA-OBJID EQ SPACE.    
MESSAGE '模板文件不存在,请用TCODE:SMW0进行加载!' TYPE 'E'.    LV_ERROR 
'X'.  
ENDIF.  

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'    
EXPORTING      
KEY         = LO_OBJDATA      DESTINATION 
= LV_FILE    
IMPORTING      RC          
= LI_RC.  

IF LI_RC NE 0.    
MESSAGE '模板文件下载失败!' TYPE 'E'.    LV_ERROR 
'X'.  
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_OPEN_EXCEL_HIDE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_FILE  text
*      -->P_0639   text
*      -->P_ENDFORM  text
*----------------------------------------------------------------------*
FORM FRM_OPEN_EXCEL_HIDE  USING    P_FILE                                   P_HIDE
.  
CREATE OBJECT APPLICATION 'EXCEL.APPLICATION'.  

IF P_HIDE IS NOT INITIAL.    
SET PROPERTY OF APPLICATION 'VISIBLE' 0.  
ELSE.    
SET PROPERTY OF APPLICATION 'Visible' 1.  
ENDIF.  
CALL METHOD OF APPLICATION 'Workbooks' = WORKBOOK.  
CALL METHOD OF WORKBOOK 'Open' = WORKBOOK    
EXPORTING    #1 
= P_FILE.

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

DATABEGIN OF LW_CHAR,          
LINE(2200TYPE C,        
END OF LW_CHAR.  

DATA LT_CHAR LIKE TABLE OF LW_CHAR."将数据拷贝到剪切板上  
DATABEGIN OF LW_ALV ,          LINE1
(200TYPE C,    "          LINE2
(200TYPE C,    "          LINE3
(200TYPE C,    "          LINE4
(200TYPE C,    "          LINE5
(200TYPE C,    "          LINE6
(200TYPE C,    "        
END OF LW_ALV.  
DATA LV_RC TYPE I.  
DATA LV_TYPE TYPE C.  
FIELD-SYMBOLS <LV_FIELD>.  


DESCRIBE FIELD LW_ALV TYPE LV_TYPE COMPONENTS LV_RC.  

LOOP AT LT_CHECK_UPLOAD INTO LS_CHECK_UPLOAD.    LW_ALV
-LINE1 = LS_CHECK_UPLOAD-BUKRS.    "    LW_ALV
-LINE2 = LS_CHECK_UPLOAD-ANLN1.   "    LW_ALV
-LINE3 = LS_CHECK_UPLOAD-GGJAHR.     "    LW_ALV
-LINE4 = LS_CHECK_UPLOAD-AFPER.      "    LW_ALV
-LINE5 = LS_CHECK_UPLOAD-GSTZAHL.  "    LW_ALV
-LINE6 = LS_CHECK_UPLOAD-STZAHL.   "    
CLEAR LW_CHAR-LINE.    
DO LV_RC TIMES.      
ASSIGN COMPONENT SY-INDEX OF STRUCTURE LW_ALV TO <LV_FIELD>.      
CONCATENATE LW_CHAR-LINE <LV_FIELD> CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO LW_CHAR-LINE.    
ENDDO.    
APPEND LW_CHAR TO LT_CHAR.  
ENDLOOP.
* 将内表数据放到excel剪切板上  
CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT    
IMPORTING      
DATA                 = LT_CHAR    " Data    
CHANGING      RC                   
= LV_RC    " Return Code    
EXCEPTIONS      CNTL_ERROR           
1      ERROR_NO_GUI         
2      NOT_SUPPORTED_BY_GUI 
3
*     no_authority         = 4      
OTHERS               5.  


GET PROPERTY OF APPLICATION 'ACTIVECELL' = SHEET.
*  
CALL METHOD OF APPLICATION 'Worksheets' = SHEET    
EXPORTING    #1 
'Sheet1'.
**  
CALL METHOD OF SHEET 'Activate'.
* Select the cell A1  
CALL METHOD OF APPLICATION 'CELLS' = CELL    
EXPORTING    #1 
2  " i_row    #2 
" i_col

* Paste clipboard from cell  
CALL METHOD OF CELL 'SELECT'" 选择单元格  
CALL METHOD OF SHEET 'Paste'" 粘贴  
CALL METHOD OF APPLICATION 'CELLS' = CELL    
EXPORTING    #1 
2    #2 
.  
CALL METHOD OF CELL 'SELECT'" 取消全选

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CLOSE_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_FILE  text
*----------------------------------------------------------------------*
FORM FRM_CLOSE_EXCEL  USING    P_FILE.  
GET PROPERTY OF APPLICATION 'ActiveWorkbook' = WORKBOOK.  
CALL METHOD OF WORKBOOK 'SAVE'.  
CALL METHOD OF WORKBOOK 'ClOSE'.
*    EXPORTING
*    #1 = 1.  
CALL METHOD OF WORKBOOK 'QUIT'.


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FREE_OBJECT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_FREE_OBJECT .  
FREE OBJECT FONT.  
FREE OBJECT RANGE.  
FREE OBJECT RANGE1.  
FREE OBJECT COLUMNS.  
FREE OBJECT ROWS.  
FREE OBJECT CELL.  
FREE OBJECT CELL1.  
FREE OBJECT SHEET1.  
FREE OBJECT SHEET.  
FREE OBJECT WORKBOOK.  
FREE OBJECT APPLICATION.
ENDFORM.

posted @ 2021-12-14 17:18  万有引力啊  阅读(87)  评论(0)    收藏  举报