当前位置: 首页 > news >正文

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

前言

最近遇到这样一个需求,需要对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_filenameINTO lv_filename.CALL METHOD cl_gui_frontend_services=>file_save_dialogEXPORTINGdefault_extension    = lv_extensiondefault_file_name    = lv_filenameinitial_directory    = lv_pathCHANGINGfilename             = lv_filenamepath                 = lv_pathfullpath             = lv_fullpathuser_action          = lv_user_actionEXCEPTIONScntl_error           = 1error_no_gui         = 2not_supported_by_gui = 3OTHERS               = 4.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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 objidFROM wwwdataINTO CORRESPONDING FIELDS OF ls_objdataWHERE srtf2 = 0AND objid = lv_objid AND relid = 'MI'.CLEAR: lv_rc.CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'                   EXPORTINGkey         = ls_objdatadestination = lv_destination   "下载的文件路径IMPORTINGrc          = 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' = sheetEXPORTING#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_objEXPORTING  #1        = row#2        = col.SET PROPERTY OF cell_obj 'VALUE' = val.
ENDFORM. 

总结

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号3
  • springMVC常用注解
  • K8S 上部署 Prometheus + Grafana
  • VScode连接虚拟机运行Python文件的方法
  • 物联网mqtt网关搭建背后的技术原理
  • [k8s源码]6.reflector
  • 开发面试算法题求教
  • Mojo模型魔法:动态定制特征转换的艺术
  • C#中栈和堆以及修饰符
  • 系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读
  • Kafka Producer之事务性
  • VSCode STM32嵌入式开发插件记录
  • 计算机毕业设计hadoop+spark+hive物流大数据分析平台 仓储数据分析 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习 知识图谱 大数据
  • 软件物料清单科普 | SBOM对开源管理的意义
  • Apache POI-Excel入门与实战
  • 【Linux系统编程】快速查找errno错误码信息
  • CSS 专业技巧
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • IOS评论框不贴底(ios12新bug)
  • Java 内存分配及垃圾回收机制初探
  • java中具有继承关系的类及其对象初始化顺序
  • JS函数式编程 数组部分风格 ES6版
  • JS实现简单的MVC模式开发小游戏
  • MD5加密原理解析及OC版原理实现
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • win10下安装mysql5.7
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 汉诺塔算法
  • 力扣(LeetCode)22
  • 力扣(LeetCode)56
  • 前端存储 - localStorage
  • 入门级的git使用指北
  • 试着探索高并发下的系统架构面貌
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​Spring Boot 分片上传文件
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # wps必须要登录激活才能使用吗?
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (javascript)再说document.body.scrollTop的使用问题
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)windows配置JDK环境
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .equals()到底是什么意思?
  • .NET : 在VS2008中计算代码度量值
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET多线程执行函数
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net专家(张羿专栏)
  • ??javascript里的变量问题