IT干货网

ABAP内表导出为EXCEL格式的几种方法

xmjava 2022年06月08日 SAP 874 0

 这是一篇转载文章,本人修改了其中的几个错字病句

内表数据下载到EXCEL的几种方法

本文链接: IT虾米网

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. 

 

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

 



    原因: DATASC格式存的表格其实是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:\SAP\QQ1.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
40   .
 

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

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

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

 

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

  

4. OLE

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

实现方法见这篇文章:IT虾米网

 

5. 函数: XXL_FULL_API

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

  

6. ABAP2XLSX

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

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

   具体可参考此文章

 

7. XLSX Workbench

  

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

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

官方文档:IT虾米网

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 .
 

评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

概念验证:在Kubernetes中部署ABAP