分享

Download to excel from SAP

 yqw205 2015-11-17
  *&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*       下载数据到xls文件
*----------------------------------------------------------------------*
FORM get_download_data.
  DATAlv_excel       TYPE ole2_object,
        lv_sheet       TYPE ole2_object,
        lv_cell        TYPE ole2_object,
        lv_workbook    TYPE ole2_object,
        lv_xlsname     TYPE string,
        lv_line        TYPE i    ,
*          VALUE 1, "行号
        lv_cols        TYPE i      VALUE 0"行号
        lv_ntgew       TYPE zbj_importh-ntgew,
        lv_inco1       TYPE vbrk-inco1,
        lv_unitin      LIKE t006-msehi,
        lv_unitout     LIKE t006-msehi.
  DATAlw_alvdata     LIKE t_download,
        ls_alvdata     LIKE t_download.
  DATAlt_list        TYPE STANDARD TABLE OF t_list.
  DATAlv_idx         TYPE sy-tabix,
        lv_index       TYPE sy-tabix,
        lv_vbeln       TYPE  likp-vbeln,
        lv_kunnr TYPE likp-kunnr.
  lt_list[] gt_list[].
  CLEAR:gs_list.
  LOOP AT gt_weight INTO gs_weight.
*  get net weight
    gs_vbco3-vbeln gs_weight-vbeln.
    CALL FUNCTION 'SD_PACKING_PRINT_VIEW'
      EXPORTING
        comwa            gs_vbco3
      TABLES
        vbplk_tab        gt_vbplk
        vbplp_tab        gt_vbplp
        vbpls_tab        gt_vbpls
      EXCEPTIONS
        object_not_found 1
        OTHERS           2.

*    gs_weight-vbeln = gs_list-vbeln.
    LOOP AT gt_vbplk INTO gs_vbplk.

      CLEARlv_ntgew.
      SELECT SINGLE brgew
        INTO lv_ntgew
        FROM zbox_weight
       WHERE vhilm gs_vbplk-vhilm AND
             gewei gs_vbplk-gewei.

      gs_vbplk-ntgew  gs_vbplk-ntgew lv_ntgew.
      IF gs_vbplk-gewei <> 'KG'.

        CLEAR lv_ntgew.
        lv_unitin gs_vbplk-gewei.
        lv_unitout 'KG'.
        CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'
          EXPORTING
            input                gs_vbplk-ntgew
            unit_in              lv_unitin
            unit_out             lv_unitout
          IMPORTING
            output               lv_ntgew
          EXCEPTIONS
            conversion_not_found 1
            division_by_zero     2
            input_invalid        3
            output_invalid       4
            overflow             5
            type_invalid         6
            units_missing        7
            unit_in_not_found    8
            unit_out_not_found   9
            OTHERS               10.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

        ENDIF.
      ELSE.
        lv_ntgew gs_vbplk-ntgew.
      ENDIF.
*      ls_weight-brgew = ls_weight-brgew + lv_brgew.
      gs_weight-ntgew gs_weight-ntgew + lv_ntgew.
    ENDLOOP.
*    gs_weight-ntgew = lv_ntgew.
    gs_weight-ntgewp gs_weight-ntgew / gs_weight-quantity.
    MODIFY gt_weight FROM gs_weight.

  ENDLOOP.

  CLEAR:gs_list,lv_ntgew.
  LOOP AT gt_list INTO gs_list.

*  get amount
    gs_list-netwr gs_list-quantity * gs_list-price.

    MOVE-CORRESPONDING gs_list TO ls_alvdata.

*  get invoice #
    SELECT SINGLE vbfa~vbeln
    INTO ls_alvdata-vbelv
    FROM vbfa
    JOIN vbrk
    ON vbfa~vbeln EQ vbrk~vbeln
   WHERE vbelv gs_list-vbeln
     AND vbtyp_v 'J'
*Changed by cherry 12/05/2013 start
     AND vbtyp_n 'M'  OR vbtyp_n '5')
     AND vbrk~fksto NE 'X'.

    IF gv_vbelv IS INITIAL.

      CLEARgv_vbelv,gv_waers.
      SELECT SINGLE vbfa~vbeln
        INTO ls_alvdata-vbelv
        FROM vbfa
        JOIN vbrk
        ON vbfa~vbeln EQ vbrk~vbeln
       WHERE vbelv gs_list-vbeln
         AND vbtyp_v 'J'
         AND vbtyp_n 'U' )
         AND vbrk~fksto NE 'X'.
    ENDIF.
* get net weight

    CLEAR:gs_weight.
    READ TABLE gt_weight INTO gs_weight
       WITH KEY vbeln gs_list-vbeln .
    CLEAR:lv_index.
    lv_index =  gs_weight-add lv_idx.

    IF gs_weight-add .
       ls_alvdata-ntgew =  gs_weight-ntgew.

    ELSEIF gs_weight-add 1.
      IF lv_index > 1.
        IF lv_vbeln IS NOT INITIAL AND gs_list-vbeln <> lv_vbeln.
          CLEAR:lv_ntgewlv_idx.
        ENDIF.
        lv_idx lv_idx + 1.
         ls_alvdata-ntgew gs_list-quantity * gs_weight-ntgewp.

        lv_ntgew ls_alvdata-ntgew + lv_ntgew.
      ELSEIF lv_index 1.
        CLEAR:lv_idx.
         ls_alvdata-ntgew gs_weight-ntgew lv_ntgew.
      ENDIF.

    ENDIF.
*  get COO & Incoterms
    SELECT SINGLE kunnr inco1 INTO (lv_kunnr,lv_inco1 )
             FROM likp
            WHERE vbeln gs_list-vbeln.

    SELECT SINGLE land1
      INTO ls_alvdata-land1
      FROM vbpa
     WHERE vbeln gs_list-vbeln
       AND kunnr lv_kunnr.

    APPEND ls_alvdata TO gt_download.
    CLEAR:ls_alvdata.
  ENDLOOP.

* 获取下载文件完整路径
  PERFORM get_save_path CHANGING lv_xlsname.

* 启动Excel
  CREATE OBJECT lv_excel 'EXCEL.APPLICATION'.

  IF sy-subrc <> 0.
    WRITE'启动Excel失败。'.
    STOP.
  ENDIF.

  CALL METHOD OF
      lv_excel
      'WORKBOOKS' lv_workbook.

* 使excel 可视
  SET PROPERTY OF lv_excel 'VISIBLE'         0.  "0:不可视,1:可视

  SET PROPERTY OF lv_excel 'SHEETSINNEWWORKBOOK' 1.
  "如果是读取excel文件中的内容 则是直接打开工作簿第一页
  CALL METHOD OF
      lv_workbook
      'ADD'.
* 例如:CALL
*       METHOD OF EXCEL 'WORKSHEETS'  = SHEET  EXPORTING #1 = 1.
*     set


  PERFORM set_excel_cell USING lv_excel
    '1'
    '提运单号'
    '1'.
  PERFORM set_excel_cell USING lv_excel
    '1'
    s_track-low
    '2'.
  PERFORM set_excel_cell USING lv_excel
    '3'
    '贸易术语'
    '1'.
  PERFORM set_excel_cell USING lv_excel
    '3'
    lv_inco1
    '2'.
  PERFORM set_excel_cell USING lv_excel
  '1'
  '进出口标志'
  '3'.
  PERFORM set_excel_cell USING lv_excel
    '1'
    'E'
    '4'.
  PERFORM set_excel_cell USING lv_excel
    '7'
    '手册编号'
    '5'.
  PERFORM set_excel_cell USING lv_excel
  '7'
  p_hbook
  '6'.
*  CLEAR LV_LINE.
  lv_line '25'.
  LOOP AT gt_download INTO lw_alvdata.
    lv_cols 1.
*   列名的设定
    IF sy-tabix 1.

*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '发票号'
        lv_cols.

*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '供应商'
        lv_cols.
*
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '其他费用'
        lv_cols.
*
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
      '合同号(表头订单号)'
        lv_cols.
*
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
      '订单号(表体)'
        lv_cols.
*
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '物料编号'
        lv_cols.

*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '成品版本号'
        lv_cols.

*     设定单元格-列(
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '数量'
        lv_cols.
*
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '净重(kg)'
        lv_cols.
*
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '总价'
        lv_cols.
*     设定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '币制'
        lv_cols.

*    定单元格-列
      PERFORM set_excel_cell USING lv_excel
        lv_line
        '国别'
        lv_cols.

    ENDIF.

    lv_line lv_line + 1.   "Excel 中行号从1开始
    lv_cols 1.


*   设定单元格
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-vbelv
      lv_cols.

*   设定单元格
    PERFORM set_excel_cell USING lv_excel
      lv_line
      ''
      lv_cols.

*   设定单元格
    PERFORM set_excel_cell USING lv_excel
      lv_line
      ' '
      lv_cols.
*
*   设定单元格
    PERFORM set_excel_cell USING lv_excel
      lv_line
      ' '
      lv_cols.
*
*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      ' '
      lv_cols.
*
*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-matnr
      lv_cols.

*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-bomtype
      lv_cols.

*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-quantity
      lv_cols.

*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-ntgew
      lv_cols.
*
*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-netwr
      lv_cols.
*
*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-waers
      lv_cols.
*   设定单元格-列
    PERFORM set_excel_cell USING lv_excel
      lv_line
      lw_alvdata-land1
      lv_cols.

  ENDLOOP.

  GET PROPERTY OF lv_excel 'ACTIVESHEET'    lv_sheet.     "激活工作簿
  GET PROPERTY OF lv_excel 'ACTIVEWORKBOOK' lv_workbook.  "激活工作区

  CALL METHOD OF
      lv_workbook
      'SAVEAS'

    EXPORTING
      #1          lv_xlsname
      #2          1.
  "将excel文件保存
  CALL METHOD  OF lv_workbook 'CLOSE'.                  "关闭工作区
  CALL METHOD OF
      lv_excel
      'QUIT'.
  "退出excel

*WRITE:/ XLSNAME,'DONE'.
  "退出成功,输出done

  FREE OBJECT lv_sheet.    "释放操作
  FREE OBJECT lv_workbook.
  FREE OBJECT lv_excel.

ENDFORM.                    " FRM_DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  SET_EXCEL_CELL
*&---------------------------------------------------------------------*
*       设定单元格-列
*----------------------------------------------------------------------*
*      -->P_IN_EXCEL     excel对象
*      -->P_IN_LINE      行号
*      -->P_IN_FIELD     项目
*      <--P_OUT_COLS     列号
*----------------------------------------------------------------------*
FORM set_excel_cell  USING  p_in_excel  TYPE ole2_object
                            p_in_line   TYPE i
                            p_in_field  TYPE any
                            p_out_cols  TYPE i.

  DATAlv_cell   TYPE ole2_object.

* 指定单元格
  CALL METHOD OF
      p_in_excel
      'CELLS'    lv_cell
    EXPORTING
      #1         p_in_line
      #2         p_out_cols.
* 写入值
  IF p_in_field is NOT INITIAL.
  SET  PROPERTY OF lv_cell
                   'VALUE' p_in_field.
  ENDIF.


  p_out_cols p_out_cols + 1.

ENDFORM.                    " SET_EXCEL_CELL
*&---------------------------------------------------------------------*
*&      Form  GET_SAVE_PATH
*&---------------------------------------------------------------------*
*       获取下载文件完整路径
*----------------------------------------------------------------------*
*      <--P_IN_PATH  text
*----------------------------------------------------------------------*
FORM get_save_path  CHANGING p_in_path  TYPE string.
  DATAlv_filename   TYPE string,
        lv_path       TYPE string,
        lv_name       TYPE string.
  lv_name s_track-low.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         '下载文件'
      file_filter          '*.xls'
      default_file_name    lv_name
    CHANGING
      filename             lv_filename
      path                 lv_path
      fullpath             p_in_path
    EXCEPTIONS
      cntl_error           1
      error_no_gui         2
      not_supported_by_gui 3
      OTHERS               4.

  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.



ENDFORM.                    " GET_SAVE_PATH

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多