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) 参照的其他技术人员文档由于时间太久,不贴出来了