该函数与前面的函数不同,为升级版,可以生成文件的同时,自动按照ID区分生成多个sheet,并且每个sheet可以按照KEY_FIELD生成多个不同的表格,内表参数结构在后面的贴图中。
一、函数:
FUNCTION ZF_EXP_EXCEL_FILE_MULTI.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(SPECIFY_FORMAT) TYPE CHAR1 OPTIONAL
*" REFERENCE(SAVE_AS) TYPE CHAR1 OPTIONAL
*" REFERENCE(QUICK_FORMAT) TYPE CHAR1 OPTIONAL
*" REFERENCE(ROW_PITCH) TYPE ANZ_BLK DEFAULT 2
*" REFERENCE(MODEL) TYPE CHAR1 OPTIONAL
*" REFERENCE(FILENAME) TYPE C OPTIONAL
*" TABLES
*" IT_TITLE STRUCTURE ZST_EXP_EXCEL_TITLE OPTIONAL
*" IT_HEAD STRUCTURE ZST_EXP_EXCEL_HEAD OPTIONAL
*" IT_COND STRUCTURE ZST_EXP_EXCEL_FILE_COND OPTIONAL
*" IT_TAB_FIELD STRUCTURE ZST_EXP_EXCEL_TAB_FD_TITLE OPTIONAL
*" IT_FOOTER STRUCTURE ZST_EXP_EXCEL_FILE_COND OPTIONAL
*" IT_DATA1
*" IT_DATA2 OPTIONAL
*" IT_DATA3 OPTIONAL
*"----------------------------------------------------------------------
DATA:F_SELECTLIST LIKE SPOPLI OCCURS 5 WITH HEADER LINE.
DATA:F_ANTWORT TYPE C.
DATA:F_SELECT_MOD.
DATA:F_CLEAR.
DATA:F_ROWCNT TYPE P DECIMALS 0.
CLEAR F_SELECT_MOD.
IF IT_TAB_FIELD[] IS NOT INITIAL.
F_SELECT_MOD = 'X'.
ENDIF.
DATA: F_TABNAME(30),
F_ID LIKE IT_HEAD-ID.
DATA:IT_FUPARAREF LIKE FUPARAREF OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS <FRM_TABLE> TYPE STANDARD TABLE.
"清空内表
PERFORM FRM_REFRESH.
"取函数的IT_DATA参数
SELECT PARAMETER PPOSITION FROM FUPARAREF
INTO CORRESPONDING FIELDS OF TABLE IT_FUPARAREF
WHERE FUNCNAME = 'ZF_EXP_EXCEL_FILE_MULTI' AND
R3STATE = 'A' AND
PARAMETER LIKE 'IT_DATA%' AND
PARAMTYPE = 'T'.
SORT IT_FUPARAREF BY PPOSITION.
IF IT_HEAD[] IS INITIAL.
CLEAR IT_HEAD.
READ TABLE IT_TITLE INDEX 1.
MOVE-CORRESPONDING IT_TITLE TO IT_HEAD.
APPEND IT_HEAD.
ENDIF.
IF MODEL IS NOT INITIAL.
IF IT_DATA1[] IS INITIAL.
F_CLEAR = 'X'.
CLEAR IT_DATA1. APPEND IT_DATA1.
ENDIF.
ENDIF.
SORT IT_HEAD BY ID.
LOOP AT IT_FUPARAREF.
F_ID = SY-TABIX.
READ TABLE IT_HEAD WITH KEY ID = F_ID.
IF SY-SUBRC NE 0.
READ TABLE IT_HEAD WITH KEY ID = ''.
IF SY-SUBRC NE 0 .
READ TABLE IT_HEAD WITH KEY ID = '0000'.
IF SY-SUBRC NE 0.
READ TABLE IT_HEAD INDEX 1.
IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
CONCATENATE IT_FUPARAREF-PARAMETER '[]' INTO F_TABNAME.
CONDENSE F_TABNAME NO-GAPS.
ASSIGN (F_TABNAME) TO <FRM_TABLE>.
IF MODEL IS NOT INITIAL.
IF F_TABNAME NE 'IT_DATA1[]'.
CONTINUE.
ENDIF.
ENDIF.
PERFORM FRM_SET_DATA TABLES IT_HEAD <FRM_TABLE> USING MODEL.
ENDLOOP.
"检查数据记录数
PERFORM FRM_GET_EXCEL_DATA_ROWCNTS CHANGING F_ROWCNT.
IF F_ROWCNT = 0.
RETURN.
ENDIF.
PERFORM FRM_SET_SPECIFY_SAVE_AS USING SAVE_AS. "是否预览标志
PERFORM FRM_SET_ROW_PITCH USING ROW_PITCH. "报表间的空白行数
PERFORM FRM_SET_EXCEL_FILE_TITLE TABLES IT_TITLE. "
PERFORM FRM_SET_SAVE_FILENAME USING FILENAME. "保存的文件
IF SPECIFY_FORMAT IS NOT INITIAL. "指定格式导出
PERFORM FRM_DC_EXCEL TABLES IT_COND IT_TAB_FIELD IT_FOOTER.
IF F_CLEAR IS NOT INITIAL.
CLEAR IT_DATA1[].
ENDIF.
RETURN.
ENDIF.
IF QUICK_FORMAT IS NOT INITIAL OR F_SELECT_MOD IS INITIAL. "快速格式导出
PERFORM FRM_KSDC_EXCEL TABLES IT_COND IT_TAB_FIELD IT_FOOTER.
IF F_CLEAR IS NOT INITIAL.
CLEAR IT_DATA1[].
ENDIF.
RETURN.
ENDIF.
CLEAR:F_SELECTLIST[],F_SELECTLIST.
F_SELECTLIST-VAROPTION = '按指定格式导出'.
F_SELECTLIST-SELFLAG = 'X'. APPEND F_SELECTLIST.
CLEAR F_SELECTLIST.
F_SELECTLIST-VAROPTION = '快速导出'. APPEND F_SELECTLIST.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
MARK_MAX = 1
START_COL = 15
START_ROW = 3
TEXTLINE1 = '文件的格式:'
TITEL = '选择导出'
IMPORTING
ANSWER = F_ANTWORT
TABLES
T_SPOPLI = F_SELECTLIST
EXCEPTIONS
NOT_ENOUGH_ANSWERS = 1
TOO_MUCH_ANSWERS = 2
TOO_MUCH_MARKS = 3
OTHERS = 4.
CASE F_ANTWORT.
WHEN '1'.
PERFORM FRM_DC_EXCEL TABLES IT_COND IT_TAB_FIELD IT_FOOTER.
WHEN '2'.
PERFORM FRM_KSDC_EXCEL TABLES IT_COND IT_TAB_FIELD IT_FOOTER.
ENDCASE.
IF F_CLEAR IS NOT INITIAL.
CLEAR IT_DATA1[].
ENDIF.
ENDFUNCTION.
二、函数TOP:
TYPE-POOLS: OLE2."EXCEL输出中所需要的一些预定义
DATA: L_EXCEL TYPE OLE2_OBJECT, " Excel object
L_WINDOW TYPE OLE2_OBJECT, " list of workbooks
L_BOOKS TYPE OLE2_OBJECT, " list of workbooks
L_BOOK TYPE OLE2_OBJECT, " workbook
L_CELL TYPE OLE2_OBJECT, " cell object
L_FONT TYPE OLE2_OBJECT, " font object
L_COLUMN TYPE OLE2_OBJECT, " COLUMN OBJECT
L_ROW TYPE OLE2_OBJECT, " COLUMN OBJECT
L_RANGE TYPE OLE2_OBJECT, " RANGE OBJECT
L_BORDER TYPE OLE2_OBJECT, " BORDER OBJECT
L_SHEET TYPE OLE2_OBJECT. " cell object
TYPE-POOLS ABAP.
DATA:BEGIN OF IT_EXCLE_TABLE_FIELD OCCURS 0,
LENGTH TYPE I,
DECIMALS TYPE I,
TYPE_KIND TYPE ABAP_TYPEKIND,
NAME TYPE ABAP_COMPNAME,
END OF IT_EXCLE_TABLE_FIELD.
* EXCEL 输出准备
DATA: EXCEL_TITLE1(6) VALUE 'TITLE1',
EXCEL_TITLE2(6) VALUE 'TITLE2',
EXCEL_COND(4) VALUE 'COND',
EXCEL_CONDBD(4) VALUE 'CDBD',
EXCEL_TBTIL(6) VALUE 'TBTIL',
EXCEL_TDATA(6) VALUE 'TDATA',
EXCEL_FOOTBD(4) VALUE 'FTBD',
EXCEL_FOOT(4) VALUE 'FOOT'.
DATA: BEGIN OF IT_EXCEL_TITLE OCCURS 0, "文件抬头
ID LIKE ZST_EXP_EXCEL_HEAD-ID,
TYP,"类型 M-主标题,否则为子标题
MS(200),
END OF IT_EXCEL_TITLE.
DATA: EXCEL_TITLE1_SIZE TYPE I VALUE 18,
EXCEL_TITLE1_ROWHIGH TYPE I VALUE 30,
EXCEL_TITLE2_SIZE TYPE I VALUE 15,
EXCEL_TITLE2_ROWHIGH TYPE I VALUE 20..
DATA: DYN_DATA1 TYPE REF TO DATA,
DYN_DATA2 TYPE REF TO DATA,
DYN_DATA3 TYPE REF TO DATA.
DATA: SAVE_AS, "指定格式的另存文件标志
SAVE_FILENAME TYPE STRING. "指定格式导出时,不预览,保存将要导出的文件名
DATA: FONT_NAME(20) VALUE '宋体',
FONT_SIZE TYPE I VALUE 10.
DATA: FORM_ROW_PITCH TYPE I VALUE 2. "FORM的行距
DATA: EXCEL_TB_CELL_TITLE_FONT_BOLD TYPE I VALUE 1.
DATA: EXCEL_ITAB_DATA_MAX_CNT TYPE P DECIMALS 0,
EXCEL_DATA_ROWCNTS TYPE P DECIMALS 0, "所有的数据记录数总数
EXCEL_OTHER_ROWCNTS TYPE I. "标题,条件,表头描述,表脚的记录数
DATA: EXCEL_CUR_SHEETID TYPE I VALUE 1,
EXCEL_SHEET_MAX_ROW TYPE I VALUE 64000. "允许每个SHEET的最多记录数
DATA: BEGIN OF IT_KEY_FD OCCURS 0,
ID(20),
FIELD(20),
END OF IT_KEY_FD,
ITAB_DATA_FJ_FDNAME(20) VALUE 'ITAB_DATA_BIANHAO'. "数据内表附加字段名
DATA:IT_EXCEL_FILE_TITLE LIKE ZST_EXP_EXCEL_TITLE OCCURS 0 WITH HEADER LINE,
IT_EXCEL_TAB_DATA_TITLE LIKE ZST_EXP_EXCEL_TAB_FD_TITLE OCCURS 0 WITH HEADER LINE,
IT_EXCEL_QUERY_COND LIKE ZST_EXP_EXCEL_FILE_COND OCCURS 0 WITH HEADER LINE,
BEGIN OF IT_EXCEL_ROWS OCCURS 0,
ID TYPE I,
KEY_FDVALUE LIKE ZST_EXP_EXCEL_TAB_FD_TITLE-KEY_FDVALUE,
ROWTYP LIKE EXCEL_TITLE1, "取值:TITLE,COND,TBTIL,TDATA,FOOT
BG_ROWID TYPE I,
ED_ROWID TYPE I,
END OF IT_EXCEL_ROWS,
IT_EXCEL_FOOTER LIKE ZST_EXP_EXCEL_FILE_COND OCCURS 0 WITH HEADER LINE,
BEGIN OF IT_TB_CELL_HALIGNMENT OCCURS 0,
NAME(20),
ALIGHT TYPE I,
END OF IT_TB_CELL_HALIGNMENT,
BEGIN OF IT_MERGECELLS OCCURS 0,
BG_ROWID TYPE I,
ED_ROWID TYPE I,
BG_COLNAME(5),
ED_COLNAME(5),
END OF IT_MERGECELLS.
DATA:BEGIN OF IT_EXP_SHEETNAME OCCURS 0,
ID(4),
MS(200),
END OF IT_EXP_SHEETNAME.
DATA:BEGIN OF IT_EXCEL_DATA OCCURS 0.
INCLUDE STRUCTURE ZST_EXP_EXCEL_HEAD.
DATA: DYN_ITAB TYPE REF TO DATA,
DYN_ITAB_HJ TYPE REF TO DATA,
END OF IT_EXCEL_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_GET_EXCEL_DATA_ROWCNTS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ROWCNT text
*----------------------------------------------------------------------*
FORM FRM_GET_EXCEL_DATA_ROWCNTS CHANGING P_ROWCNT.
P_ROWCNT = EXCEL_DATA_ROWCNTS.
ENDFORM. "FRM_GET_EXCEL_DATA_ROWCNTS
*&---------------------------------------------------------------------*
*& Form frm_set_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_HEAD text
* -->P_ITABNAME text
*----------------------------------------------------------------------*
FORM FRM_SET_DATA TABLES P_IT_HEAD STRUCTURE ZST_EXP_EXCEL_HEAD P_IT_DATA USING P_MODEL.
DATA: FRM_IT_EXCEL_DATA_ROWCNT TYPE I.
CLEAR:IT_EXCEL_DATA.
MOVE-CORRESPONDING P_IT_HEAD TO IT_EXCEL_DATA.
PERFORM FRM_SET_IT_DATA_KEY_FIELD USING P_IT_HEAD-ID P_IT_HEAD-KEY_FIELD. "内表参数关键字段
IF IT_EXCEL_DATA-ID IS INITIAL.
IT_EXCEL_DATA-ID = LINES( IT_EXCEL_DATA ) + 1.
ENDIF.
IF P_MODEL IS INITIAL.
IF P_IT_DATA[] IS INITIAL.
RETURN.
ENDIF.
ENDIF.
PERFORM FRM_MOVE_DATA TABLES P_IT_DATA
USING P_IT_HEAD-ID P_IT_HEAD-AUTO_TOTAL P_MODEL
CHANGING IT_EXCEL_DATA-DYN_ITAB IT_EXCEL_DATA-DYN_ITAB_HJ .
APPEND IT_EXCEL_DATA.
PERFORM FRM_SET_TITLE USING IT_EXCEL_DATA.
ENDFORM. "frm_set_data
*&---------------------------------------------------------------------*
*& Form FRM_SET_TITLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_HEAD text
*----------------------------------------------------------------------*
FORM FRM_SET_TITLE USING P_WA_HEAD STRUCTURE ZST_EXP_EXCEL_HEAD.
FIELD-SYMBOLS:<FRM_WA>,<FRM_FD>,<FRM_VALUE>.
IF P_WA_HEAD IS INITIAL.
RETURN.
ENDIF.
DATA:FRM_ITAB_COMPONET TYPE REF TO CL_ABAP_STRUCTDESCR.
FRM_ITAB_COMPONET ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( P_WA_HEAD ).
CLEAR: IT_EXCEL_TITLE.
IT_EXCEL_TITLE-ID = P_WA_HEAD-ID.
LOOP AT FRM_ITAB_COMPONET->COMPONENTS ASSIGNING <FRM_WA> WHERE NAME(5) = 'TITLE'.
ASSIGN COMPONENT 'NAME' OF STRUCTURE <FRM_WA> TO <FRM_FD>.
ASSIGN COMPONENT <FRM_FD> OF STRUCTURE P_WA_HEAD TO <FRM_VALUE>.
IF <FRM_FD>+5 = '1'.
IT_EXCEL_TITLE-TYP = 'M'.
ELSE.
CLEAR IT_EXCEL_TITLE-TYP.
ENDIF.
IF <FRM_VALUE> IS NOT INITIAL.
IT_EXCEL_TITLE-MS = <FRM_VALUE>.
APPEND IT_EXCEL_TITLE.
ENDIF.
ENDLOOP.
ENDFORM. " FRM_SET_TITLE
*&---------------------------------------------------------------------*
*& Form FRM_SET_SPECIFY_SAVE_AS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_SAVE_AS text
*----------------------------------------------------------------------*
FORM FRM_SET_SPECIFY_SAVE_AS USING P_SAVE_AS.
SAVE_AS = P_SAVE_AS.
ENDFORM. " FRM_SET_SPECIFY_SAVE_AS
*&---------------------------------------------------------------------*
*& Form frm_set_ROW_PITCH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ROW_PITCH text
*----------------------------------------------------------------------*
FORM FRM_SET_ROW_PITCH USING P_ROW_PITCH.
FORM_ROW_PITCH = P_ROW_PITCH.
ENDFORM. "frm_set_ROW_PITCH
*&---------------------------------------------------------------------*
*& Form frm_set_file_title
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_TITLE text
*----------------------------------------------------------------------*
FORM FRM_SET_EXCEL_FILE_TITLE TABLES P_IT_TITLE.
IT_EXCEL_FILE_TITLE[] = P_IT_TITLE[].
ENDFORM. "frm_set_file_title
*&---------------------------------------------------------------------*
*& Form FRM_SET_SAVE_FILENAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FILENAME text
*----------------------------------------------------------------------*
FORM FRM_SET_SAVE_FILENAME USING P_FILENAME.
SAVE_FILENAME = P_FILENAME.
ENDFORM. "FRM_SET_SAVE_FILENAME
*&---------------------------------------------------------------------*
*& Form FRM_SET_IT_DATA_KEY_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ID text
* -->P_KEY_FIELD text
*----------------------------------------------------------------------*
FORM FRM_SET_IT_DATA_KEY_FIELD USING P_ID P_KEY_FIELD.
IF P_KEY_FIELD IS INITIAL.
RETURN.
ENDIF.
IT_KEY_FD-ID = P_ID.
IT_KEY_FD-FIELD = P_KEY_FIELD.
COLLECT IT_KEY_FD.
ENDFORM. "frm_set_IT_DATA_KEY_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_DC_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_COND text
* -->P_IT_ITEM text
* -->P_IT_FOOTER text
*----------------------------------------------------------------------*
FORM FRM_DC_EXCEL TABLES P_IT_COND STRUCTURE ZST_EXP_EXCEL_FILE_COND
P_IT_ITEM STRUCTURE ZST_EXP_EXCEL_TAB_FD_TITLE
P_IT_FOOTER STRUCTURE ZST_EXP_EXCEL_FILE_COND.
DATA:FRM_ERRCODE.
"数据处理
IF P_IT_ITEM[] IS INITIAL.
MESSAGE S001(00) WITH '尚未为导出EXCEL函数指定参数:IT_TAB_FIELD'.
RETURN.
ENDIF.
PERFORM FRM_MOD_DATA_SET TABLES P_IT_COND P_IT_ITEM P_IT_FOOTER.
"打开EXCEL
PERFORM FRM_EXCLE_INIT USING FRM_ERRCODE.
IF FRM_ERRCODE IS NOT INITIAL.
RETURN.
ENDIF.
"导出数据
DATA:FRM_TITLEID TYPE I.
CLEAR EXCEL_CUR_SHEETID.
LOOP AT IT_EXCEL_DATA.
FRM_TITLEID = IT_EXCEL_DATA-ID.
ADD 1 TO EXCEL_CUR_SHEETID.
PERFORM FRM_EXP_DC_DATA USING EXCEL_CUR_SHEETID FRM_TITLEID IT_EXCEL_DATA-DYN_ITAB IT_EXCEL_DATA-DYN_ITAB_HJ.
ENDLOOP.
PERFORM FRM_DEL_NULL_SHEETS. "删除空白的SHEET
PERFORM FRM_EXCEL_SAVE. "保存至文件
PERFORM FRM_EXCEL_FREE. "释放资源
ENDFORM. " FRM_DC_EXCEL
*&---------------------------------------------------------------------*
*& Form frm_mod_data_set
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_COND text
* -->P_IT_ITEM text
* -->P_IT_FOOTER text
*----------------------------------------------------------------------*
FORM FRM_MOD_DATA_SET TABLES P_IT_COND STRUCTURE ZST_EXP_EXCEL_FILE_COND
P_IT_ITEM STRUCTURE ZST_EXP_EXCEL_TAB_FD_TITLE
P_IT_FOOTER STRUCTURE ZST_EXP_EXCEL_FILE_COND.
IT_EXCEL_QUERY_COND[] = P_IT_COND[].
IT_EXCEL_TAB_DATA_TITLE[] = P_IT_ITEM[].
IT_EXCEL_FOOTER[] = P_IT_FOOTER[].
CLEAR EXCEL_OTHER_ROWCNTS.
"表头
EXCEL_OTHER_ROWCNTS = LINES( IT_EXCEL_TITLE ).
"查询条件
PERFORM FRM_QUERY_COND_OR_FOOTER_SET TABLES IT_EXCEL_QUERY_COND.
"列表抬头数据
PERFORM FRM_TABLE_FIELD_TEXT_SET TABLES IT_EXCEL_TAB_DATA_TITLE.
"表脚下数据
PERFORM FRM_QUERY_COND_OR_FOOTER_SET TABLES IT_EXCEL_FOOTER.
ENDFORM. "frm_mod_data_set
*&---------------------------------------------------------------------*
*& Form FRM_QUERY_COND_OR_FOOTER_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_DATA text
*----------------------------------------------------------------------*
FORM FRM_QUERY_COND_OR_FOOTER_SET TABLES P_IT_DATA STRUCTURE ZST_EXP_EXCEL_FILE_COND.
DATA:FRM_MAX_ROWID TYPE I.
CLEAR FRM_MAX_ROWID.
LOOP AT P_IT_DATA.
IF P_IT_DATA-BG_COLNAME IS INITIAL OR P_IT_DATA-ED_COLNAME IS INITIAL.
IF P_IT_DATA-BG_COLNAME IS INITIAL AND P_IT_DATA-ED_COLNAME IS INITIAL.
DELETE P_IT_DATA.
CONTINUE.
ENDIF.
IF P_IT_DATA-BG_COLNAME IS INITIAL.
P_IT_DATA-BG_COLNAME = P_IT_DATA-ED_COLNAME.
ENDIF.
IF P_IT_DATA-ED_COLNAME IS INITIAL.
P_IT_DATA-ED_COLNAME = P_IT_DATA-BG_COLNAME.
ENDIF.
MODIFY P_IT_DATA.
ENDIF.
IF FRM_MAX_ROWID < P_IT_DATA-ROWID.
FRM_MAX_ROWID = P_IT_DATA-ROWID.
ENDIF.
ENDLOOP.
EXCEL_OTHER_ROWCNTS = EXCEL_OTHER_ROWCNTS + FRM_MAX_ROWID.
ENDFORM. "FRM_QUERY_COND_OR_FOOTER_SET
*&---------------------------------------------------------------------*
*& Form frm_table_field_text_set
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_FIELD_TITLE text
*----------------------------------------------------------------------*
FORM FRM_TABLE_FIELD_TEXT_SET TABLES P_IT_FIELD_TITLE STRUCTURE IT_EXCEL_TAB_DATA_TITLE.
DATA:FRM_IT_EXCEL_TAB_DATA_TITLE LIKE IT_EXCEL_TAB_DATA_TITLE OCCURS 0 WITH HEADER LINE,
FRM_WA_TITLE LIKE LINE OF FRM_IT_EXCEL_TAB_DATA_TITLE.
DATA:FRM_BG_ROW TYPE I,FRM_ED_ROW TYPE I,FRM_CNT TYPE STRING.
DATA:FRM_BG_COLNAME(10),FRM_ED_COLNAME(10).
DATA:FRM_ROWID TYPE I.
DATA:FRM_MAX_ROWID TYPE I.
DATA:FRM_ID_TMP(50).
DATA:FRM_KEY_FDVALUE LIKE IT_EXCEL_TAB_DATA_TITLE-KEY_FDVALUE.
CLEAR FRM_ROWID.
CLEAR FRM_MAX_ROWID.
LOOP AT P_IT_FIELD_TITLE.
MOVE-CORRESPONDING P_IT_FIELD_TITLE TO FRM_WA_TITLE.
AT NEW ID.
CLEAR FRM_ROWID.
ENDAT.
IF FRM_KEY_FDVALUE <> FRM_WA_TITLE-KEY_FDVALUE.
CLEAR FRM_ROWID.
FRM_KEY_FDVALUE = FRM_WA_TITLE-KEY_FDVALUE.
ENDIF.
"行号
IF P_IT_FIELD_TITLE-BG_ROW IS INITIAL AND P_IT_FIELD_TITLE-ED_ROW IS INITIAL.
FRM_BG_ROW = 1.
FRM_ED_ROW = 1.
ELSEIF P_IT_FIELD_TITLE-BG_ROW IS NOT INITIAL AND P_IT_FIELD_TITLE-ED_ROW IS INITIAL.
FRM_BG_ROW = P_IT_FIELD_TITLE-BG_ROW.
FRM_ED_ROW = P_IT_FIELD_TITLE-BG_ROW.
ELSEIF P_IT_FIELD_TITLE-BG_ROW IS INITIAL AND P_IT_FIELD_TITLE-ED_ROW IS NOT INITIAL.
FRM_BG_ROW = P_IT_FIELD_TITLE-ED_ROW.
FRM_ED_ROW = P_IT_FIELD_TITLE-ED_ROW.
ELSE.
FRM_BG_ROW = P_IT_FIELD_TITLE-BG_ROW.
FRM_ED_ROW = P_IT_FIELD_TITLE-ED_ROW.
ENDIF.
P_IT_FIELD_TITLE-BG_ROW = FRM_BG_ROW.
P_IT_FIELD_TITLE-ED_ROW = FRM_ED_ROW.
"列名
IF FRM_BG_COLNAME <> FRM_ED_COLNAME AND FRM_BG_ROW = 1 AND FRM_ED_ROW = 1. "同在第一行且起始列名与截止列名不一致,要合并多列
CLEAR P_IT_FIELD_TITLE-NAME. "对应的列字段名称
ENDIF.
IF P_IT_FIELD_TITLE-BG_COLNAME IS INITIAL AND P_IT_FIELD_TITLE-BG_COLNAME IS INITIAL.
ADD 1 TO FRM_ROWID.
FRM_CNT = FRM_ROWID.
CONDENSE FRM_CNT NO-GAPS.
PERFORM FRM_GET_EXCEL_END_WORD CHANGING FRM_CNT.
FRM_BG_COLNAME = FRM_CNT.
FRM_ED_COLNAME = FRM_CNT.
ELSEIF P_IT_FIELD_TITLE-BG_COLNAME IS NOT INITIAL AND P_IT_FIELD_TITLE-ED_COLNAME IS INITIAL.
FRM_BG_COLNAME = P_IT_FIELD_TITLE-BG_COLNAME.
FRM_ED_COLNAME = P_IT_FIELD_TITLE-BG_COLNAME.
ELSEIF P_IT_FIELD_TITLE-BG_COLNAME IS INITIAL AND P_IT_FIELD_TITLE-ED_COLNAME IS NOT INITIAL.
FRM_BG_COLNAME = P_IT_FIELD_TITLE-ED_COLNAME.
FRM_ED_COLNAME = P_IT_FIELD_TITLE-ED_COLNAME.
ELSE.
FRM_BG_COLNAME = P_IT_FIELD_TITLE-BG_COLNAME.
FRM_ED_COLNAME = P_IT_FIELD_TITLE-ED_COLNAME.
ENDIF.
P_IT_FIELD_TITLE-BG_COLNAME = FRM_BG_COLNAME.
P_IT_FIELD_TITLE-ED_COLNAME = FRM_ED_COLNAME.
MODIFY P_IT_FIELD_TITLE.
IF FRM_MAX_ROWID < FRM_ED_ROW.
FRM_MAX_ROWID = FRM_ED_ROW.
ENDIF.
ENDLOOP.
EXCEL_OTHER_ROWCNTS = EXCEL_OTHER_ROWCNTS + FRM_MAX_ROWID.
ENDFORM. "frm_table_field_text_set
*&---------------------------------------------------------------------*
*& Form FRM_EXCLE_INIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_SHEETNAME text
*----------------------------------------------------------------------*
FORM FRM_EXCLE_INIT CHANGING P_ERRCODE.
DATA:FRM_VISIBLE VALUE '1',
FRM_SHEED_CNT TYPE P DECIMALS 4.
CREATE OBJECT L_EXCEL 'EXCEL.APPLICATION'.
IF SY-SUBRC NE 0.
CREATE OBJECT L_EXCEL 'ET.APPLICATION'.
ENDIF.
PERFORM FRM_ERR_HDL.
PERFORM FRM_MSG USING ''.
CALL METHOD OF L_EXCEL 'Workbooks' = L_BOOKS NO FLUSH.
" 创建一个sheet
CALL METHOD OF L_BOOKS 'Add' = L_BOOK NO FLUSH.
PERFORM FRM_ERR_HDL.
CALL METHOD OF L_EXCEL 'ActiveWindow' = L_WINDOW NO FLUSH.
PERFORM FRM_ERR_HDL.
GET PROPERTY OF L_BOOK 'ActiveSheet' = L_SHEET NO FLUSH.
PERFORM FRM_ERR_HDL.
"根据数据设置
FRM_SHEED_CNT = EXCEL_DATA_ROWCNTS * ( EXCEL_ITAB_DATA_MAX_CNT + EXCEL_OTHER_ROWCNTS ).
FRM_SHEED_CNT = FRM_SHEED_CNT + ( EXCEL_DATA_ROWCNTS - 1 ) * FORM_ROW_PITCH.
FRM_SHEED_CNT = CEIL( FRM_SHEED_CNT / EXCEL_SHEET_MAX_ROW ).
FRM_SHEED_CNT = FRM_SHEED_CNT * LINES( IT_EXCEL_DATA ).
PERFORM FRM_NEW_SHEET USING FRM_SHEED_CNT.
"文件是否隐藏,是的话,要求选择文件,将数据写入文件中
CLEAR P_ERRCODE.
IF SAVE_AS IS NOT INITIAL.
PERFORM FRM_GET_SAVE_FILENAME CHANGING SAVE_FILENAME. "取文件名
IF SAVE_FILENAME IS INITIAL.
P_ERRCODE = 'X'.
RETURN.
ENDIF.
FRM_VISIBLE = '0'.
ENDIF.
SET PROPERTY OF L_EXCEL 'Visible' = FRM_VISIBLE .
PERFORM FRM_ERR_HDL.
PERFORM FRM_MSG USING '正在创建工作表……'.
ENDFORM. "FRM_EXCLE_INIT
*&------------------------------------------------------