指定格式或者快速导出的EXCEL文件函数(升级版)

该函数与前面的函数不同,为升级版,可以生成文件的同时,自动按照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
*&------------------------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值