5.ABAP 上打包文件为Zip

Web开发中,Webdynpro开发也好,UI5开发也好,如果让用户一个文件一个文件下载,那么用户会抱怨点击太多了,所以需要把多个文件打包在一个zip文件中,这里以业务需求方把SRM上的所有供应商报价单一同下载到Excel,并放在单个ZIP文件为例:

1. 生成单个文件,可以新生成一个文件,如Excel 或者用户上传到系统上的附件,以下载Excel为例,生成单个文件:

METHOD DOWNLOAD_EXCEL.
  DATA:
    LS_KEY        TYPE WWWDATATAB,
    LT_MIME       TYPE STANDARD TABLE OF W3MIME,
    LS_MIME       LIKE LINE OF LT_MIME,
    LV_STRING     TYPE STRING,
    LV_TEMP       TYPE STRING,
    LV_FILE_NAME  TYPE STRING,
    LV_FILE_CONT  TYPE XSTRING,
    LV_FILE_CONT2 TYPE XSTRING,
    LV_ROW_INDEX  TYPE I,
    LS_MESSAGE    LIKE LINE OF GT_MESSAGE.

  DATA:
    LR_EXCEL                   TYPE REF TO ZCL_EXCEL,
    LR_EXCEL_READER            TYPE REF TO ZCL_EXCEL_READER_2007,
    LR_EXCEL_WRITER            TYPE REF TO ZCL_EXCEL_WRITER_2007,
    LR_WORKSHEET               TYPE REF TO ZCL_EXCEL_WORKSHEET,
    LR_WORKSHEET2              TYPE REF TO ZCL_EXCEL_WORKSHEET,
    LR_STYLE_UNPROTECTION      TYPE REF TO ZCL_EXCEL_STYLE ,
    LR_STYLE_PROTECTION        TYPE REF TO ZCL_EXCEL_STYLE ,
    LR_STYLE_PROTECTION_HEADER    TYPE REF TO ZCL_EXCEL_STYLE ,
    LV_STYLE_UNPROTECTION_GUID TYPE        ZEXCEL_CELL_STYLE,
    LV_STYLE_PROTECTION_GUID   TYPE        ZEXCEL_CELL_STYLE,
    LV_STYLE_PROTECTION_GUID_H   TYPE        ZEXCEL_CELL_STYLE,

    LV_STYLE_GUID TYPE ZEXCEL_CELL_STYLE,

    LR_BORDER_DARK             TYPE REF TO ZCL_EXCEL_STYLE_BORDER.

  DATA:GC_SHEET_DATA_NAME TYPE ZEXCEL_SHEET_TITLE.

  DATA:
    LS_QUOTC_IA LIKE LINE OF GT_QUOTC_IA,
    LS_QUOTC_IB LIKE LINE OF GT_QUOTC_IB,
    LS_QUOTC_IC LIKE LINE OF GT_QUOTC_IC,
    LS_QUOTC_ID LIKE LINE OF GT_QUOTC_ID,
    LS_QUOTC_IE LIKE LINE OF GT_QUOTC_IE,
    LS_QUOTC_IF LIKE LINE OF GT_QUOTC_IF,
    LS_QUOTC_IG LIKE LINE OF GT_QUOTC_IG,
    LS_QUOTC_IH LIKE LINE OF GT_QUOTC_IH.
  DATA: LV_FORMULA TYPE STRING,
        LV_ROW TYPE STRING.


  DATA: LV_FIX_TEMPLATE TYPE XFELD.
  DATA: LV_IDX TYPE I.

  "是否固定模板
*  CLEAR LV_FIX_TEMPLATE.
*  READ TABLE GT_QUOTC_IB INTO LS_QUOTC_IB WITH KEY FIXED = 'X'.
*  IF SY-SUBRC = 0.
*    LV_FIX_TEMPLATE = 'X'.
*  ENDIF.


  "下载模板
  LS_KEY-RELID = 'MI'.

  IF GS_QUOTC_I-TEMPLATE_TYPE = 'F001'.
    LS_KEY-OBJID = 'ZTL_SP_QUOTATION1'.
    GC_SHEET_DATA_NAME = '注塑TL报价单'.
  ELSE.
    LS_KEY-OBJID = 'ZTL_SP_QUOTATION2'.
    GC_SHEET_DATA_NAME = '报价单'.
  ENDIF.

  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      KEY               = LS_KEY
    TABLES
      MIME              = LT_MIME
    EXCEPTIONS
      WRONG_OBJECT_TYPE = 1
      IMPORT_ERROR      = 2
      OTHERS            = 3.

  CLEAR LV_STRING.
  LOOP AT LT_MIME INTO LS_MIME.
    MOVE LS_MIME-LINE TO LV_TEMP.
    CONCATENATE LV_STRING LV_TEMP INTO LV_STRING.
    CLEAR LS_MIME.
  ENDLOOP.

  MOVE LV_STRING TO LV_FILE_CONT.


  "加载EXCEL
  TRY.
      CREATE OBJECT LR_EXCEL_READER.
      CALL METHOD LR_EXCEL_READER->ZIF_EXCEL_READER~LOAD(
        EXPORTING
          I_EXCEL2007 = LV_FILE_CONT
        RECEIVING
          R_EXCEL     = LR_EXCEL ).
    CATCH ZCX_EXCEL.
      CLEAR LS_MESSAGE.
      MOVE-CORRESPONDING SYST TO LS_MESSAGE.
      APPEND LS_MESSAGE TO GT_MESSAGE.
      EXIT.
  ENDTRY.

  "实例化EXCEL对象
* 获取worksheet
  LR_WORKSHEET = LR_EXCEL->GET_WORKSHEET_BY_NAME( GC_SHEET_DATA_NAME ).

* 默认整个worksheet 不能编辑
  LR_WORKSHEET->ZIF_EXCEL_SHEET_PROTECTION~PROTECTED  = ZIF_EXCEL_SHEET_PROTECTION=>C_PROTECTED.
  LR_WORKSHEET->ZIF_EXCEL_SHEET_PROTECTION~SHEET      = ZIF_EXCEL_SHEET_PROTECTION=>C_ACTIVE.
  LR_WORKSHEET->ZIF_EXCEL_SHEET_PROTECTION~OBJECTS    = ZIF_EXCEL_SHEET_PROTECTION=>C_ACTIVE.
  LR_WORKSHEET->ZIF_EXCEL_SHEET_PROTECTION~SCENARIOS  = ZIF_EXCEL_SHEET_PROTECTION=>C_ACTIVE.


* 生成指定可编辑单元格样式
  CREATE OBJECT LR_BORDER_DARK.
  LR_BORDER_DARK->BORDER_COLOR-RGB = ZCL_EXCEL_STYLE_COLOR=>C_BLACK.
  LR_BORDER_DARK->BORDER_STYLE     = ZCL_EXCEL_STYLE_BORDER=>C_BORDER_THIN.

  LR_STYLE_UNPROTECTION  = LR_EXCEL->ADD_NEW_STYLE( ).
  LR_STYLE_UNPROTECTION->PROTECTION->LOCKED  = ZCL_EXCEL_STYLE_PROTECTION=>C_PROTECTION_UNLOCKED.
  LR_STYLE_UNPROTECTION->BORDERS->ALLBORDERS = LR_BORDER_DARK.
  LV_STYLE_UNPROTECTION_GUID = LR_STYLE_UNPROTECTION->GET_GUID( ).

  LR_STYLE_PROTECTION_HEADER = LR_EXCEL->ADD_NEW_STYLE( ).
  LR_STYLE_PROTECTION_HEADER->BORDERS->ALLBORDERS   = LR_BORDER_DARK.
  LR_STYLE_PROTECTION_HEADER->FILL->FILLTYPE = ZCL_EXCEL_STYLE_FILL=>C_FILL_SOLID .
  LR_STYLE_PROTECTION_HEADER->FILL->FGCOLOR-RGB  = 'FFCCFF80'.
  LV_STYLE_PROTECTION_GUID_H = LR_STYLE_PROTECTION_HEADER->GET_GUID( ).

  LR_STYLE_PROTECTION = LR_EXCEL->ADD_NEW_STYLE( ).
  LR_STYLE_PROTECTION->BORDERS->ALLBORDERS   = LR_BORDER_DARK.
  LR_STYLE_PROTECTION->FILL->FILLTYPE = ZCL_EXCEL_STYLE_FILL=>C_FILL_SOLID .
  LR_STYLE_PROTECTION->FILL->FGCOLOR-RGB  = 'FFCCCCCC'."'FF99CCCC'."'FF6666CC'.
  LV_STYLE_PROTECTION_GUID = LR_STYLE_PROTECTION->GET_GUID( ).

  "填充EXCEL

  "项目名称--不可编辑
  LR_WORKSHEET->SET_CELL( IP_ROW = 1 IP_COLUMN = 'Q' IP_VALUE = GS_QUOTC_I-PROJDESC IP_STYLE = LV_STYLE_PROTECTION_GUID_H ).

  "联系人--可编辑
  LR_WORKSHEET->SET_CELL( IP_ROW = 2 IP_COLUMN = 'Q' IP_VALUE = GS_QUOTC_I-CONTACT IP_STYLE = LV_STYLE_UNPROTECTION_GUID ).

  "电话--可编辑
  LR_WORKSHEET->SET_CELL( IP_ROW = 3 IP_COLUMN = 'Q' IP_VALUE = GS_QUOTC_I-TEL IP_STYLE = LV_STYLE_UNPROTECTION_GUID ).

  "模具名称--不可编辑
  LR_WORKSHEET->SET_CELL( IP_ROW = 5 IP_COLUMN = 'A' IP_VALUE = GS_QUOTC_I-TL_NAME IP_STYLE = LV_STYLE_PROTECTION_GUID_H ).

  "下载
  CLEAR LV_FILE_CONT.
  CREATE OBJECT LR_EXCEL_WRITER.
  LV_FILE_CONT = LR_EXCEL_WRITER->ZIF_EXCEL_WRITER~WRITE_FILE( IO_EXCEL = LR_EXCEL ).

  CONCATENATE '模具报价单' SY-DATUM SY-UZEIT  '.xlsx' INTO LV_FILE_NAME SEPARATED BY ' '.


  CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
    EXPORTING
      INPUT  = LV_FILE_CONT
    IMPORTING
      OUTPUT = GS_FILE_DOWNLOAD-FILE_CONTENT_BASE64.

  GS_FILE_DOWNLOAD-FILENAME = LV_FILE_NAME .
  GS_FILE_DOWNLOAD-MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' .

  GV_FILE_CONTENT = LV_FILE_CONT.
ENDMETHOD.

2. 前端页面上放一个按钮,点击后,生成ZIP文件

METHOD DOWNLOAD_ZIP.

  DATA:BEGIN OF LS_ZIP,
        DOCMTYPE TYPE CHAR1,
        NAME     TYPE STRING,
        CONTENT  TYPE XSTRING,
        PATH     TYPE STRING,
        LEVEL    TYPE I,
      END OF LS_ZIP.

  DATA:LO_ZIP        TYPE REF TO CL_ABAP_ZIP,
       LV_TABIX      TYPE NUMC2,
       LV_FOLDER     TYPE STRING,
       LV_XZIP_FILE  TYPE XSTRING,
       LV_ZIP_ROOT   TYPE STRING,
       LV_WORK_FILENAME  TYPE STRING,
       LV_FILE_EXTENSION TYPE STRING,
       LT_BTAB       TYPE STANDARD TABLE OF X255,
       "LS_ATTACH     LIKE LINE OF IT_ATTACH,
       LV_ZIP_MIME   TYPE STRING VALUE 'application/x-zip-compressed'."效率更高但是经过压缩


**创建压缩对象
  CREATE OBJECT LO_ZIP.
  LO_ZIP->SUPPORT_UNICODE_NAMES = ABAP_TRUE."不加的话中文会乱码


  CLEAR LS_ZIP.
  LS_ZIP-DOCMTYPE = '5'."单个文件


  "循环所有的报价单
  LOOP AT LT_QUOTC_I INTO LS_QUOTC_I.
    CREATE OBJECT LR_QUOTC_DETAIL.

    LR_QUOTC_DETAIL->GS_PARA-QUOT_GUID_H = ''.
    LR_QUOTC_DETAIL->GS_PARA-QUOT_DOCID = LS_QUOTC_I-QUOT_DOCID.

    LR_QUOTC_DETAIL->DOWNLOAD_EXCEL( ).

    "文件名
    LS_ZIP-NAME = LR_QUOTC_DETAIL->GS_FILE_DOWNLOAD-FILENAME.

    "供应商编码 + 模具名称 + 文件名
    CONCATENATE LS_QUOTC_I-LIFNR LS_QUOTC_I-TL_NAME LS_ZIP-NAME  INTO LS_ZIP-NAME SEPARATED BY ' '.
    SHIFT LS_ZIP-NAME LEFT DELETING LEADING '0'.

    LS_ZIP-PATH = LS_ZIP-NAME.

    LS_ZIP-CONTENT = LR_QUOTC_DETAIL->GV_FILE_CONTENT.

    CALL METHOD LO_ZIP->ADD
      EXPORTING
        NAME    = LS_ZIP-PATH
        CONTENT = LS_ZIP-CONTENT.

    FREE LR_QUOTC_DETAIL.
  ENDLOOP.


  CALL METHOD LO_ZIP->SAVE
    RECEIVING
      ZIP = LV_XZIP_FILE.

  CLEAR GS_FILE_DOWNLOAD-FILE_CONTENT_BASE64.
  CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
    EXPORTING
      INPUT  = LV_XZIP_FILE
    IMPORTING
      OUTPUT = GS_FILE_DOWNLOAD-FILE_CONTENT_BASE64.

* 下载Zip
  CONCATENATE sy-datum '_' sy-uzeit '.zip' into GS_FILE_DOWNLOAD-FILENAME.
  CONDENSE GS_FILE_DOWNLOAD-FILENAME NO-GAPS.

  GS_FILE_DOWNLOAD-MIMETYPE = 'application/x-zip-compressed' .


  "下载成功
  ADD_T100_MESSAGE( EXPORTING IV_MSG_TYPE = 'S'
                              IV_MSG_ID = 'ZNEPQUOT'
                              IV_MSG_NO = '061' ).


ENDMETHOD.

3. 备注信息

a) Excel模板需要先通过SMW0导入到系统,然后WWWDATA_IMPORT 函数才能读取到

b) Excel的操作,网上有很多Excel 类可以下载,如果需要请留言

c) 过程中有写详细读取报价信息的细节忽略

d) 参照的其他技术人员文档由于时间太久,不贴出来了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值