第一弹:基于ABAP OLE技术实现对服务器文件进行读写操作

news2024/11/24 22:23:38

前言

最近遇到这样一个需求,需要对BW服务器上的文件进行下载的同时写入每个用户相对应的数据。之前的服务器模版是一个死模版,对于这样的要求,我就想到了OLE技术,那么什么是OLE技术呢?

一、什么是OLE技术?

我在Kimi上问了这样一个问题,它的回答看起来还挺专业的,如下:

简单的说,基于 OLE 的 ABAP 代码操作 Excel 依赖于Excel 应用程序。通过调用 COM 对象,ABAP 能够控制 Excel,实现对 Excel 文件的读写操作。这就要求客户端计算机上安装有Excel。

当ABAP使用这种代码操作Excel时:

此时查看操作系统的进程列表,会发现后台悄悄起了一个 Excel.exe 进程,参数为 /automation -Embedding. 这个参数表明 Excel 正在以一种特殊模式运行,用于支持 OLE 自动化和嵌入功能。这种模式允许其他应用程序通过编程方式控制 Excel,比如本文以 ABAP为例,而不需要用户直接与 Excel 的图形用户界面交互。

/automation 参数指示 Excel 以自动化模式启动。这意味着 Excel 将不显示其图形用户界面,而是在后台运行,等待来自 ABAP 应用程序的命令。这对于需要从其他应用程序自动读取或写入 Excel 文件的场景特别有用。

-Embedding 参数则与 OLE技术的嵌入功能有关。当 Excel 程序以此参数运行时,它作为一个服务器,可以处理来自客户端应用程序的嵌入请求。这些嵌入的对象请求将保留 Excel 的功能,如公式计算和数据分析。

通过编程方式控制以 /automation -Embedding 模式运行的 Excel,应用程序可以使用第三方编程语言,创建、填充并格式化 Excel 工作簿,无需用户手动操作。

二、服务器文件上传

SAP或者BW的服务器文件一般是通过T-code-SMW0去实现上载的,如图:

选择二进制数据,然后选择对应的开发包:

可以选择新建文件,将自己本地的模版文件上传即可,也可对现有的模版的进行更换,选择文件右键导入即可

三、ABAP程序下载与读写

前置条件准备好后,这个时候就可以通过程序进行下载模版文件了,代码如下:


  CONCATENATE sy-datum   "按照当前日期格式进行文件名生成
            '_'
            sy-uzeit
            '_'
            lv_filename
       INTO lv_filename.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension    = lv_extension
      default_file_name    = lv_filename
      initial_directory    = lv_path
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CLEAR: lv_destination.
    lv_destination = lv_fullpath.  "用户选择本地存放的文件路径
  ENDIF.

  CHECK lv_user_action <> 9.

  SELECT SINGLE relid objid
  FROM wwwdata
  INTO CORRESPONDING FIELDS OF ls_objdata
  WHERE srtf2 = 0
   AND objid = lv_objid 
   AND relid = 'MI'.

    CLEAR: lv_rc.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'                   
      EXPORTING
        key         = ls_objdata
        destination = lv_destination   "下载的文件路径
      IMPORTING
        rc          = lv_rc.

这个时候通过代码将文件下载到用户的本地文件目录上去,接下来是重头戏,下面代码需要通过OLE技术操作Excel数据,将ABAP内表数据自定义的写到文件中:

第一步:定义对应的对象:


  DATA: lv_filename    TYPE string,
        lv_path        TYPE string,
        lv_fullpath    TYPE string,
        lv_user_action TYPE i,
        lv_destination LIKE rlgrap-filename,
        ls_objdata     LIKE wwwdatatab,
        lv_objid       TYPE wwwdatatab-objid,
        lv_rc          TYPE sy-subrc,
        lv_extension   TYPE string,
        excel_obj      TYPE  ole2_object,
        book_obj       TYPE  ole2_object,
        sheet          TYPE  ole2_object。

第二步:创建对应的对象:


      " 创建EXCEL对象
      CREATE OBJECT excel_obj 'EXCEL.APPLICATION'.
      IF sy-subrc NE 0.
        MESSAGE 'EXCEL创建错误' TYPE 'S' DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
      "设置EXCEL是否后台打开
      SET PROPERTY OF excel_obj 'VISIBLE' = 0.
      SET PROPERTY OF excel_obj 'DISPLAYALERTS' = 0.
      CALL METHOD OF excel_obj 'WORKBOOKS' = book_obj.
      "打开刚刚生成的文件
      CALL METHOD OF book_obj 'Open' 
        EXPORTING
          #1 = lv_destination

第三步:打开对应的Sheet页签:


      GET PROPERTY OF excel_obj 'ACTIVECELL' = sheet.
      "页签名字
      CALL METHOD OF excel_obj 'Worksheets' = sheet
      EXPORTING
        #1 = 'Project'.
      CALL METHOD OF sheet 'select'.
      CALL METHOD OF sheet 'ACTIVATE'.

第四步:取出需要填充的数据:


      LOOP AT lt_mk01 INTO DATA(ls_mk01).
        ls_line-project = ls_mk01-id && '-' && ls_mk01-desc.
        ls_line-xmattr = ls_mk01-xmattr.
        ls_line-xmfzr = ls_mk01-xmfzr.
        ls_line-xmyear = ls_mk01-xmyear.
        APPEND ls_line TO lt_line.
      ENDLOOP

第五步:将数据写到Excel:


      IF lt_line IS NOT INITIAL.
        LOOP AT lt_line INTO ls_line.
          lv_num = sy-tabix + 1.
          PERFORM fill_cell USING lv_num 1 0 ls_line-project excel_obj.
          PERFORM fill_cell USING lv_num 2 0 ls_line-xmattr excel_obj.
          PERFORM fill_cell USING lv_num 3 0 ls_line-xmfzr excel_obj.
          PERFORM fill_cell USING lv_num 4 0 ls_line-xmyear excel_obj.
        ENDLOOP.
      ELSE.
        MESSAGE TEXT-m15 TYPE 'S' DISPLAY LIKE 'E'.
        RETURN.
      ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FILL_CELL
*&---------------------------------------------------------------------*
*   row:  行号,
*   col:  列号,
*   bold: 字体是否加粗,0,否,1是.
*   val:  填充值
*----------------------------------------------------------------------*
FORM fill_cell  USING row col bold val excel_obj.
  DATA: cell_obj  TYPE  ole2_object.
  CALL METHOD OF  excel_obj 'CELLS'   = cell_obj
    EXPORTING  #1        = row
               #2        = col.
  SET PROPERTY OF cell_obj 'VALUE' = val.
ENDFORM. 

总结

    到这里所有的写入操作都已经结束了,如果还需要加粗,改变字体颜色什么的,这些格式操作也比较简单,大家可以在网上进行查询。

    总结一下,这种OLE的方式实际上还得依赖本地Excel的完成,且一旦数据量多了之后,效率会变得很慢,但对于小需求,数据不大这种场景,OLE其实也是比较推荐的,由于代码量也不多,实现起来也较快。

下一篇咱们会讲相比OLE技术而言,速度更快,且兼容性更强的abap2xlsx技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引&#xff1f;您想提高您网站的搜索引擎知名度吗&#xff1f;如果是&#xff0c;您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图&#xff0c;可帮助…

基于DPUSmartNic的云原生SDN解决方案

1. 方案背景与挑战 随着云计算&#xff0c;大数据和人工智能等技术的蓬勃发展&#xff0c;数据中心面临着前所未有的数据洪流和计算压力&#xff0c;这对SDN提出了更高的性能和效率要求。自云原生概念被提出以来&#xff0c;Kubernetes为云原生应用的落地提供了一个轻量级&am…

tolua++bug,int64强转double导致值不对

我C传值给lua&#xff0c;接口用的tolua。传过去值不对&#xff0c;我都懵逼了。是C强转问题。

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

linux、windows、macos清空本地DNS缓存

文章目录 Linux&#xff1a;Windows&#xff1a;macOS&#xff1a; Linux&#xff1a; 对于使用systemd的操作系统&#xff08;如CentOS 7、Ubuntu 16.04&#xff09;&#xff0c;可以使用以下命令重启systemd-resolved服务来清除缓存&#xff1a; sudo systemctl restart sys…

Mistral联合英伟达开源12B小模型:碾压Llama 3,单张4090可跑

小模型&#xff0c;成为本周的AI爆点。 与动辄上千亿参数的大模型相比&#xff0c;小模型的优势是显而易见的:它们不仅计算成本更低&#xff0c;训练和部署也更为便捷&#xff0c;可以满足计算资源受限、数据安全级别较高的各类场景。因此&#xff0c;在大笔投入大模型训练之余…

【ROS2】高级:安全-设置访问控制

目标&#xff1a;限制节点可以使用的主题。 教程级别&#xff1a;高级 时间&#xff1a;20 分钟 内容 背景 修改 permissions.xml签署策略文件 启动节点 使用模板 背景 在继续之前&#xff0c;请确保您已完成设置安全教程。 权限非常灵活&#xff0c;可以用来控制 ROS 图中的许…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

WPS辟谣用户文档被用于AI训练:坚守个人信息保护底线

AITOP100平台获悉&#xff0c;7 月 21 日有网友在社交平台发文称“WPS 改版了用我们的文章喂给 AI 了”“WPS 疑似把我的审签内容喂给抖音豆包 AI”。这一消息引起了部分用户对于个人信息安全的担忧。针对这一传言&#xff0c;WPS官方客服微博于当日下午作出回应&#xff0c;明…

ARM功耗管理之功耗和安全

安全之安全(security)博客目录导读 思考&#xff1a;功耗与安全&#xff1f;超频攻击&#xff1f;欠压攻击&#xff1f;低功耗流程中的安全&#xff1f; 睡眠唤醒流程中&#xff0c;安全相关寄存器的备份恢复 举例&#xff1a;比如某DMA通道&#xff0c;芯片逻辑默认为安全通…

论文学习记录之一种具有边缘增强特点的医学图像分割网络

标题&#xff1a;一种具有边缘增强特点的医学图像分割网络 期刊&#xff1a;电子与信息学报-&#xff08;2022年5月出刊&#xff09; 摘要&#xff1a;针对传统医学图像分割网络存在边缘分割不清晰、缺失值大等问题&#xff0c;该文提出一种具有边缘增强特点的医学图像分割网…

【C语言】 利用栈完成十进制转二进制(分文件编译,堆区申请空间malloc)

利用栈先进后出的特性&#xff0c;在函数内部&#xff0c;进行除二取余的操作&#xff0c;把每次的余数存入栈内&#xff0c;最后输出刚好就是逆序输出&#xff0c;为二进制数 学习过程中&#xff0c;对存储栈进行堆区的内存申请时候&#xff0c;并不是很熟练&#xff0c;一开始…

【LaTeX Overleaf】 论文修订

对于在word中写的论文一般是使用【审阅】-【比较文档】来输出对比结果&#xff1b;对于overleaf&#xff0c;使用LaTeX排版&#xff0c;如何通过标记文字颜色来实现对比效果呢&#xff1f;&#xff1f; 1 批注功能-使用changes 宏包 在 LaTeX 中&#xff0c;changes 宏包是一个…

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展&#xff0c;汽车自动化、智能化程度的逐步提高&#xff0c;人们对汽车的安全性、舒适性、娱乐性等要求也不断提高&#xff0c;加上汽车节能减排法规的不断严峻&#xff0c;整车电气设备不断增加&#xff0c;作为连接汽车各种电器设备“神经网络”的整车…

docker安装jenkins,并配置jdk、node和maven

拉取jenkins镜像 docker pull jenkins/jenkins:2.468-jdk21 创建一个文件夹&#xff0c;用于二次打包jenkins镜像 mkdir -p /data/jenkins cd /data/jenkins 提前准备好jdk和maven&#xff0c;并放到/data/jenkins下 由于8.x以上版本的maven只支持https协议&#xff0c;我们需…

分享一个最近在进行前后端联调时改了2天的bug...

场景再现 我们这边前端端口是8080 后端端口是8121 我们在前端里在首页面写了一个任务 当进入网页三秒后 发起一个叫getLoginUser的请求 我们的getLoginUser是调用的这里 一个异步请求 这边我们前端调用后端的接口也已经写好 我们先把后端跑起来 访问前端页面 接收到了这个…

源码搭建国内微短剧系统(APP+小程序)云存储配置流程

国内微短剧系统很多人不知道云存储和配置的操作流程&#xff0c;我整理了一份非常详细的操作文档流程&#xff0c;给大家介绍短剧系统云存储配置的详细操作流程。顺便推荐一下国内微短剧系统。 推荐下他们的开源地址&#xff1a;https://gitee.com/nymaite_com_2878868888/tjg…