zoukankan      html  css  js  c++  java
  • SAP导出内表数据到excel

    DATA: EXCEL    TYPE OLE2_OBJECT,
          SHEET    TYPE OLE2_OBJECT,
          CELL     TYPE OLE2_OBJECT,
          WORKBOOK TYPE OLE2_OBJECT,

          XLSNAME  TYPE STRING VALUE 'C:sap_usr02.xls',
          LINE     TYPE VALUE 0"行号

    CREATE OBJECT EXCEL 'EXCEL.APPLICATION'."启动Excel

    IF SY-SUBRC NE 0.
      WRITE: / '启动Excel失败。'.
      STOP.
    ENDIF.

    CALL METHOD  OF EXCEL 'WORKBOOKS' = WORKBOOK.
    SET PROPERTY OF EXCEL 'VISIBLE'   1.       "使excel 可视

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

    LOOP AT IT_DATA INTO MY_DATA.
      LINE LINE + 1.   "Excel 中行号从1开始

      CALL METHOD   OF EXCEL 'CELLS' = CELL EXPORTING #1 LINE #2 1"指定单元格,
      SET  PROPERTY OF CELL  'VALUE' = MY_DATA-MANDT.                   "写入值

      CALL METHOD   OF EXCEL 'CELLS' = CELL EXPORTING #1 LINE #2 2"指定单元格,
      SET  PROPERTY OF CELL  'VALUE' = MY_DATA-BNAME.                   "写入值

      CALL METHOD   OF EXCEL 'CELLS' = CELL EXPORTING #1 LINE #2 3"指定单元格,
      SET  PROPERTY OF CELL  'VALUE' = MY_DATA-ERDAT.                   "写入值

      CALL METHOD   OF EXCEL 'CELLS' = CELL EXPORTING #1 LINE #2 4"指定单元格,
      SET  PROPERTY OF CELL  'VALUE' = MY_DATA-LTIME.                   "写入值

    ENDLOOP.

    GET PROPERTY OF EXCEL    'ACTIVESHEET'         = SHEET.          "激活工作簿
    GET PROPERTY OF EXCEL    'ACTIVEWORKBOOK'      = WORKBOOK.       "激活工作区

    CALL METHOD  OF WORKBOOK 'SAVEAS' EXPORTING #1 = XLSNAME #2 1"将excel文件保存
    CALL METHOD  OF WORKBOOK 'CLOSE'.                                "关闭工作区
    CALL METHOD  OF EXCEL    'QUIT'.                                 "退出excel

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

    FREE OBJECT SHEET.                                               "释放操作
    FREE OBJECT WORKBOOK.
    FREE OBJECT EXCEL.

    其他方法:

    目录

    1. 函数: GUI_DOWNLOAD

      这是一种最基本的方法,对应 CLASS: CL_GUI_FRONTEND_SERVICES 的方法 GUI_DOWNLOAD

          注意FILENAME参数的扩展名应为XLS,这样在保存时可以保存为EXCEL格式。 示例如下:

     1 DATA:itab LIKE TABLE OF  mara WITH HEADER LINE.

     3DATA:BEGINOF t_fieldnames  OCCURS0,
     4 
     5        name TYPE char20,
     6 
     7      END OF t_fieldnames.
     8 
     9 START-OF-SELECTION.
    10 
    11   SELECT * FROM mara INTO TABLE itab UP TO 10 ROWS.
    12 
    13   t_fieldnames-name = '公司代码'.
    14 
    15   APPEND t_fieldnames.
    16 
    17   t_fieldnames-name = '功能范围'.
    18 
    19   APPEND t_fieldnames.
    20 
    21   CALL FUNCTION 'GUI_DOWNLOAD'
    22     EXPORTING
    23       filename   = 'C:1234.xls'
    24       filetype   = 'DAT'
    25       "这里一般用DAT,如果用ASC则1000-不会显示为-1000,而dat会显示为-1000,如果用DBF则不会有缩进,即字符前面的空格会被除去,而且字符的前导0也会输出。
    26       codepage   = '8404'
    27     TABLES
    28       data_tab   = itab
    29       fieldnames = t_fieldnames.  

        这个函数虽然比较简单,但当FILETYPE为DAT和ASC时,生成的文件用EXCEL打开时会弹出如下的对话框:

        原因: 以DAT和ASC格式存的表格其实是TXT格式,与EXCEL格式不一致,将扩展名改为TXT,会很容易看出这一点。

    2. 函数:SAP_CONVERT_TO_XLS_FORMAT

       这个FM功能与GUI_DOWNLOAD类似,支持xlsx格式:

    SELECT * FROM sflight INTO TABLE @DATA(gt_temp) UP TO 10 ROWS.
    
    CALL FUNCTION 'SAP_CONVERT_TO_XLS_FORMAT'
      EXPORTING
        i_filename        = 'C:SAPQQ1.XLSX'
      TABLES
        i_tab_sap_data    = gt_temp
      EXCEPTIONS
        conversion_failed = 1
        OTHERS            = 2.
    IF sy-subrc <> 0.
    * Implement suitable error handling here
    ENDIF.

    3. 函数: MS_EXCEL_OLE_STANDARD_DAT

         同时也会直接打开EXCEL文件。这个FM不仅仅能把数据传到EXCEL,

        但是这个函数有一个缺点:当要把中文数据导入到EXCEL时就必有登陆中文的GUI运行程序,否则中文就会变成'#'号。

     1 DATA:BEGIN OF it_fieldnames  OCCURS 0,
     2 
     3        name TYPE char20,
     4 
     5      END OF it_fieldnames.
     6 
     7 it_fieldnames-name = 'Company Code'.
     8 
     9 APPEND it_fieldnames.
    10 
    11 it_fieldnames-name = 'Function Area'.
    12 
    13 APPEND it_fieldnames.
    14 
    15 it_fieldnames-name = '5'. "针对非C、N、D、T类型列的列名,函数有Bug
    16 
    17 APPEND it_fieldnames.
    18 
    19 CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
    20   EXPORTING
    21     file_name  = 'C:johnson.XLSX'
    22 *   CREATE_PIVOT                    = 0
    23 *   DATA_SHEET_NAME                 = ' '
    24 *   PIVOT_SHEET_NAME                = ' '
    25 *   PASSWORD   = ' '
    26 *   pASSWORD_OPTION                 = 0
    27   TABLES
    28 *   PIVOT_FIELD_TAB                 =
    29     data_tab   = itab
    30     fieldnames = it_fieldnames
    31 *     EXCEPTIONS
    32 *   FILE_NOT_EXIST                  = 1
    33 *   FILENAME_EXPECTED               = 2
    34 *   cOMMUNICATION_ERROR             = 3
    35 *   oLE_OBJECT_METHOD_ERROR         = 4
    36 *   OLE_OBJECT_PROPERTY_ERROR       = 5
    37 *   INVALID_PIVOT_FIELDS            = 6
    38 *   DOWNLOAD_PROBLEM                = 7
    39 *   OTHERS     = 8

        说明:应用这个FM时要注意的问题:

      1、Fieldname数据类型会被强制转变为对应列的类型,如果转换失败则Dump

      2、如果连续两次或两次以上以上调用,列名会跑到数据区

        还有一个函数似乎是它的前身,名字是 EXCEL_OLE_STANDARD_DAT ,实现方法相似。不过这个函数对某些表会报"data can't converted in unicode program" 的错误,所以还是建议采用最新的函数。

    4. OLE

    这种方式与上面几种比较优点在于能够定制EXCEL格式,不过比较麻烦。

    实现方法见这篇文章:http://www.cnblogs.com/hhelibeb/p/5787396.html

    5. 函数: XXL_FULL_API

    同样能实现EXCEL格式,并且速度上较OLE有优势。SE38有几个参考示例: XXLTTEST, XXLSTEST, XXLFTEST

    6. ABAP2XLSX

    这是一个类包,是一群爱好者开发的一个专门用于将ABAP数据导入到EXCEL的类,包括对齐,合并,字体,着色等的设置,因为是面向对象的,相比OLE方式要简单,编写程序也就比较省力。

    一般用于需要定制EXCEL格式的情况。

       具体可参考此文章

    7. XLSX Workbench

    一种可视化表单生成工具,相比复杂的OLE,可以用少量代码+一些拖拽和配置来生成EXCEL报表,性能更好。按XLSX Workbench的文档介绍,它有九大特性:

    • 无需ABAP编程技能
    • 可视化设计方式
    • 高性能
    • 支持后台处理
    • 强大的表单格式特性支持
    • 支持公式
    • 支持图片
    • 支持图表
    • 支持树

    官方文档:https://sites.google.com/site/sapxlwb/home

    XLSX Workbench是我眼中的首选方案,因为它的可视化编辑工具真的很方便。通过这个工具,开发者只需要简单地将数据放入设计好的context结构,并且在可视化工具中将context绑定到具体的单元格,就可以生成EXCEL文件了:

    DATA: l_data TYPE zcontext.
    
    CALL FUNCTION 'ZXLWB_CALLFORM'
      EXPORTING
        iv_formname    = 'ZXLWBFORM'
        iv_context_ref = l_data
      EXCEPTIONS
        OTHERS         = 2.
    IF sy-subrc NE 0 .
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
    ENDIF .
  • 相关阅读:
    C语言 · 最小公倍数
    SSH实战 · SSH项目开发环境搭建
    C语言 · 回文数
    C语言 · 特殊回文数
    C语言 · 查找整数
    SSH实战 · SSH项目中怎么玩验证码
    SSH实战 · JAVA发送邮件相关
    SSH实战 · AJAX异步校验
    C语言 · 打印1-200之间的素数
    Jenkins权限设计错误解决办法
  • 原文地址:https://www.cnblogs.com/youleng/p/10926937.html
Copyright © 2011-2022 走看看