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

文章目录

  • 前言
  • 一、后端开发
    • 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 ).

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2008年全国生态自然地域划分数据,shp格式,来源于国家生态环境部发布的《全国生态功能区》2008年版

数据名称: 全国生态自然地域划分数据 数据格式: Shp 数据时间: 2008年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;国家生态环境部发布的《全国生态功能区》2008年版 数据字段&#xff1a; 序号字段名称字段说明1bh编号2stq_1生态区_大类3stq_2生态区…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付&#xff08;Alipay Sandbox Payment&#xff09;是支付宝提供的一个模拟支付环境&#xff0c;用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户&#xff0c;而沙箱环境则提…

网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

高速路sip广播对讲求助 隧道sip对讲调度SIP-7011 网络广播终端SV-7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP-7011 SV-7011网络对讲终端网络对讲、网络厂播、监听 SV-7101网络解码终端提供一路线路输出接功放或有源音箱。 SV-7102网络解码广播终端两…

OpenGL如何基于glfw库 进行 点线面 已解决

GLFW是现在较流行、使用广泛的OpenGL的界面库&#xff0c;而glut库已经比较老了。GLEW是和管理OpenGL函数指针有关的库&#xff0c;因为OpenGL只是一个标准/规范&#xff0c;具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多&#xff0c;它大多数函数的位置…

一加 Buds 3正式发布:普及旗舰音质 一加用户首选

1月4日&#xff0c;一加新品发布会正式推出旗下新款耳机一加 Buds 3。延续一加经典美学&#xff0c;秉承音质完美主义追求&#xff0c;一加 Buds 3全面普及一加旗舰耳机体验&#xff0c;其搭载旗舰同款“超清晰同轴双单元”&#xff0c;配备49dB 4000Hz超宽频主动降噪&#xff…

企语iFair 协同管理系统 任意文件读取漏洞复现(CVE-2023-47473)

0x01 产品简介 企语iFair协同管理系统是一款专业的协同办公软件,该管理系统兼容性强,适合多种企业类型。该软件永久免费,绿色安全,无需收取费用即可使用所有功能。企语iFair协同管理系统同时兼容了Linux、Windows两种操作系统 0x02 漏洞概述 企语iFair协同管理系统getup…

LangChain与昇腾

LangChain这个词今年已经听烂了&#xff0c;今天基于昇腾的角度总结一下&#xff1a; Why LangChain &#xff1f; 场景&#xff1a;构建一个LLM应用 在构建一个新项目时&#xff0c;可能会遇到许多API接口、数据格式和工具。要去研究每一个工具、接口很麻烦。 假设要构建一…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1&#xff09;案例需求&#xff1a; 使用 Flume 监听一个端口&#xff0c;收集该端口数据&#xff0c;并打印到控制台。 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;安装 netcat 工具 sudo yum …

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

探索3D软件的奥秘:Maxon Cinema 4D与Autodesk Maya的比较

在3D软件的广阔天地中&#xff0c;Maxon Cinema 4D和Autodesk Maya无疑是两颗璀璨的明星。它们各自拥有独特的功能和特点&#xff0c;使它们在影视、广告、游戏等领域中广受欢迎。在这篇文章中&#xff0c;我们将深入探讨这两款软件的差异&#xff0c;以帮助您更好地了解它们。…

Python编程基础:顺序结构、循环结构、程序跳转语句、pass空语句

Python是一种简单而强大的编程语言&#xff0c;它提供了多种结构和语句&#xff0c;使得程序编写变得更加灵活和高效。在本文中&#xff0c;将介绍Python中的顺序结构、循环结构、程序跳转语句以及pass空语句&#xff0c;并解释如何正确使用它们。 目录 程序的描述方式自然语言…

真双端口ram相关知识点

WEA&#xff1a; RAM 端口 A 写使能信号&#xff0c;高电平表示向 RAM 中写入数据&#xff0c;低电平表示从 RAM 中读出数据。 ENA&#xff1a;端口 A 的使能信号&#xff0c;高电平表示使能端口 A &#xff0c;低电平表示端口 A 被禁止&#xff0c;禁止后端口 A 上的读写操作…

论文解读Language-based Action Concept Spaces Improve Video Self-Supervised Learning

Language-based Action Concept Spaces Improve Video Self-Supervised Learning 基于语言的动作概念空间改善视频自我监督学习 备注: 最近研究需要&#xff0c;先将翻译概括内容放这里 论文地址&#xff1a;论文 https://arxiv.org/pdf/2307.10922v3.pdf 摘要 最近的对比…

【AI】使用LoFTR进行图像匹配测试Demo

LoFTR图像匹配的源码解析我们在上篇文章中已经写了&#xff0c;对于怎么试用一下&#xff0c;我这边再啰嗦一下。 0.环境搭建 详细的搭建教程请点击链接查看&#xff0c;这里只对需要特殊注意的地方做阐述 1.创建的Python环境采用python3.8的环境&#xff0c;因为文章发布较早…

2023 年最先进认证方式上线,Authing 推出 Passkey 无密码认证

密码并非是当前数字世界才有的安全手段。古今中外诸如故事中的《阿里巴巴与四十大盗》的“芝麻开门”口诀&#xff0c;或是江湖中“天王盖地虎&#xff0c;宝塔镇河妖”等传统的口令形式&#xff0c;都是以密码作为基本形态进行身份认证。然而&#xff0c;随着密码在越来越多敏…

第十四章 14.2案例:使用KVM命令集管理虚拟机

查看命令帮助 [rootLinux01 ~]# virsh -h—————————————————————————————————————————— 查看KVM的配置文件存放目录〈test01 , xml是虚拟机系统实例的配置文件) [rootLinux01 ~]# ls /etc/libvirt/qemu —————————————…

这个方法可以让你把图片无损放大

随着数字技术的不断发展&#xff0c;照片无损放大已经成为了摄影领域中的一项重要技术。照片无损放大能够让摄影师在不损失细节和画质的情况下&#xff0c;将照片放大到更大的尺寸&#xff0c;从而让观众能够更加清晰地欣赏到照片中的每一个细节。 今天推荐的这款软件主要是通…

redis服务迁移数据工具--RDM

一、背景&#xff1a; 在日常的运维工作经常遇见各种数据迁移工作&#xff0c;例如mysql数据库迁移、redis数据库迁移、minio数据迁移等等工作。这里介绍一下redis数据库的迁移过程。 二、迁移思路&#xff1a; redis服务/集群的数据迁移思路是需要新建一个配置、密码一样的re…

T527 camera: AHD摄像头转MIPI

一、AHD 常见的摄像头接口一般有MIPI、USB、DVP等等&#xff0c;但是MIPI摄像头受限于高速信号的传输距离问题&#xff0c;导致走线不能太长&#xff0c;这样在安防监控领域、车载等领域&#xff0c;使用就很受限&#xff0c;因此会引入AHD&#xff0c;目的就是提高了传…

Python 自学(三) 之序列的应用

目录 1. 序列的含义 2. 序列的索引 P80 3. 序列相加 P81 4. 序列乘法 P82 5. in 关键字 P83 6. 计算序列的最大值max()&#xff0c;最小值min()和长度len() P83 7. 列表的初始化 list() P85 8. 列表元素的添加&#xff0c;…