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 I 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:\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

说明:应用这个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 .

SAP导出内表数据到excel的更多相关文章

  1. 七十一、SAP中内表的修改,改一行数据,或一行的某个字段

    一.SAP中内表的修改,只能通过工作区来修改,代码如下 二.效果如下

  2. 使用POI导出百万级数据到excel的解决方案

    1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...

  3. REUSE_ALV_GRID_DISPLAY显示ALV,设置可编辑时,与内表数据同步问题

    使用function module: REUSE_ALV_GRID_DISPLAY显示ALV,并设置alv某些列可编辑,可是编辑后发现对应的内表数据并没有随之改变.记得需要设置一个参数的值,怎么想也记 ...

  4. ABAP内表数据和JSON格式互转

    本程序演示ABAP内表数据如何转为JSON格式,以及JSON数据如何放入内表. 注:json字符串格式如:jsonstr = '[ {flag: "0",message: &quo ...

  5. SQLServer导出导出单表数据

    1.SQLServer导出单表数据为TXT文件 数据库--任务--导出数据

  6. 七十四、SAP中内表的4中删除方法

    一.代码如下 二.效果如下 *&---------------------------------------------------------------------* *& Re ...

  7. 六十七、SAP中内表插入的三种方法之一,APPEND的使用

    一.如果内表是一个普通的内表,只用于存储数据不用来排序,那么优先选择APPEND插入 二.我们运行程序,并把工作区和内表加入到断点变量,如图所示,1X22的意思如图 三.我们点击ITAB1,来看内表数 ...

  8. SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    今天接到一个FTP的需求,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器. SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据: User:登录FT ...

  9. mysql导出多个表数据为excel方法,substring函数查询

    //查询sys_username以S.00655开头的用户 ),sys_password FROM `tbl_sa_syslogin` where sys_username like 'S.%'; / ...

随机推荐

  1. 让样式文件,或js文件的相对路径,变成成绝对路径

    添加两行代码即可 <% String path = request.getContextPath(); String basePath = request.getScheme() + " ...

  2. selenium实现京东商城首页查找元素

    语言:Python 京东商城想要找到某个未加载出的元素,需要将页面加载出来. 使用js实现 流程: 1. 需要引入包: # 引入需要的包 import time from selenium impor ...

  3. supervisor管理airflow

    #用airflow帐号 su - airflow. /home/airflow/venv/bin/activatepip install supervisormkdir -p /home/airflo ...

  4. Jenkins学习指南

    jenkinshttps://www.cnblogs.com/jimmy-xuli/p/9020825.htmlhttps://www.cnblogs.com/along21/p/10172855.h ...

  5. 分布式系统/NoSQL

    分布式系统概念与架构:https://www.cnblogs.com/JonaLin/category/1555338.html 分布式缓存 redis系列:https://blog.csdn.net ...

  6. SQLServer学习之表的操作

    SQLServer学习之表的操作 关系数据库通常包含多个表.数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的.表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象. ...

  7. Spring5的总体架构图

    Spring5的主体架构图 主要是四大部分:Web.Data Access/Integration.Core Container.中间层,具体见下图:

  8. Java实现链队

    一.分析 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.允许插入的一端称为队尾,允许删除的一端称为队头. 链队是指采用链式存储结构实现的队列,它的基本操作如下: 1.初始 ...

  9. Flink概述

    计算引擎 大数据计算引擎分为离线计算和实时计算,离线计算就是我们通常说的批计算,代表是Hadoop MapReduce.Hive等大数据技术.实时计算也被称作流计算,代表是Storm.Spark St ...

  10. 【原创】Linux基础之去掉windows中的\r

    linux换行为\n,windows换行为\r\n,windows环境编辑的shell脚本在linux下执行会报错: line 2: $'\r': command not found 查看 # cat ...