ABAP-OLE-EXCEL

6 篇文章 0 订阅
本文主要对 通过EXCEL输出数据进行总结


不传模板示例

DATA: V_EXCEL TYPE OLE2_OBJECT,
      V_BOOK TYPE OLE2_OBJECT,
      V_CELL TYPE OLE2_OBJECT,
      V_RANGE TYPE OLE2_OBJECT,
      V_FONT TYPE OLE2_OBJECT,
      V_COLOR TYPE OLE2_OBJECT,
      V_COLUMN TYPE OLE2_OBJECT.

DATA: BEGIN OF LT_STOCK OCCURS 0,           "数据处理
  WERKS TYPE WERKS_D,
  NAME1 TYPE NAME1,
  LGORT TYPE LGORT_D,
  MATNR TYPE MATNR,
  MAKTX TYPE MAKTX,
  LABST TYPE LABST,
  END OF LT_STOCK.

DATA FULLPATH TYPE STRING.


PARAMETERS P_WERKS LIKE MARD-WERKS DEFAULT '1010'.          "界面

TYPE-POOLS OLE2.            "引用OLE类型池

FORM GET_DATA.                      "数据处理
  SELECT A~WERKS
         B~NAME1
         A~LGORT
         A~MATNR
         C~MAKTX
         A~LABST
    INTO TABLE LT_STOCK
    FROM MARD AS A
    INNER JOIN T001W AS B ON A~WERKS = B~WERKS
    INNER JOIN MAKT AS C ON A~MATNR = C~MATNR AND C~SPRAS = SY-LANGU
    WHERE A~WERKS = P_WERKS.
ENDFORM.                    " GET_DATA

FORM EXCEL.             "OLE控制EXCEL

    DEFINE FILL_CELL.
    CALL METHOD OF V_EXCEL 'CELLS' = V_CELL      "单元格位置
      EXPORTING
        #1 = &1
        #2 = &2.
    SET PROPERTY OF V_CELL 'value' = &3.        "单元格内容

    CALL METHOD OF V_CELL 'FONT' = V_FONT.
    SET PROPERTY OF V_FONT 'Bold' = &4.         "设置是否为粗体
    SET PROPERTY OF V_FONT 'size' = &5.         "设置字体大小
  END-OF-DEFINITION.
*创建EXCEL对象
  CREATE OBJECT V_EXCEL 'Excel.Application'.
  CALL METHOD OF V_EXCEL 'Workbooks' = V_BOOK.
  CALL METHOD OF V_BOOK 'ADD'.                    "新建一个EXCEL对象

  FILL_CELL 1 1 '当前商品可用库存状态' 1 18.        "填写首行标题
  SET PROPERTY OF V_CELL 'HorizontalAlignment' = -4108.         "设置标题文本居中
  SET PROPERTY OF V_FONT 'UNDERLINE' = 2.           "标题加下划线

*设置表头,表头统一为10号字体,加粗
  FILL_CELL 2 1 '地点' 1 10.
  FILL_CELL 2 2 '地点名称' 1 10.
  FILL_CELL 2 3 '库位' 1 10.
  FILL_CELL 2 4 '物料' 1 10.
  FILL_CELL 2 5 '物料名称' 1 10.
  FILL_CELL 2 6 '当前库存' 1 10.

*选中标题所在的单元格并合并
  CALL METHOD OF V_EXCEL 'Range' = V_RANGE
    EXPORTING
      #1 = 'A1'
      #2 = 'F1'.
  CALL METHOD OF V_RANGE 'select '.                 "RANGE 也为已经定义好的OLE2_OBJECT.
  SET PROPERTY OF V_RANGE 'MergeCells' = 1.         "合并单元格


  FIELD-SYMBOLS: <WA> TYPE ANY,
                 <FIELD> TYPE ANY.
  DATA LV_TXT(50) TYPE C.

  DATA: ROW_I TYPE I,
        COL_I TYPE I.

*从内表循环数据,按顺序填到单元格之中
  LOOP AT LT_STOCK ASSIGNING <WA>.
    ROW_I = SY-TABIX + 2.
    DO 6 TIMES.
      COL_I = SY-INDEX.
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE <WA> TO <FIELD>.
      LV_TXT = <FIELD>.
      FILL_CELL ROW_I COL_I LV_TXT 0 10.

      IF COL_I = 6 AND LV_TXT <= 0.

* 当可用库存为0时,在EXCEL中将该单元格标识为黄色
        CALL METHOD OF V_CELL 'INTERIOR' = V_COLOR.
        SET PROPERTY OF V_COLOR 'ColorIndex' = 6.
      ENDIF.
    ENDDO.
  ENDLOOP.

*将EXCEL单元格宽度按实际文本长度来设置
  CALL METHOD OF V_EXCEL 'Columns' = V_COLUMN.
  CALL METHOD OF V_COLUMN 'Autofit'.

*设置EXCEL为可见
  SET PROPERTY OF V_EXCEL 'Visible' = 1.
ENDFORM.

传模板示例

过程:通过SMW0上传模板 -> 代码下载模板 -> OLE控制数据填充 -> 保存EXCEL

*模板下载
DATA:  lo_objdata LIKE wwwdatatab,
         lo_mime LIKE w3mime,
         lc_filename  TYPE string VALUE '哈哈哈哈哈' ,       "名称
         lc_fullpath  TYPE string   ,
         lc_path      TYPE  string  ,
         ls_destination LIKE rlgrap-filename,
         ls_objnam TYPE string,
         li_rc LIKE sy-subrc,
         ls_errtxt TYPE string.
  DATA:p_objid TYPE wwwdatatab-objid,
       p_dest LIKE sapb-sappfad.
  p_objid = 'ZTESTT'.         "模板名称
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension    = 'XLS'
      default_file_name    = lc_filename
    CHANGING
      filename             = lc_filename
      path                 = lc_path
      fullpath             = lc_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF lc_fullpath = ''.
    MESSAGE  '不能打开excel' TYPE 'E'.
  ENDIF.
  IF sy-subrc = 0.
    p_dest = lc_fullpath.
    concatenate p_objid '.XLS' 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 = p_objid.

*检查表wwwdata中是否存在所指定的模板文件
    IF sy-subrc NE 0 OR lo_objdata-objid EQ space.
      CONCATENATE '模板文件' ls_objnam '不存在' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'I'.
    ENDIF.
    ls_destination = p_dest.

*如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lo_objdata
        destination = ls_destination
      IMPORTING
        rc          = li_rc.
    IF li_rc NE 0.
      CONCATENATE '模板文件:' ls_objnam '下载失败' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'E'.
    ENDIF.
    fname = ls_destination.
  ENDIF.

*对EXCEL进行数据处理
CREATE OBJECT excel 'EXCEL.APPLICATION'.  "Create EXCEL OBJECT
  IF sy-subrc NE 0.
    EXIT.
  ENDIF.
*  SET PROPERTY OF excel 'Visible' = 1.  "1/0 是否显示EXCEL

  CALL METHOD OF
      excel
      'Workbooks' = workbook.

  CALL METHOD OF
      workbook
      'Open'

    EXPORTING
      #1       = fname."打开上面下载路径下的excel文件

  CALL METHOD OF
      excel
      'Sheets' = sheet
    EXPORTING
      #1       = 1.

  CALL METHOD OF
      sheet
      'Select'.

  CALL METHOD OF sheet 'ACTIVATE'. "sheet 激活

  SET PROPERTY OF sheet 'NAME' = ''. "设定sheet名称

*此处假设内表itab 中已经存在需要写入excel中的数据
    
   data: row TYPE i,
          col TYPE i.
  LOOP AT it_alv INTO wa_alv.
      CALL METHOD OF                "将数据插入EXCEL对应的行 列
          excel
          'CELLS' = cell
        EXPORTING
          #1      = row
          #2      = col.
      SET PROPERTY OF cell 'VALUE' = wa_alv-zbnfpo.
  ENDLOOP.

*保存EXCEL数据
GET PROPERTY OF excel 'ActiveSheet' = sheet.
  FREE OBJECT sheet.
  FREE OBJECT workbook.

  GET PROPERTY OF excel 'ActiveWorkbook' = workbook.
  CALL METHOD OF
      workbook
      'SAVE'.

  SET PROPERTY OF excel 'Visible' = 0.  "是否显示EXCEL 此处显示不退出

* SET PROPERTY OF excel 'Visible' = 1.

  CALL METHOD OF workbook 'CLOSE'.
  CALL METHOD OF excel 'QUIT'. "注释部分为不显示直接退出

  FREE OBJECT sheet.
  FREE OBJECT workbook.
  FREE OBJECT excel.


相关类型池/对象/函数/数据库表

  • 类型池:OLE2
  • 对象:OLE2_OBJECT
  • 对象:WWWDATATAB
  • 对象:W3MIME
  • 对象:SAPD-SAPPFAD "存档链接文件路径
  • 函数:GUI_FILE_SAVE_DIALOG -> 对话框维护文件路径
  • 函数:GUI_DOWNLOAD -> 将内表下载到PC端
  • 函数:DOWNLOAD_WEB_OBJECT -> 下载一个WEB模板
  • 数据库表:OLELOAD -> OLE类型信息加载
  • 数据库表:WWWDATA -> 存储WWW对象的INDX类型表

或可直接使用函数读取

TEXT_CONVERT_XLS_TO_SAP 此函数弊端为只可识别Office的Excel
ALSM_EXCEL_TO_INTERNAL_TABLE 该函数支持WPS的识别,但每个单元格最大限长为50字符,行数最多为9999,如有特殊需要可自行修改该函数

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值