设为首页 收藏本站
查看: 1932|回复: 0

[经验分享] SAP ABAP OLE 操作EXCEL小结

[复制链接]

尚未签到

发表于 2015-9-18 13:37:56 | 显示全部楼层 |阅读模式
  
  
  ABAP直接操作EXCEL实现数据处理。这里是用OLE实现操作EXCEL的。现在还有
  DOI操作EXCEL等方法。以后用到再做介绍。此处不是直接生成EXCEL文件,而是从
  服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存。也可以直接创建
  新的EXCEL文件往里面传递数据并设置格式。这里不做介绍。
  
  1.采用模板文件实现。上传EXCEL模板
  
T-code:SMW0 WebRFC 的二进制数据 包:MI  
DSC0000.jpg
  点击 DSC0001.jpg 按钮,上传excel模板。
  模板数据保存在系统表wwwdata中。
  
  2.在程序中下载模板
  *下载EXCEL模板FORM
  FORM  temp_excel_get.
  DATA:  lo_objdata LIKE wwwdatatab,
         lo_mime LIKE w3mime,
         lc_filename  TYPE string VALUE'test01' ,
         lc_fullpath  TYPE string  VALUE'D:\test\' ,
         lc_path      TYPE  string VALUE'D:\test\' ,
         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 = 'ZTEST.XLS'. “此处为EXCEL模板名称
  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.
ENDFORM.                    "fm_excel
  
  3.下载完模板后,打开模板文件,填入数据
  
  
  CREATE OBJECT excel 'EXCEL.APPLICATION'.  "Create EXCEL OBJECT
  IF sy-subrc NE 0.
    EXIT.
  ENDIF.
  SET PROPERTY OF excel 'Visible' = 0.  "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' = sheetname. “设定sheet名称
  *此处假设内表itab 中已经存在需要写入excel中的数据
  *并且假如从模板的第7行开始插入数据
  LOOP AT itab INTO wa.
    tab = wa-tabix + 6.
*在excel中插入一行
    PERFORM excel_row_insert USING sheet tab 1.
  *填充所插入行的每个单元格的数据
    PERFORM fill_range USING tab 1 wa-t01.
    PERFORM fill_range USING tab 2 wa-t02.
    PERFORM fill_range USING tab 3 wa-t03.
    PERFORM fill_range USING tab 4 wa-t04.
    PERFORM fill_range USING tab 5 wa-t05.
    PERFORM fill_range USING tab 6 wa-t06.
  ENDLOOP.
  *设置EXCEL中所插入的数据行边框线格式为黑色有边框

  bod = tab.
  CONDENSE bod NO-GAPS.
  CONCATENATE 'A6:F' bod INTO bod.
  PERFORM borderrange USING excel bod.
  PERFORM sub_excel_save."保存excel数据
  
  *&---------------------------------------------------------------------*
*&      Form  sub_excel_save
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_excel_save.
  GET PROPERTY OF excel 'ActiveSheet' = sheet. “获取活动SHEET
  FREE OBJECT sheet.
  FREE OBJECT workbook.
  GET PROPERTY OF excel 'ActiveWorkbook' = workbook.
  CALL METHOD OF workbook 'SAVE'.
  SET PROPERTY OF excel 'Visible' = 1.  "是否显示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.
ENDFORM.                    "save_book
  
  
  *&---------------------------------------------------------------------*
*& 向excel中的指定行插入N行
*&---------------------------------------------------------------------*
FORM excel_row_insert USING lcobj_sheet
                            lc_row
                            lc_count.
  DATA lc_range TYPE ole2_object.
  DATA h_borders  TYPE ole2_object.
  DO lc_count TIMES.
    CALL METHOD OF lcobj_sheet 'Rows' = lc_range
      EXPORTING #1 = 6.
    CALL METHOD OF lc_range 'Copy'.  “COPY第6行插入一个新行
    CALL METHOD OF lcobj_sheet 'Rows' = lc_range
      EXPORTING #1 = lc_row.
    CALL METHOD OF lc_range 'Insert'.
    CALL METHOD OF lc_range 'ClearContents'. "是否需要清空Cell
  ENDDO.
ENDFORM.                    "excel_row_insert
  *&---------------------------------------------------------------------*
*&      Form  fill_range
*&---------------------------------------------------------------------*
*       text  填充EXCEL 单元格
*----------------------------------------------------------------------*
*      -->VALUE(F_ROW)    text
*      -->VALUE(F_COL)    text
*      -->VALUE(F_VALUE)  text
*----------------------------------------------------------------------*
FORM fill_range USING value(f_row)
                      value(f_col)
                      value(f_value).
  DATA:
    row TYPE i,
    col TYPE i.
  row = f_row.
  col = f_col.
  CALL METHOD OF excel 'CELLS' = cell
    EXPORTING
    #1 = row
    #2 = col.
  SET PROPERTY OF cell 'VALUE' = f_value.
ENDFORM.                    "fill_range
  *&---------------------------------------------------------------------*
*&      Form  borderrange
*&---------------------------------------------------------------------*
*       text:设置EXCEL中所插入的数据行边框线格式
  *----------------------------------------------------------------------*
*      -->LCOBJ_EXCEL  text
*      -->RANGE        text
*----------------------------------------------------------------------*
FORM borderrange USING lcobj_excel
                       range .
  DATA: lc_cell TYPE ole2_object ,
        lc_borders TYPE ole2_object .
  CALL METHOD OF lcobj_excel 'RANGE' = lc_cell
    EXPORTING
    #1 = range.
  DO 4 TIMES .
    CALL METHOD OF lc_cell 'BORDERS' = lc_borders
      EXPORTING #1 = sy-index.
    SET PROPERTY OF lc_borders 'LineStyle' = '1'.
    SET PROPERTY OF lc_borders 'WEIGHT' = 2.                "4=max
    SET PROPERTY OF lc_borders 'ColorIndex' = '1'.
  ENDDO.
  FREE OBJECT lc_borders.
  FREE OBJECT lc_cell.
ENDFORM.                    "borderrange
  
  暂时只用到了这么多,还有ABAP设置EXCEL字体,对齐方式等功能。什么时候用到了再
  做研究。希望对大家有所帮助。
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115476-1-1.html 上篇帖子: SAP 如何定义后台job 下篇帖子: SAP之开票
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表