OLE打印就是打开一个excel然后把数据和对单元格的操作一行行写上去,如果程序执行,立刻打开excel有时甚至能看到一行行数据写入的过程
另一种打印方式是abap2excel 需要先下载对应的插件,本质是在sap中内置一个excel然后将数据写入,直接下载到桌面
OLE需要实现一些特别的功能时,都可以选择在excel中录制宏,再根据宏代码修改即可
在excel中点击录制宏,然后执行想要的操作
操作完需要的效果,点击结束宏,然后点查看
就可以看到这个宏对应的代码,根据下列代码改写成abap的部分即可
*&---------------------------------------------------------------------* *& Form FRM_PRINT_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_PRINT_DATA . DATA: lv_object_id(20) TYPE c, "模板名称 lv_string TYPE string, ls_key TYPE wwwdatatab, lv_lines TYPE numc2, LV_ROW TYPE numc2, * LV_COLOR_YELLOW TYPE int8 VALUE 65535, * LV_COLOR_ORANGE TYPE int8 VALUE 49407, * LV_COLOR_GREEN TYPE int8 VALUE 5287936, ThemeColor TYPE INT4 VALUE 9, "修改绿色为浅蓝 TintAndShade TYPE P LENGTH 13 DECIMALS 6 VALUE '0.600000', lv_str2 TYPE c2 VALUE cl_abap_char_utilities=>cr_lf, lt_doc_tab TYPE STANDARD TABLE OF w3mime, lc_fullpath TYPE string VALUE'D:\temp\', lc_path TYPE string VALUE'D:\temp\', ls_destination LIKE rlgrap-filename, lv_fill TYPE string, lv_filename TYPE rlgrap-filename, ls_objnam TYPE string, li_rc LIKE sy-subrc, lv_filename1 TYPE STRING, LV_TABIX TYPE INT4, ls_errtxt TYPE string. DATA: lv_file(255) TYPE c. DATA lv_subrc TYPE sy-subrc. CLEAR lv_object_id. lv_object_id = 'ZHR024'. CALL METHOD cl_gui_frontend_services=>directory_browse CHANGING selected_folder = lv_string. * 写入到本地的地址 lv_file = lv_string && '\' && PN-BEGDA+(4) && '年' && PN-BEGDA+4(2) && '月' && '入职渠道分析报表' && sy-datum && sy-uzeit && '.xlsx'. lv_filename = lv_string && '\' && PN-BEGDA+(4) && '年' && PN-BEGDA+4(2) && '月' && '入职渠道分析报表' && sy-datum && sy-uzeit && '.xlsx'. " 获取模板信息 CALL FUNCTION 'SAP_OI_LOAD_MIME_DATA' EXPORTING object_id = lv_object_id TABLES data_table = lt_doc_tab EXCEPTIONS object_not_found = 1 internal_error = 2 OTHERS = 3. IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. SELECT SINGLE relid, objid FROM wwwdata INTO CORRESPONDING FIELDS OF @ls_key WHERE srtf2 = 0 AND relid = 'MI' AND objid = @lv_object_id. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING key = ls_key destination = lv_filename IMPORTING rc = lv_subrc. " 打开EXCEL CREATE OBJECT excel 'EXCEL.APPLICATION'. SET PROPERTY OF excel 'VISIBLE' = 1. CALL METHOD OF excel 'WORKBOOKS' = workbook. CALL METHOD OF workbook 'Open' "打开EXCEL EXPORTING #1 = lv_file. CALL METHOD OF excel 'WORKSHEETS' = sheet EXPORTING #1 = 'Sheet1'. "EXCEL sheet页名称 CALL METHOD OF sheet 'ACTIVATE'. "激活 lv_lines = 3. LOOP AT GT_RESULT INTO GS_RESULT. IF SY-TABIX MOD 2 = 1 . "从第三行开始的奇数行 LV_TABIX = SY-TABIX + 2. PERFORM EXCEL_RANGE_COLOR1 USING SHEET LV_TABIX ThemeColor TintAndShade. ENDIF. "编号 CLEAR lv_fill. lv_fill = GS_RESULT-ZZPQD. PERFORM fill_cell_data USING lv_lines 1 lv_fill. "部门 CLEAR lv_fill. lv_fill = GS_RESULT-ZRS. PERFORM fill_cell_data USING lv_lines 2 lv_fill. "应发工资 CLEAR lv_fill. lv_fill = GS_RESULT-ZZB. PERFORM fill_cell_data USING lv_lines 3 lv_fill. "实发工资 CLEAR lv_fill. lv_fill = GS_RESULT-ZPM. PERFORM fill_cell_data USING lv_lines 4 lv_fill. lv_lines = lv_lines + 1. CLEAR:GS_RESULT. ENDLOOP. ENDFORM.
"将选中的区间范围单元格设置成传入的颜色 (因为这里单元格设置颜色是从某行的第一列的单元格到第18列的单元格) FORM EXCEL_RANGE_COLOR1 USING lo_worksheet "excel中的工作页 ROW "行 ThemeColor TintAndShade. "颜色 DATA:lo_cellstart TYPE ole2_object, lo_cellend TYPE ole2_object, lo_range TYPE ole2_object. DATA: lo_interior TYPE ole2_object. * 1. 开始的单元格 CALL METHOD OF lo_worksheet 'Cells' = lo_cellstart EXPORTING #1 = ROW #2 = 1. * 2. 结束的单元格 CALL METHOD OF lo_worksheet 'Cells' = lo_cellend EXPORTING #1 = ROW #2 = 4. * 3.选择的单元格范围 CALL METHOD OF lo_worksheet 'RANGE' = lo_range EXPORTING #1 = lo_cellstart #2 = lo_cellend. CALL METHOD OF lo_range 'Interior' = lo_interior. SET PROPERTY OF lo_interior 'ThemeColor' = ThemeColor. SET PROPERTY OF lo_interior 'TintAndShade' = TintAndShade. FREE OBJECT lo_range. ENDFORM.
*&---------------------------------------------------------------------* *& Form fill_cell_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_1 *& --> P_4 *& --> LV_FILL *&---------------------------------------------------------------------* FORM FILL_CELL_DATA USING p_row "对单元格赋值,并且画边框 p_col p_value. DATA: lo_borders TYPE ole2_object. CALL METHOD OF excel 'CELLS' = cell1 EXPORTING #1 = p_row #2 = p_col. * CALL METHOD OF excel 'RANGE' = cell * EXPORTING #1 = 'a4'. SET PROPERTY OF cell1 'VALUE' = p_value. CALL METHOD OF cell1 'Borders' = lo_borders EXPORTING #1 = '7'. "xlEdgeLeft SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous CALL METHOD OF cell1 'Borders' = lo_borders EXPORTING #1 = '8'. "xlEdgeTop SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous CALL METHOD OF cell1 'Borders' = lo_borders EXPORTING #1 = '9'. "xlEdgeBottom SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous CALL METHOD OF cell1 'Borders' = lo_borders EXPORTING #1 = '10'. "xlEdgeRight SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous * Increase the weight of the border if you want, in this case only for EdgeRight: SET PROPERTY OF lo_borders 'WEIGHT' = 2. "xlThick FREE OBJECT cell1. ENDFORM.