第一弹:基于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技术

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

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

相关文章

Python 全栈体系【三阶】(三)

第一章 Django 七、静态文件 1. 概述 静态文件是指在WEB应用中的图像文件、CSS文件、Javascript文件。 2. 静态文件的配置 settings.py中关于静态文件的配置如下&#xff1a; STATICFILES_DIRS [BASE_DIR , static, ]STATIC_URL /static/其中&#xff1a; STATICFILES…

微服务架构下Mojo模型的创新应用:细粒度服务与智能优化

微服务架构下Mojo模型的创新应用&#xff1a;细粒度服务与智能优化 在当今快速发展的云计算和大数据时代&#xff0c;微服务架构以其灵活性、可扩展性和易于维护的特点&#xff0c;成为软件开发的主流趋势。Mojo模型&#xff0c;作为机器学习领域中的一种技术&#xff0c;通过…

C++——模板初阶 | STL简介

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

便携气象站:科技助力气象观测

在科技飞速发展的今天&#xff0c;便携气象站以其轻便、高效、全面的特点&#xff0c;正逐渐改变着气象观测的传统模式。这款小巧而强大的设备&#xff0c;不仅为气象学研究和气象灾害预警提供了有力支持&#xff0c;更为户外活动、农业生产等领域带来了诸多便利。 便携气象站是…

vscode anaconda jupyternotebook R Python配置

vscode anaconda jupyternotebook R Python配置 anaconda 官网下载安装vscode官网下载安装、jupyternotebook设置vscode基于python运行jupyternotebook其中python设置的是本地环境vscode基于r运行jupyternotebook4. 4.1下载R&#xff0c;可更改R工作目录 4.2 vscode的R扩展可以…

Redis+Lua脚本+AOP+反射+自定义注解,打造我司内部基础架构限流组件

定义注解 Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface RedisLimitAnnotation {/*** 资源的key,唯一* 作用&#xff1a;不同的接口&#xff0c;不同的流量控制*/String key() default "";/*** 最多的访问限制次数…

算法日记day 17(二叉树的最大、最小深度)

一、二叉树的最大深度 题目&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1…

STM32智能机器人控制系统教程

目录 引言环境准备智能机器人控制系统基础代码实现&#xff1a;实现智能机器人控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人控制与优化问题解决方案与优化收尾与总结 1. 引言 智能机器人控…

qt中charts图表的使用方法

折线图 #include "widget.h" #include "ui_widget.h" #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include<QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent), …

JS设计模式(六)装饰器模式

注释很详细&#xff0c;直接上代码 特色和用途&#xff1a; 扩展性&#xff1a;装饰器模式通过一种对客户端透明的方式来扩展对象的功能&#xff0c;而无需修改现有代码。这使得你可以逐步添加或修改功能&#xff0c;而不会影响到已有的代码。简化代码&#xff1a;装饰器模式避…

Windows图形界面(GUI)-MFC-C/C++ - MFC项目工程框架解析

公开视频 -> 链接点击跳转公开课程博客首页 -> e​​​​​​链接点击跳转博客主页 目录 MFC项目 项目选择 配置安装 程序引导 MFC框架 环境设置 程序框架 代码编写 MFC解析 程序入口 执行流程 代码结构 应用程序类 窗口框架类 消息处理 消息类型 消息…

异步TCP服务器;异步TCP客户端

目录 1. 异步TCP服务器 2. 异步TCP客户端 3. 其他模块的使用 在Python中,使用os, asyncio, typing, socket, 和 random等模块可以实现很多功能,比如异步网络通信、文件操作、随机数生成等。下面,我将基于这些模块给出一个简单的异步TCP客户端和服务器示例,同时解释这些模…

ML.Net 学习之使用经过训练的模型进行预测

什么是ML.Net&#xff1a;&#xff08;学习文档上摘的一段&#xff1a;ML.NET 文档 - 教程和 API 参考 | Microsoft Learn 【学习入口】&#xff09; 它使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。 借助此功能&#xff0c;可以使用应用程序的可用数据进行自…

【Go程序】爬虫获取豆瓣Top250

之前在网上下载了一个minigame的开源项目&#xff0c;就是电影日历。里面有一项使用了豆瓣的API&#xff0c;获取豆瓣的Top250的电影。但是由于豆瓣的OpenAPI改版了&#xff0c;又不好申请到OpenAPI的资格&#xff0c;想想也不是什么非法的事情&#xff0c;就稍微搞几部电影名字…

Mojo模型魔法:动态定制特征转换的艺术

标题&#xff1a;Mojo模型魔法&#xff1a;动态定制特征转换的艺术 在机器学习领域&#xff0c;模型的灵活性和可扩展性是至关重要的。Mojo模型&#xff08;Model-as-a-Service&#xff09;提供了一种将机器学习模型部署为服务的方式&#xff0c;允许开发者和数据科学家轻松地…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议(带私活)

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

【大数据专题】Flink题库

1 . 简述什么是Apache Flink &#xff1f; Apache Flink 是一个开源的基于流的有状态计算框架。它是分布式地执行的&#xff0c;具备低延迟、高吞吐的优秀性能&#xff0c;并且非常擅长处理有状态的复杂计算逻辑场景 2 . 简述Flink 的核心概念 &#xff1f; Flink 的核心概念…

基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码

回归分析是科学研究特别是生态学领域科学研究和数据分析十分重要的统计工具&#xff0c;可以回答众多科学问题&#xff0c;如环境因素对物种、种群、群落及生态系统或气候变化的影响&#xff1b;物种属性和系统发育对物种分布&#xff08;多度&#xff09;的影响等。纵观涉及数…

HarmonyOS NEXT零基础入门到实战-第四部分

自定义组件: 概念: 由框架直接提供的称为 系统组件&#xff0c; 由开发者定义的称为 自定义组件。 源代码&#xff1a; Component struct MyCom { build() { Column() { Text(我是一个自定义组件) } } } Component struct MyHeader { build() { Row(…

路由器ip地址脱机是什么意思?怎么应对

在数字化时代&#xff0c;路由器作为家庭或企业网络连接的核心设备&#xff0c;其稳定性和连通性对于我们的网络体验至关重要。然而&#xff0c;有时我们可能会遇到路由器IP地址显示脱机的情况&#xff0c;这不仅影响了我们的网络访问&#xff0c;还可能对工作和娱乐造成不便。…