UI5与后端的文件交互(四)

news2025/1/18 17:06:25

文章目录

  • 前言
  • 一、后端开发
    • 1. 新建管理模板表格
    • 2. 新建Function,动态创建文档
  • 二、修改UI5项目
    • 1.Table里添加下载证明列
    • 2. 实现onClickDown事件
  • 三、测试
  • 四、附


前言

这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。
这篇的主要内容有:

  1. 后端RAP的开发(S4HANA On-Premise)
    • 新建表格及CDS,管理模板文件
    • 新建Function(动态创建Excel文档并返回文件流)
  2. 前端(UI5)
    • 提交请求并下载文档(例:在职证明)

一、后端开发

1. 新建管理模板表格

@EndUserText.label : 'Form Template Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table ymoon_t000 {
  key client   : abap.clnt not null;
  key uuid     : sysuuid_x16 not null;
  attachment   : abap.string(0);
  attachment_x : abap.rawstring(0);
  filename     : abap.char(200);
  erdat        : erdat;
  erzet        : erzet;

}
  • 附上数据
    在这里插入图片描述

工作模式和之前里的内容是一样的。就是把文件流保存到表格里。 额外一点就是把XString类型的数据也一并保存。这里不再熬述

  • Method实现
  method upload_template.
    "获取UI5传送的parameter

    data(attachment) = keys[ 1 ]-%param-attachment.
    data(filename_full) = keys[ 1 ]-%param-filename.

    "
    split filename_full at `.` into data(lv_filename) data(lv_filetype).

    "拆分数据,只保留excel内容 - lv_data
    split attachment at `;` into data(lv_dummy) data(lv_data).
    split lv_data at `,` into data(lv_format) lv_data.

    data:lv_excel_data type xstring.
    "将base64的String转换为xstring
    call function 'SCMS_BASE64_DECODE_STR'
      exporting
        input  = lv_data
      importing
        output = lv_excel_data
      exceptions
        failed = 1
        others = 2.

    "更新模板文件
    data:ls_t000 type ymoon_t000.

    select single uuid from ymoon_t000 into @data(uuid_00) where filename = @filename_full.

    if uuid_00 is not initial.
      ls_t000-uuid = uuid_00.
    else.
      ls_t000-uuid = cl_system_uuid=>create_uuid_x16_static( ).
    endif.

    ls_t000-attachment = attachment.
    ls_t000-attachment_x = lv_excel_data.
    ls_t000-filename = filename_full.
    ls_t000-erdat = sy-datum.
    ls_t000-erzet = sy-uzeit.

    modify ymoon_t000 from ls_t000.


  endmethod.

2. 新建Function,动态创建文档

  • BEDF 添加Function
static function download_form parameter ymoon_s012 result [1] ymoon_s013;
  • Method实现(使用abap2xlsx插入数据并返回base64值)
  method download_form.



    types: begin of t_sheet1,
             name          type c length 60,
             bdate(200),
             id(20),
             sdate(200),
             position(100),
             salary(20),
             nyear(4),
             nmonth(2),
             nday(2),
           end of t_sheet1.
    data: gs_sheet1 type t_sheet1.
    data: ls_ymoon_s013 type ymoon_s013,
          ls_t000       type ymoon_t000.


    data: lo_excel  type ref to zcl_excel, "엑셀
          lo_reader type ref to zif_excel_reader,
          lo_root   type ref to cx_root. "异常类
    "excel worksheet类对象
    data:lo_worksheet type ref to zcl_excel_worksheet.
    "excel超链接
    data:lo_hyperlink type ref to zcl_excel_hyperlink.
    "style类
    data:lo_style type ref to zcl_excel_style.
    "style的guid
    data:lv_style_guid type zexcel_cell_style.

    data:lo_column    type ref to zcl_excel_column.

    data: lo_data type ref to zcl_excel_template_data.

    data:lv_line  type sy-tabix,
         lv_line2 type sy-tabix,
         lv_line3 type sy-tabix.


    data(uuid) = keys[ 1 ]-%param-uuid.

    "动态获取内容
    select single name from ymoon_t010 into @data(lv_uname) where uuid = @uuid.


    "测试数据
    gs_sheet1-name     = lv_uname.
    gs_sheet1-bdate    = '1990年1月1日'.
    gs_sheet1-id       = '11101019900101XXXX'.
    gs_sheet1-sdate    = '2020年10月20日'.
    gs_sheet1-position = '技术总监'.
    gs_sheet1-salary   = '20,000'.
    gs_sheet1-nyear    = sy-datum+0(4).
    gs_sheet1-nmonth   = sy-datum+4(2).
    gs_sheet1-nday     = sy-datum+6(2).




    select single attachment_x from ymoon_t000 into @data(lv_attachment_x).

    try.
* prepare data
        create object lo_data.
        lo_data->add( iv_sheet = 'Sheet1' iv_data = gs_sheet1 ).

* create reader
        create object lo_reader type zcl_excel_reader_2007.

* load template
        lo_excel = lo_reader->load( i_excel2007 = lv_attachment_x ).

* merge data with template
        lo_excel->fill_template( lo_data ).

        lo_worksheet = lo_excel->get_active_worksheet( ).

*      lo_worksheet->set_cell( ip_column = 'C' ip_row = 4 ip_value = '테스트' ).
*
        lo_worksheet->calculate_column_widths( ).

*** Create output

        data cl_writer type ref to zif_excel_writer.
        create object cl_writer type zcl_excel_writer_2007.

        data: xdata     type xstring,             " Will be used for sending as email
              t_rawdata type solix_tab,           " Will be used for downloading or open directly
              bytecount type i.                   " Will be used for downloading or open directly
        xdata = cl_writer->write_file( lo_excel ).

        data:lv_base64  type string.
        call function 'SCMS_BASE64_ENCODE_STR'
          exporting
            input  = xdata
          importing
            output = lv_base64.

        ls_ymoon_s013-attachment = lv_base64.
        ls_ymoon_s013-filename = '在职证明-' && lv_uname && '.xlsx'.

        "返回base64
        append value #( %param = ls_ymoon_s013 ) to result .

      catch cx_root into lo_root.

    endtry.

  endmethod.

二、修改UI5项目

1.Table里添加下载证明列

<Button text="下载证明" press="onClickDown" type="Neutral"></Button>

2. 实现onClickDown事件

这里需要注意的是BDEF里定义的function是GET方法

onClickDown: function (e) {
                var that = this
                var oModel = this.getView().getModel();
                var uuid = e.getSource().getBindingContext().getProperty("Uuid");

                oModel.callFunction("/download_form",
                    {
                        method: "GET",
                        urlParameters: {   //参数,首字母大写 
                            "Uuid": uuid
                        },
                        success: function (odata, response) {
                            //Model Refresh
                            // debugger
                            var vContent = response.data.download_form;
                            var file = vContent.Filename.split(".")

                            var blob = that.base64toBlob(vContent.Attachment, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                            File.save(blob, file[0], file[1], 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                        },
                        error: function (res) {
                            console.log(res)
                        }
                    })

            },

三、测试

在这里插入图片描述

四、附

  • 此外,如果是OP的话,可以使用smw0管理模板文件。具体load方法可以参考如下代码。
//io_reader  type ref to zif_excel_reader
//ro_excel   type ref to zcl_excel
  ls_key-relid = 'MI'.
  ls_key-objid = iv_w3objid .  //对象名称

" 读取SMW0文件
  call function 'WWWDATA_IMPORT'
    exporting
      key    = ls_key
    tables
      mime   = lt_mime
    exceptions
      others = 1.
  if sy-subrc <> 0.
    lv_errormessage = 'A problem occured when reading the MIME object'(004).
    zcx_excel=>raise_text( lv_errormessage ).
  endif.

" 读取 filesize 
  call function 'WWWPARAMS_READ'
    exporting
      relid = ls_key-relid
      objid = ls_key-objid
      name  = 'filesize'
    importing
      value = lv_filesizec.

* XSTRING转换
  lv_filesize = lv_filesizec.
  call function 'SCMS_BINARY_TO_XSTRING'
    exporting
      input_length = lv_filesize
    importing
      buffer       = lv_excel_data
    tables
      binary_tab   = lt_mime
    exceptions
      failed       = 1
      others       = 2.

*--------------------------------------------------------------------*
* Parse Excel data into ZCL_EXCEL object from binary string
*--------------------------------------------------------------------*
  ro_excel = io_reader->load( i_excel2007 = lv_excel_data ).

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

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

相关文章

KNN 分类(选择最佳的 K 值,并可视化模型精度与 n_neighbors 的关系)

import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier# 导入乳腺癌数据集 cancer load_breast_cancer()# 划分训练集和测试集 X_tra…

CodeWave智能开发平台--03--目标:应用创建--02数据模型设计

摘要 本文是网易数帆CodeWave智能开发平台系列的第05篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成数据模型设计 CodeWave智能开发平台的05次接触 CodeWave参考资源 网易数帆CodeWave开发者社区…

原版俄罗斯方块通关为啥这么难?

俄罗斯方块这款游戏相信很多人都玩过&#xff0c;其难易程度我们也见识过&#xff0c;近日看到一则新闻《美国13岁少年通关原版俄罗斯方块&#xff0c;此前只有AI做到过》&#xff0c;感叹世界之大&#xff0c;牛人太多。这款游戏诞生于上世纪八十年代&#xff0c;由苏联程序员…

嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目(开源)

网盘资料&#xff1a; 《嵌入式-stm32-基于HAL库的感应开关盖垃圾桶项目&#xff08;开源&#xff09;》 链接&#xff1a;https://pan.baidu.com/s/1kFk09nMKPDvLwIUqMT9q3w 提取码&#xff1a;og66 –来自百度网盘超级会员V6的分享 目录 一&#xff1a;项目概述 二&#xf…

PPT自带录屏大揭秘,一键提升演示文稿效果

在现代演示文稿制作中&#xff0c;屏幕录制是一种非常实用的功能&#xff0c;尤其是对于ppt演示而言。ppt提供了自带的屏幕录制功能&#xff0c;使用户能够直接在ppt中录制屏幕操作。本文将详细介绍ppt自带录屏的使用方法&#xff0c;帮助你在制作ppt演示时轻松实现屏幕录制。 …

速卖通商品详情 API(aliexpress.item_get):限制和要求

速卖通商品详情 API&#xff08;aliexpress.item_get&#xff09;的限制和要求主要包括以下几个方面&#xff1a; API调用频率限制&#xff1a;速卖通平台对商品详情 API 的调用频率有一定的限制&#xff0c;例如&#xff0c;每个账号每天最多可以调用多少次 API。如果超过了这…

Java TBA访问NetSuite Restlet时的403错误

本周有同学问为啥Java访问NetSuite Restlet时&#xff0c;按照知识会之前的文章分享&#xff0c;会一直报403 INVALID_LOGIN_ATTEMPT错误。 https://nk-community.blog.csdn.net/article/details/131399801https://nk-community.blog.csdn.net/article/details/131399801原因是…

云原生战专题 | 深入浅出分析云原生微服务的技术结构和架构设计

深入浅出分析云原生微服务的技术结构和架构设计 云原生容器技术背景容器编排Kubernetes控制平面的四大组件Kubernetes在容器编排中的设计要点 云原生微服务典型架构第一代微服务架构第二代微服务架构第三代微服务架构第四代微服务架构 未来的云原生架构 — Serverless 云原生容…

mysql 添加用户并分配select权限

1.root用户先登录或者在可执行界面 1.1 选择mysql 点击mysql 或者在命令行 use mysql 1.2创建用户 CREATE USER username% IDENTIFIED BY password; 备注1&#xff1a;%替换为可访问数据库的ip&#xff0c;例如“127.0.0.1”“192.168.1.1”&#xff0c;使用“%”表示不限制…

2.HDFS 架构

目录 概述架构HDFS副本HDFS数据写入流程NN 工作原理DN 工作原理 结束 概述 官方文档快递 环境&#xff1a;hadoop 版本 3.3.6 相关文章速递 架构 HDFS HDFS 架构总结如下&#xff1a; a master/slave architecture 一主多从架构a file is split into one or more blocks a…

【python高级用法】进程

一个简单的进程 # -*- coding: utf-8 -*-import multiprocessingdef foo(i):print (called function in process: %s %i)returnif __name__ __main__:Process_jobs []for i in range(5):p multiprocessing.Process(targetfoo, args(i,))Process_jobs.append(p)p.start()p.j…

展望2024: 中国AI算力能否引爆高性能计算和大模型训练的新革命?

★算力&#xff1b;算法&#xff1b;人工智能&#xff1b;高性能计算&#xff1b;高性能&#xff1b;高互联&#xff1b;生成式人工智能&#xff1b;StableDiffusion&#xff1b;ChatGPT&#xff1b;CoPilot&#xff1b;文本创建&#xff1b;图像生成&#xff1b;代码编写&…

Transformer从菜鸟到新手(三)

引言 这是Transformer的第三篇文章&#xff0c;上篇文章中我们了解了多头注意力和位置编码&#xff0c;本文我们继续了解Transformer中剩下的其他组件。 层归一化 层归一化想要解决一个问题&#xff0c;这个问题在Batch Normalization的论文中有详细的描述&#xff0c;即深层…

Windows找不到文件‘chrome‘,请确定文件名是否正确后,再试一次。

本文主要记录遇到vscode运行HTML文件提示&#xff1a; Windows找不到文件‘chrome‘&#xff0c;请确定文件名是否正确后&#xff0c;再试一次。问题的解决办法。 目录 一、打开设置 二 、搜索Live Server Config &#xff08;1&#xff09;安装Live Server插件 &#xff0…

弧垂观测手段再升级!输电线路导线弧垂检测装置的应用_深圳鼎信

输电线路导线弧垂是指在输电线路中导线的水平位置与塔杆之间的垂直距离。导线的弧垂是确定导线张力、塔杆高度等参数的重要依据。通过测量弧垂及时调整弧垂大小对保证输电线路的安全运行具有重要作用。鼎信将介绍两种测量弧垂的方法&#xff0c;一起来学习一下吧&#xff01; …

TikTok明星经济:短视频背后的网络名人

在当今数字时代&#xff0c;社交媒体平台的崛起为许多人带来了独特的机遇&#xff0c;其中TikTok作为一款短视频应用&#xff0c;正成为网络名人崛起的孵化器。随着TikTok用户量的不断增加&#xff0c;平台上涌现出越来越多的明星&#xff0c;这些明星不仅仅在虚拟世界中受到欢…

微信小程序分销商城制作源码系统:全部搭建好直接使用 带完整的安装代码包以及搭建教程

随着移动设备的普及和互联网技术的发展&#xff0c;电子商务逐渐成为人们购物的主要方式之一。而微信作为中国最大的社交平台之一&#xff0c;拥有庞大的用户基数和成熟的生态系统。因此&#xff0c;基于微信小程序开发分销商城具有巨大的市场潜力和商业价值。 以下是部分代码…

超级详细的 https 中间人攻击流程。

客户端发送 https 请求中间人截获 https 请求&#xff0c;然后在转发给服务端 中间人可以是抓包工具中间人可以通过伪造证书的方式截获请求服务端接收到请求【看起来是客户端发的&#xff0c;实际上已经经过中间人转发了】服务端以为是一个安全的请求&#xff0c;向客户端发送数…

计算机研究生论文检索方法汇总

计算机研究生论文检索方法汇总 作为一名优质(冤种)计算机在读研究生&#xff0c;检索论文是一项不可或缺的技能之一。 一、paperwithcode paperswithcode是一个免费开放的资源平台&#xff0c;提供了机器学习领域的论文、代码、数据集、方法和评估表。在这里我们可以检索不同…

对图片进行数据增强(基于pytorch)

背景 在进行机器学习的任务中&#xff0c;我们的训练数据往往是有限的&#xff0c;在有限的数据集上获得较好的模型训练结果&#xff0c;我们不仅要在模型结构上下功夫&#xff0c;另一方面也需要对数据集进行数据增强 图片数据增强 图像数据增强是一种在训练机器学习和深度学…