zoukankan      html  css  js  c++  java
  • WDA学习(17):WDA excel upload && download

    1.10 Excel upload && download

    在WDA中实现excel上传下载。

    创建WDA Component,Z_TEST_WDA13。

     

     1.创建Context上下文

    创建上传表节点

    创建NODE:NODE_SFLIGHT,类型:SFLIGHT;

     

     

    上传文件信息节点:

    创建NODE:NODE_UPLOAD_DATA

    创建Attribute:FILENAME,类型String;

    创建Attribute:FILETYPE,类型String;

    创建Attribute:DATA,类型XString;

     

     2.创建Layout视图

    创建E_FILEUP,FILEUPLOAD视图控件,上传文件选择操作;

    创建E_BUTTON,BUTTON视图控件,上传动作;

    创建E_BUTTON1,BUTTON视图控件,下载动作;

    创建E_TABLE,TABLE视图控件,用来显示上传结果;

     

     

    设置上传按钮text属性,创建对应Action;

    设置下载按钮text属性,创建对应Action;

     

      绑定Context节点,data对应NODE_UPLOAD_DATA-DATA,fileName对应NODE_UPLOAD_DATA-FILENAME,mineType对应NODE_UPLOAD_DATA-FILETYPE;

     

     选择E_TABLE,右键选择Creat Binding,绑定上下文节点Context;

      3.实现Action等方法

    实现SHOW_MSG方法

    代码实例:

    method SHOW_MSG .
      "显示信息
      DATA: l_current_controller TYPE REF TO if_wd_controller,
            l_message_manager    TYPE REF TO if_wd_message_manager.
    
      l_current_controller ?= wd_this->wd_get_api( ).
      CALL METHOD l_current_controller->get_message_manager
        RECEIVING
          message_manager = l_message_manager.
    
    * report message
      IF msg_type = 'S'.
        CALL METHOD l_message_manager->report_success
          EXPORTING
            message_text = msg.
      ELSEIF msg_type = 'E'.
        CALL METHOD l_message_manager->report_error_message
          EXPORTING
            message_text = msg.
      ELSEIF msg_type = 'I'.
        CALL METHOD l_message_manager->report_message
          EXPORTING
            message_text = msg.
      ENDIF.
    endmethod.
    View Code

    实现相应Action方法

    创建INIT_SFLIGHT方法,初始化查询sflight表信息,并且绑定节点Context。

     

     代码实例:

    method INIT_SFLIGHT .
      DATA:lo_node TYPE REF TO if_wd_context_node.
      DATA:lt_sflight TYPE wd_this->Elements_node_sflight.
      DATA:ls_sflight LIKE LINE OF lt_sflight.
    
      "获取节点
      lo_node = wd_context->get_child_node( name = 'NODE_SFLIGHT' ).
      "查询数据
      SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_sflight FROM sflight.
      "绑定数据
      lo_node->bind_table( lt_sflight ).
    endmethod.

    初始化方法调用初始化init_sfight

    method WDDOINIT .
      init_sflight( ).
    endmethod.

    实现上传Action方法

    method ONACTIONUPLOAD .
      DATA:lo_node TYPE REF TO if_wd_context_node.
      DATA:lt_node_sflight TYPE wd_this->Elements_node_sflight.
      DATA:ls_node_sflight LIKE LINE OF lt_node_sflight.
      "文件节点数据
      DATA:ls_node_upload_data TYPE wd_this->Element_node_upload_data.
      "文件数据
      DATA:lv_file TYPE xstring.
    
      "excel文档类对象
      DATA:lo_excel TYPE REF TO zcl_excel.
      "excel worksheet类对象
      DATA:lo_worksheet TYPE REF TO zcl_excel_worksheet.
      "异常类
      DATA:lf_cxexcel TYPE REF TO ZCX_EXCEL.
      "上传excel
      DATA:cl_reader TYPE REF TO zif_excel_reader.
      "excel导入内表
      TYPES:BEGIN OF s_excel,
          carrid TYPE string,
          connid TYPE string,
          fldate TYPE string,
          price TYPE string,
          currency TYPE string,
          planetype TYPE string,
          seatsmax TYPE string,
          seatsocc TYPE string,
          paymentsum TYPE string,
          END OF s_excel.
      DATA:lt_excel TYPE TABLE OF s_excel.
      DATA:ls_excel LIKE LINE OF lt_excel.
      "读取行列数
      DATA:col_count TYPE I.
      DATA:row_count TYPE I.
      DATA:col TYPE I.
      DATA:row TYPE I.
    
      "获取节点数据
      lo_node = wd_context->get_child_node( name = 'NODE_UPLOAD_DATA').
      lo_node->get_static_attributes( IMPORTING static_attributes = ls_node_upload_data ).
      lv_file = ls_node_upload_data-data.
    
      "是否选择上传文件
      IF lv_file IS INITIAL.
        "报错没有选择文件
        wd_comp_controller->show_msg( msg = '请选择上传文件' msg_type = 'E' ).
        RETURN.
      ENDIF.
    
      TRY.
          CREATE OBJECT lo_excel.
          "cl_reader对象
          CREATE OBJECT cl_reader TYPE zcl_excel_reader_2007.
          "加载文件
          lo_excel = cl_reader->load( I_EXCEL2007 = lv_file ).
          lo_worksheet = lo_excel->get_active_worksheet( ).
    
          "获取行数,列数,去掉首行
          row_count = lo_worksheet->get_highest_row( ) - 1.
          col_count = lo_worksheet->get_highest_column( ).
    
          DO row_count TIMES.
            row = sy-index + 1.
            CLEAR ls_excel.
            DO col_count TIMES.
              col = sy-index.
              CASE col.
                WHEN 1.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-carrid ).
                WHEN 2.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-connid ).
                WHEN 3.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-fldate ).
                WHEN 4.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-price ).
                WHEN 5.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-currency ).
                WHEN 6.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-planetype ).
                WHEN 7.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-seatsmax ).
                WHEN 8.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-seatsocc ).
                WHEN 9.
                  lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = ls_excel-paymentsum ).
              ENDCASE.
    
            ENDDO.
            APPEND ls_excel TO lt_excel.
          ENDDO.
    
          "是否上传数据
          IF lt_excel IS INITIAL.
             wd_comp_controller->show_msg( msg = '上传excel没有数据' msg_type = 'E' ).
             RETURN.
          ENDIF.
    
          "将数据转换指定类型
          LOOP AT lt_excel INTO ls_excel.
            MOVE-CORRESPONDING ls_excel TO ls_node_sflight.
            APPEND ls_node_sflight TO lt_node_sflight.
          ENDLOOP.
    
        CATCH ZCX_EXCEL INTO lf_cxexcel.
          "获取错误信息
          DATA:result TYPE string.
          CALL METHOD lf_cxexcel->IF_MESSAGE~GET_TEXT
            RECEIVING
              result = result.
          wd_comp_controller->show_msg( msg = result msg_type = 'E' ).
      ENDTRY.
    
      "获取节点
      lo_node = wd_context->get_child_node( name = 'NODE_SFLIGHT' ).
      "绑定数据
      lo_node->bind_table( lt_node_sflight ).
    
    endmethod.
    View Code

    实现下载Action方法

    method ONACTIONDOWNLOAD .
      DATA:lo_node TYPE REF TO if_wd_context_node.
      DATA:lt_node_sflight TYPE wd_this->Elements_node_sflight.
      DATA:ls_node_sflight LIKE LINE OF lt_node_sflight.
    
      "excel文档类对象
      DATA:lo_excel TYPE REF TO zcl_excel.
      "excel worksheet类对象
      DATA:lo_worksheet TYPE REF TO zcl_excel_worksheet.
      "异常类
      DATA:lf_cxexcel TYPE REF TO ZCX_EXCEL.
      "style类
      DATA:lo_style TYPE REF TO zcl_excel_style.
      "style的guid,header
      DATA:lv_style_guid TYPE zexcel_cell_style.
      "文本样式
      DATA:lv_style_guid_text TYPE zexcel_cell_style.
      "列选择对象
      DATA:lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime.
    
      "下载显示excel转换
      DATA:cl_writer TYPE REF TO zif_excel_writer.
      DATA:xdata TYPE xstring.
      "列数对应字母
      DATA:col_alpha TYPE zexcel_cell_column_alpha.
      DATA:lv_row TYPE I.
      DATA:lv_column TYPE I.
      FIELD-SYMBOLS:<fs_value> TYPE ANY.
    
      TYPES:BEGIN OF s_excel,
         name TYPE string,
         desc TYPE string,
        END OF s_excel.
      DATA:out_excel TYPE TABLE OF s_excel.
      DATA:wa_excel LIKE LINE OF out_excel.
      "文件名
      DATA:filename TYPE string.
    
      "设置文件名
      filename = sy-datum && '.xlsx'.
    
      "获取上下文节点数据
      lo_node = wd_context->get_child_node( name = 'NODE_SFLIGHT').
      lo_node->get_static_attributes_table( IMPORTING table = lt_node_sflight  ).
    
      "创建导出字段及描述
      wa_excel-name = 'CARRID'.
      wa_excel-desc = '航班ID'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'CONNID'.
      wa_excel-desc = 'ID'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'FLDATE'.
      wa_excel-desc = '航班日期'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'PRICE'.
      wa_excel-desc = '价格'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'CURRENCY'.
      wa_excel-desc = '币别'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'PLANETYPE'.
      wa_excel-desc = '类型'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'SEATSMAX'.
      wa_excel-desc = '座位数'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'SEATSOCC'.
      wa_excel-desc = '已占用'.
      APPEND wa_excel TO out_excel.
      wa_excel-name = 'PAYMENTSUM'.
      wa_excel-desc = '合计'.
      APPEND wa_excel TO out_excel.
      TRY.
          "创建excel对象
          CREATE OBJECT lo_excel.
          "获得当前worksheet
          lo_worksheet = lo_excel->get_active_worksheet( ).
          "创建一个新style
          lo_style = lo_excel->add_new_style( ).
          "加粗
          lo_style->font->bold = abap_true.
          "字体大小
          lo_style->font->size = 11.
          "填充类型
          lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
          "前景色
          lo_style->fill->fgcolor-rgb = 'FF66FFCC'.
          "背景色
          lo_style->fill->bgcolor-rgb = 'FF33CCFF'.
          "获取style的编码uuid
          lv_style_guid = lo_style->get_guid( ).
          "设置excel表头
          LOOP AT out_excel INTO wa_excel.
            lv_column = sy-tabix.
            "将列数转换成对应列字母
            col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_column ).
            lo_worksheet->set_cell( ip_column = col_alpha ip_row = 1 ip_style = lv_style_guid ip_value = wa_excel-desc ).
          ENDLOOP.
    
          CLEAR lv_column.
          CLEAR lv_row.
          LOOP AT lt_node_sflight INTO ls_node_sflight.
            lv_row = sy-tabix + 1.
            LOOP AT out_excel INTO wa_excel.
              lv_column = sy-tabix.
              "将列数转换成对应列字母
              col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_column ).
              ASSIGN COMPONENT wa_excel-name OF STRUCTURE ls_node_sflight TO <fs_value>.
              lo_worksheet->set_cell( ip_column = col_alpha ip_row = lv_row ip_value = <fs_value> ).
            ENDLOOP.
          ENDLOOP.
    
          "cl_writer对象
          CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007.
          xdata = cl_writer->write_file( lo_excel ).
          CALL METHOD cl_wd_runtime_services=>attach_file_to_response(
            EXPORTING
              I_FILENAME      = filename
              I_CONTENT       = xdata
              I_MIME_TYPE     = 'EXCEL'
              I_IN_NEW_WINDOW = abap_false
              I_INPLACE       = abap_false
          ).
    
        CATCH ZCX_EXCEL INTO lf_cxexcel.
          "获取错误信息
          DATA:result TYPE String.
          CALL METHOD lf_cxexcel->IF_MESSAGE~GET_TEXT
            RECEIVING
              result = result.
          wd_comp_controller->show_msg( msg = result msg_type = 'E' ).
      ENDTRY.
    endmethod.
    View Code

    4.创建Application

     

      问题1:上传日期格式时,导出的excel显示为日期格式xxxx/xx/xx,但是上传时先转换为文本格式,excel日期数据转换为文本数字,ABAP并不能识别这个数字,并且转换为对应日期。

     ABAP中日期格式转换Function:

    CONVERT_DATE_TO_INTERNAL:日期转换MM/DD/YYYY转换为YYYYMMDD;

    Excel中设置日期字段为文本格式,日期格式:MM/DD/YYYY

     代码实例:

       LOOP AT lt_excel INTO ls_excel.
            "转换日期格式为abap内部日期格式
            DATA:lv_date TYPE S_DATE.
            CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
              EXPORTING
                DATE_EXTERNAL                  = ls_excel-fldate
              IMPORTING
                DATE_INTERNAL                  = lv_date.
            MOVE-CORRESPONDING ls_excel TO ls_node_sflight.
            ls_node_sflight-fldate = lv_date.
            APPEND ls_node_sflight TO lt_node_sflight.
          ENDLOOP.
    View Code

      问题2:导出时,如果不额外设定,日期字段自动和Excel的日期格式相匹配。但是再次原文档上传时,日期格式自动转换为文本格式时,就会出现问题1。

    直接下载时,导出为日期格式

     

     ABAP中日期格式转换Function:

    CONVERT_DATE_TO_EXTERNAL:日期格式转换YYYYMMDD转换为MM/DD/YYYY。

    代码实例:

    IF wa_excel-name = 'FLDATE'.
                "日期格式处理
                DATA:lv_date TYPE S_DATE.
                DATA:lv_date_str TYPE string.
                ASSIGN COMPONENT wa_excel-name OF STRUCTURE ls_node_sflight TO <fs_value>.
                lv_date = <fs_value>.
                CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
                 EXPORTING
                    DATE_INTERNAL                  = lv_date
                 IMPORTING
                    DATE_EXTERNAL                  = lv_date_str.
                lo_worksheet->set_cell( ip_column = col_alpha ip_row = lv_row ip_value = lv_date_str ).
              ELSE.
                ASSIGN COMPONENT wa_excel-name OF STRUCTURE ls_node_sflight TO <fs_value>.
                lo_worksheet->set_cell( ip_column = col_alpha ip_row = lv_row ip_value = <fs_value> ).
    ENDIF.
    View Code

      问题3:上传错误信息显示字段,如果出现条错误信息,那么错误信息那一栏会很长,错误信息在一行中换行显示。

    1.在NODE_SFLIGHT创建Attribute:MSG,数据类型STRING_TABLE

     

     2.修改Layout,Creat Binding,将MSG加入显示。

     

    3.修改INIT_SFLIGHT方法,初始化时,设置错误信息显示效果

    method INIT_SFLIGHT .
      DATA:lo_node TYPE REF TO if_wd_context_node.
      DATA:lt_sflight TYPE wd_this->Elements_node_sflight.
      DATA:ls_sflight LIKE LINE OF lt_sflight.
      DATA:lt_msg TYPE STRING_TABLE.
      DATA:ls_msg TYPE string.
    
      "获取节点
      lo_node = wd_context->get_child_node( name = 'NODE_SFLIGHT' ).
      "查询数据
      SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_sflight FROM sflight.
      "初始化,模拟错误信息
      LOOP AT lt_sflight INTO ls_sflight.
        CLEAR lt_msg[].
        ls_msg = '模拟错误信息1;'.
        APPEND ls_msg TO lt_msg.
        ls_msg = '模拟错误信息2;'.
        APPEND ls_msg TO lt_msg.
        ls_sflight-msg = lt_msg.
        MODIFY lt_sflight FROM ls_sflight.
        EXIT.
      ENDLOOP.
    
      "绑定数据
      lo_node->bind_table( lt_sflight ).
    endmethod.
    View Code
  • 相关阅读:
    自行车平衡原理
    自行车为什么前轮和后轮受到的摩擦力相反呢 自行车前轮后轮转动方向一样 自行车运动原理
    UltraCompare文件内容比较工具
    msvcp100d.dll文件丢失,解决找不到msvcp100d.dll的问题
    mfc对话框
    bzoj 2298: [HAOI2011]problem a
    9.2python操作redis
    9.1 mysql+centos7+主从复制
    9,Linux下的python3,virtualenv,Mysql、nginx、redis安装配置
    8,Linux系统基础优化及常用命令
  • 原文地址:https://www.cnblogs.com/tangToms/p/13785905.html
Copyright © 2011-2022 走看看