本文档内容:
一、 模板的下载(可参考最后面的实例程序)
二、 关于EXCEL输出 1.基本步骤 2.其他关于EXCEL表操作的补充说明
三、 实例程序
四、 关于CALL METHOD DOCUMENT->*的补充说明
五、 关于VBA与ABAP代码的说明
获得EXCEL表的方式:
1.建立某格式文件 call function ''GUI_DOWNLOAD''
例: L_FULLPATH = ''C:\Documents and Settings\zxd\桌面\hello.xls''.
CALL FUNCTION ''GUI_DOWNLOAD'' "根据文件路径建立文件
EXPORTING
FILENAME = L_FULLPATH
FILETYPE = ''BIN''
TABLES
DATA_TAB = L_MIME.
注:路径选择也可以通过宏实现,用此种方法建立的EXCEL表只有一个SHEET!
2.用SMW0存储的模板用 CALL FUNCTION ''SAP_OI_LOAD_MIME_DATA''下载
一、模板的下载(可参考最后面的实例程序)
1用FUNCTION: SAP_OI_LOAD_MIME_DATA下载:
INCLUDE OFFICEINTEGRATIONINCLUDE.
DATA: FACTORY TYPE REF TO I_OI_DOCUMENT_FACTORY,
RETCODE TYPE T_OI_RET_STRING,
LINK_SERVER TYPE REF TO I_OI_LINK_SERVER.
DATA: DOC_SIZE TYPE I,
DOC_FORMAT(100),
DOC_TYPE(100) VALUE ''Word.Document.8'',
DOC_TABLE LIKE W3MIME OCCURS 0,
DOCUMENT TYPE REF TO I_OI_DOCUMENT_PROXY,
IS_CLOSED TYPE I.
DATA L_FULLPATH TYPE STRING.
INITIALIZATION.
PERFORM INIT_FACTORY. "下载模板时需要初始化的内容
START-OF-SELECTION.
L_FULLPATH = ‘C:\SHIYAN’. "用FUNCTION选择文件地点写入L_FULLPATH也可
PERFORM OPEN_DOC USING L_FULLPATH. " L_FULLPATH为文件存储的路径,C或者字符串都行,子程序里会人为的修改成C类型,如果此处定义为C类型则子程序里不用再做变换
FORM INIT_FACTORY .
IF FACTORY IS INITIAL.
CALL METHOD C_OI_FACTORY_CREATOR=>GET_DOCUMENT_FACTORY
IMPORTING
FACTORY = FACTORY
RETCODE = RETCODE.
IF RETCODE NE C_OI_ERRORS=>RET_OK. EXIT. ENDIF.
CALL METHOD FACTORY->START_FACTORY
EXPORTING
R3_APPLICATION_NAME = SY-SYSID
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
CALL METHOD FACTORY->GET_LINK_SERVER
IMPORTING
LINK_SERVER = LINK_SERVER
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''W''.
CALL METHOD LINK_SERVER->START_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''W''.
ELSE.
CALL METHOD LINK_SERVER->STOP_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
ENDIF. "factory IS INITIAL.
ENDFORM. " INIT_FACTORY
FORM OPEN_DOC USING L_FULLPATH.
DATA: OBJECT_ID(20).
CLEAR OBJECT_ID.
DATA: DIZHI(100) TYPE C.
DIZHI = L_FULLPATH.
OBJECT_ID = ''ZHRIS087A''.
CALL FUNCTION ''SAP_OI_LOAD_MIME_DATA''
EXPORTING
OBJECT_ID = OBJECT_ID
IMPORTING
DATA_SIZE = DOC_SIZE
DOCUMENT_FORMAT = DOC_FORMAT
DOCUMENT_TYPE = DOC_TYPE
TABLES
DATA_TABLE = DOC_TABLE
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.
IF DOC_SIZE NE 0.
CALL METHOD FACTORY->GET_DOCUMENT_PROXY
EXPORTING
DOCUMENT_TYPE = DOC_TYPE
IMPORTING
DOCUMENT_PROXY = DOCUMENT
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
" 打开下载的模板(注:不CALL METHOD不能正常打开
CALL METHOD DOCUMENT->PLAY_DOCUMENT_FROM_TABLE
EXPORTING
DOCUMENT_TABLE = DOC_TABLE[]
DOCUMENT_SIZE = DOC_SIZE
NO_FLUSH = ''X''
IMPORTING
RETCODE = RETCODE.
" 按DIZHI存储的路径保存下载的模板,不打开也能保存!
CALL METHOD DOCUMENT->SAVE_COPY_AS
EXPORTING
FILE_NAME = DIZHI
NO_FLUSH = ''X''
PROMPT_USER = '' ''
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
PERFORM CLOSE_DOC.
PERFORM CLOSE_FACTORY.
ELSE.
MESSAGE ''No document selected'' TYPE ''E''.
ENDIF.
ENDFORM. " OPEN_DOC
FORM CLOSE_DOC .
IF NOT DOCUMENT IS INITIAL.
CALL METHOD DOCUMENT->IS_DESTROYED
IMPORTING
RET_VALUE = IS_CLOSED.
IF IS_CLOSED IS INITIAL.
CALL METHOD DOCUMENT->CLOSE_DOCUMENT
EXPORTING
DO_SAVE = ''X''
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
ENDIF.
CALL METHOD DOCUMENT->RELEASE_DOCUMENT
EXPORTING
NO_FLUSH = '' ''
IMPORTING
RETCODE = RETCODE.
FREE DOCUMENT.
ENDIF.
ENDFORM. " CLOSE_DOC
FORM CLOSE_FACTORY .
IF NOT LINK_SERVER IS INITIAL.
CALL METHOD LINK_SERVER->STOP_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
FREE LINK_SERVER.
ENDIF.
IF NOT FACTORY IS INITIAL.
CALL METHOD FACTORY->STOP_FACTORY
IMPORTING
RETCODE = RETCODE.
FREE FACTORY.
ENDIF.
ENDFORM. " CLOSE_FACTORY
二、关于EXCEL输出
1.基本步骤:
第一步:定义变量:
TYPE-POOLS OLE2 .
DATA: V_EXCEL TYPE OLE2_OBJECT, “excel 表
V_SHEET TYPE OLE2_OBJECT, “EXCEL 表中的SHEET
V_BOOK TYPE OLE2_OBJECT,
V_CELL TYPE OLE2_OBJECT, “SHEET 中的单元格
注:上面定义的4个一般为必然会用到的变量,下面的变量可以在用到时再做定义
V_RANGE TYPE OLE2_OBJECT, “选中区域
V_COLUMN TYPE OLE2_OBJECT, “选中列
V_BORDERS TYPE OLE2_OBJECT. “选中区域的边框
DATA: V_SHEET_NUMBER TYPE I,
PA_PATH TYPE STRING,
L_ROW TYPE I,
L_COL TYPE I,
第二步:打开已存在的EXCEL模板
CREATE OBJECT V_EXCEL ''Excel.Application''. "创建Excel对象
CALL METHOD OF V_EXCEL ''Workbooks'' = V_BOOK. " excel createwbook
CALL METHOD OF V_BOOK ''Open'' = V_BOOK
EXPORTING
#1 = PA_PATH. "文件存储的路径 ,字符串,C类型应该也可以,没有试验
"注:也可以新建一个EXCEL:call method of v_books ''Add'' = v_book.
IF SY-SUBRC <> 0.
MESSAGE ''Open file failed!'' TYPE ''E''.
STOP.
ENDIF.
SET PROPERTY OF V_EXCEL ''Visible'' = 1. "将已经打开的EXCEL表
1设置可见前台运行。为0时表示为后台运行
第三步:打开EXCEL表其中的一个SHEET并修改SHEET名
V_SHEET_NUMBER = 1. "打开EXCEL表第一个SHEET
CALL METHOD OF V_BOOK ''Sheets'' = V_SHEET "打开EXCEL的SHEET
EXPORTING #1 = PA_SHEET_NUMBER.
* CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET "效果和上面SHEETS一样,输出数据同样可以是SHEET名也可以是数字
* EXPORTING
* #1 = ''Sheet3''.
CALL METHOD OF V_SHEET ''ACTIVATE''. "显示当前选择的SHEET,如不写此句显示SHEET为第一个SHEET,不过下面的其他操作仍然只是对被选择的SHEET有效
SET PROPERTY OF V_SHEET ''NAME'' = ''SHIYAN''."此语句可以修改选择的SHEET名
第四步:往EXCEL表里填写内容
CALL METHOD OF V_SHEET ''Cells'' = V_CELL
EXPORTING
#1 = L_ROW "写入的行号
#2 = L_COL. "写入的列号
SET PROPERTY OF V_CELL ''Value'' = SY-DATUM. "SY-DATUM为填写的内容
第五步:保存并释放SAP对EXCEL的链接
SET PROPERTY OF V_EXCEL ''DisplayAlerts'' = 0. "不显示警告提示,如不加此句,保存文件时会弹出“当前位置以有名为*的文件,是否…”的询问对话框,加上此句则直接保存
CALL METHOD OF V_BOOK ''SAVEAS'' "保存EXCEL文件
EXPORTING #1 = PA_FULLPATH.
CALL METHOD OF V_BOOK ''Exit'' = V_BOOK. "此句作用尚不明确!不写没发现影响
FREE OBJECT V_EXCEL.
FREE OBJECT V_SHELL.
……
2.其他关于EXCEL表操作的补充说明:
2.1调用EXCEL表宏
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET
EXPORTING
#1 = ''SHEET1''.
CALL METHOD OF H_SHEET ''ACTIVATE''.
CALL METHOD OF EXCEL ''RUN'' EXPORTING #1 = ''ZMACRO1''.
2.2输入列号求得列字母表示(自编宏,HR项目组用,其他如没有自己写吧……)
CALL FUNCTION ''ZHRIS_GET_EXCEL_COLUMN''
EXPORTING
P_COLUMN = L_INT
IMPORTING
F_COLUMN = COL.
例:输入L_INT = 5 输出 COL = ‘e’.
2.3调整列宽度与行高及插入行
DATA V_COLUMN TYPE OLE2_OBJECT.
DATA V_ROWS TYPE OLE2_OBJECT.
*--调整列宽度
CALL METHOD OF V_EXCEL ''Columns'' = V_COLUMN "选定列
EXPORTING
#1 = ‘1:5’. "修改1-5列
SET PROPERTY OF V_COLUMN ''ColumnWidth'' = 30. "要调整的宽度
*--调整行宽度
CALL METHOD OF V_EXCEL ''ROWS'' = V_ROWS
EXPORTING
#1 = 1. "行号
SET PROPERTY OF V_ROWS ''rowheight'' = 50.
CALL METHOD OF V_ROWS ''Insert''. "插入一行
注:行高会影响到所有行,设置单独的行高方法待查!
2.4 获得当前EXCEL表的SHEET数量
DATA SHEETCOUNT TYPE I.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET. " 得到活动的worksheet
GET PROPERTY OF V_SHEET ''COUNT'' = SHEETCOUNT. "得到sheet数量
WRITE SHEETCOUNT.
2.5 获得当前打开的SHEET名称(需执行打开SHEET操作后才能执行)
DATA SHEETNAME TYPE STRING.
GET PROPERTY OF V_SHEET ''NAME'' = SHEETNAME. "此语句用来获得当前打开的SHEET名称
2.6 复制SHEET
DATA MODELSHEET TYPE OLE2_OBJECT.
DATA TMPSHEET TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = MODELSHEET " 要复制的SHEET
EXPORTING #1 = ''Sheet2''.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = TMPSHEET
EXPORTING #1 = ''Sheet3''.
CALL METHOD OF MODELSHEET ''COPY'' " 复制MODELSHEET 放到TMPSHEET前
EXPORTING #1 = TMPSHEET. " 如不加此项则建立一个新表存储SHEET
2.7 隐藏格线
DATA ACTIVEWINDOW TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''ACTIVEWINDOW'' = ACTIVEWINDOW. "得到活动窗口对象
SET PROPERTY OF ACTIVEWINDOW '' DISPLAYGRIDLINES'' = 0."隐藏格线(虚线)
注:不要用V_SHEET,可能会导致输出数据不正常,原因不明,新定义一个比较保险。
2.8 选中EXCEL表某区域并做操作
CALL METHOD OF V_SHEET ''range'' = V_RANGE "设定操作范围
EXPORTING
#1 = ''a3''
#2 = ''B5''.
CALL METHOD OF V_RANGE ''Select'' NO FLUSH. " 选择设定区域
CALL METHOD OF V_RANGE ''ClearContents''. "清空内容
SET PROPERTY OF V_RANGE ''MergeCells'' = 1. "合并单元格
SET PROPERTY OF V_RANGE ''HorizontalAlignment'' = 2. "设定对齐方式(1:无对齐 2:左对齐 3:居中 4:右对齐)
SET PROPERTY OF RANGE ''VerticalAlignment'' = 3.”
SET PROPERTY OF V_RANGE ''ShrinkToFit'' = 0 . "取消自动缩小字体 1:设置
GET PROPERTY OF V_RANGE ''borders'' = V_BORDERS NO FLUSH. "加边框
SET PROPERTY OF V_BORDERS ''linestyle'' = ''1'' NO FLUSH. "框线格式
SET PROPERTY OF V_RANGE ''WrapText'' = 1 . "单元格内容自动换行
2.9 移动SHEET
DATA V_MOVE TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET "选择要移动的SHEET
EXPORTING
#1 = ''Sheet1''.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_MOVE "选择移动到的位置
EXPORTING
#1 = ''Sheet3''.
CALL METHOD OF V_SHEET ''Move'' "移动 V_SHEET 到 V_MOVE 左边
EXPORTING
#1 = V_MOVE.
2.10一个问题。有时输入数据如111111111111111111,会显示为1E+17。
解决办法:
CALL METHOD OF h_excel ''COLUMNS'' = columnObj
EXPORTING
#1 = 6. "the column number
SET PROPERTY OF columnObj ''ColumnWidth'' = 10.
SET PROPERTY OF columnObj ''NumberFormat'' = ''@''.
三、实例程序
用下载模板的实例程序:
EXCEL各功能操作试验程序:
四、关于CALL METHOD DOCUMENT的补充说明(其他用法请见二下载模板的说明)
1.用下面这个METHOD可以直接打开下载的模板
CALL METHOD DOCUMENT->OPEN_DOCUMENT_FROM_TABLE
EXPORTING
DOCUMENT_SIZE = DOC_SIZE
DOCUMENT_TABLE = DOC_TABLE[]
2.用下面这个METHOD可以调用下载模板的动态宏
MACRO = ''Macro2''. "宏名称
CALL METHOD DOCUMENT->EXECUTE_MACRO
EXPORTING
MACRO_STRING = macro "调用宏的名称
* NO_FLUSH = '' ''
PARAM1 = param1 "各参数值(用到几个打开几个)
* PARAM10 =
* PARAM11 =
* PARAM12 =
PARAM2 = param2
PARAM3 = param4
PARAM4 = param3
* PARAM5 =
* PARAM6 =
* PARAM7 =
* PARAM8 =
* PARAM9 =
PARAM_COUNT = 4 "要传进的参数数量
* SCRIPT_NAME =
* IMPORTING
* ERROR = error
* RETCODE =
* CHANGING
* ERROR_STRING =
* RETVALUE =
.
注1:EXCEL和WORD里写宏最简单的方法便是录制,录宏的方法如下:执行菜单命令“工具—>宏—>录制新宏”开始录制,按照步骤把想实现的功能操作一遍,完毕后点击 最左边的停止按钮,再根据是否需要传递参数等要求修改一下录制好的宏即可。
注2:一般输出数据到WORD的话可能会用到邮件合并功能,邮件合并功能的设置方法如下:
(可以参考程序ZHRIS_PAFM024模板的用法)
将excel中的人员信息表作为数据源。在word中建立一个主文档,设计排版出一个空白的履历表,不变的那部分内容先填好,如“姓名”、“年龄”、“学历”等。
执行菜单命令“工具—信函与邮件—显示邮件合并工具栏”调出邮件合并工具栏。点击“打开数据源”按钮(左起第2个图标),在打开的对话框中找到并打开人员信息excel表,选择存有人员信息的那个工作表即可。 确定后退回word主界面,点击履历表“姓名”后面的空白单元格,然后点击“插入域”按钮(左起第6个图标),打开插入合并域对话框,选择“姓名”项,单击“插入”,最后单击“关闭”退出。这时,会发现履历表“姓名”后面的单元格中出现“《姓名》”字样,这就是合并域的所谓占位符了。依此类推,为其他项目插入相应的合并域。点击“查看合并数据”(标有“ABC”的图标),你会发现所有占位符都被替换成真实的数据了,单击工具栏上的左、右方向按钮,可以快速浏览所有的履历,如未发现问题,可单击“合并到新文档”按钮(倒数第4个图标),从弹出对话框中选择“全部”记录,确定即可生成一个全新的word文档,每个人的履历都被放在一个单独的页面,打印出来即可。
注3:当录制向WORD插入照片的宏时,会遇到无法设定鼠标位置的问题,用下面一个方法可以解决:(适合只需要插入一张照片的宏,多张照片需另想办法……)
宏的第一步先写插入照片的代码,在插入语句代码前加上Application.GoBack语句(对应操作SHIFT+F5)。返回模板将鼠标放在要插入照片的位置上,点击保存按钮(必须有修改过内容,文件不能处于已保存状态),然后关闭模板文件即可。
SHIFT+F5的作用:在初打开文件未做任何操作时使用可以使鼠标回到上一次保存文件时的位置。
注4:补充一个VBA宏命令:
修改另存为时默认的文件名:(文件名用动态从字段中取到的值)
Dim l_month As Integer
Dim l_year As Integer
l_month=ActiveDocument.MailMerge.DataSource.DataFi elds("MONTH").Value
l_year = ActiveDocument.MailMerge.DataSource.DataFields("YE AH").Value
ActiveDocument.SaveAs FileName:=l_year & "年" & l_month & "月工资劳务费审批单"
五、关于VBA与ABAP代码的说明(以下内容纯属个人理解,欢迎随时修正!)
OFFICE宏命令编程用到VISUAL BASIC,ABAP语言用程序实现OFFICE的各项功能其实也是调用(或者是实现?不是特别清楚=,.=)了VB语言而已,那么接下来就讲如何通过OFFICE录制的宏转化为ABAP语言代码。
以EXCEL相关内容举例:
要想操作EXCEL就得知道想要操作的对象,是整个EXCEL表,还是其中的单元格或是数据。
一、 模板的下载(可参考最后面的实例程序)
二、 关于EXCEL输出 1.基本步骤 2.其他关于EXCEL表操作的补充说明
三、 实例程序
四、 关于CALL METHOD DOCUMENT->*的补充说明
五、 关于VBA与ABAP代码的说明
获得EXCEL表的方式:
1.建立某格式文件 call function ''GUI_DOWNLOAD''
例: L_FULLPATH = ''C:\Documents and Settings\zxd\桌面\hello.xls''.
CALL FUNCTION ''GUI_DOWNLOAD'' "根据文件路径建立文件
EXPORTING
FILENAME = L_FULLPATH
FILETYPE = ''BIN''
TABLES
DATA_TAB = L_MIME.
注:路径选择也可以通过宏实现,用此种方法建立的EXCEL表只有一个SHEET!
2.用SMW0存储的模板用 CALL FUNCTION ''SAP_OI_LOAD_MIME_DATA''下载
一、模板的下载(可参考最后面的实例程序)
1用FUNCTION: SAP_OI_LOAD_MIME_DATA下载:
INCLUDE OFFICEINTEGRATIONINCLUDE.
DATA: FACTORY TYPE REF TO I_OI_DOCUMENT_FACTORY,
RETCODE TYPE T_OI_RET_STRING,
LINK_SERVER TYPE REF TO I_OI_LINK_SERVER.
DATA: DOC_SIZE TYPE I,
DOC_FORMAT(100),
DOC_TYPE(100) VALUE ''Word.Document.8'',
DOC_TABLE LIKE W3MIME OCCURS 0,
DOCUMENT TYPE REF TO I_OI_DOCUMENT_PROXY,
IS_CLOSED TYPE I.
DATA L_FULLPATH TYPE STRING.
INITIALIZATION.
PERFORM INIT_FACTORY. "下载模板时需要初始化的内容
START-OF-SELECTION.
L_FULLPATH = ‘C:\SHIYAN’. "用FUNCTION选择文件地点写入L_FULLPATH也可
PERFORM OPEN_DOC USING L_FULLPATH. " L_FULLPATH为文件存储的路径,C或者字符串都行,子程序里会人为的修改成C类型,如果此处定义为C类型则子程序里不用再做变换
FORM INIT_FACTORY .
IF FACTORY IS INITIAL.
CALL METHOD C_OI_FACTORY_CREATOR=>GET_DOCUMENT_FACTORY
IMPORTING
FACTORY = FACTORY
RETCODE = RETCODE.
IF RETCODE NE C_OI_ERRORS=>RET_OK. EXIT. ENDIF.
CALL METHOD FACTORY->START_FACTORY
EXPORTING
R3_APPLICATION_NAME = SY-SYSID
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
CALL METHOD FACTORY->GET_LINK_SERVER
IMPORTING
LINK_SERVER = LINK_SERVER
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''W''.
CALL METHOD LINK_SERVER->START_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''W''.
ELSE.
CALL METHOD LINK_SERVER->STOP_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
ENDIF. "factory IS INITIAL.
ENDFORM. " INIT_FACTORY
FORM OPEN_DOC USING L_FULLPATH.
DATA: OBJECT_ID(20).
CLEAR OBJECT_ID.
DATA: DIZHI(100) TYPE C.
DIZHI = L_FULLPATH.
OBJECT_ID = ''ZHRIS087A''.
CALL FUNCTION ''SAP_OI_LOAD_MIME_DATA''
EXPORTING
OBJECT_ID = OBJECT_ID
IMPORTING
DATA_SIZE = DOC_SIZE
DOCUMENT_FORMAT = DOC_FORMAT
DOCUMENT_TYPE = DOC_TYPE
TABLES
DATA_TABLE = DOC_TABLE
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.
IF DOC_SIZE NE 0.
CALL METHOD FACTORY->GET_DOCUMENT_PROXY
EXPORTING
DOCUMENT_TYPE = DOC_TYPE
IMPORTING
DOCUMENT_PROXY = DOCUMENT
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
" 打开下载的模板(注:不CALL METHOD不能正常打开
CALL METHOD DOCUMENT->PLAY_DOCUMENT_FROM_TABLE
EXPORTING
DOCUMENT_TABLE = DOC_TABLE[]
DOCUMENT_SIZE = DOC_SIZE
NO_FLUSH = ''X''
IMPORTING
RETCODE = RETCODE.
" 按DIZHI存储的路径保存下载的模板,不打开也能保存!
CALL METHOD DOCUMENT->SAVE_COPY_AS
EXPORTING
FILE_NAME = DIZHI
NO_FLUSH = ''X''
PROMPT_USER = '' ''
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
PERFORM CLOSE_DOC.
PERFORM CLOSE_FACTORY.
ELSE.
MESSAGE ''No document selected'' TYPE ''E''.
ENDIF.
ENDFORM. " OPEN_DOC
FORM CLOSE_DOC .
IF NOT DOCUMENT IS INITIAL.
CALL METHOD DOCUMENT->IS_DESTROYED
IMPORTING
RET_VALUE = IS_CLOSED.
IF IS_CLOSED IS INITIAL.
CALL METHOD DOCUMENT->CLOSE_DOCUMENT
EXPORTING
DO_SAVE = ''X''
IMPORTING
RETCODE = RETCODE.
CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
EXPORTING
TYPE = ''E''.
ENDIF.
CALL METHOD DOCUMENT->RELEASE_DOCUMENT
EXPORTING
NO_FLUSH = '' ''
IMPORTING
RETCODE = RETCODE.
FREE DOCUMENT.
ENDIF.
ENDFORM. " CLOSE_DOC
FORM CLOSE_FACTORY .
IF NOT LINK_SERVER IS INITIAL.
CALL METHOD LINK_SERVER->STOP_LINK_SERVER
IMPORTING
RETCODE = RETCODE.
FREE LINK_SERVER.
ENDIF.
IF NOT FACTORY IS INITIAL.
CALL METHOD FACTORY->STOP_FACTORY
IMPORTING
RETCODE = RETCODE.
FREE FACTORY.
ENDIF.
ENDFORM. " CLOSE_FACTORY
二、关于EXCEL输出
1.基本步骤:
第一步:定义变量:
TYPE-POOLS OLE2 .
DATA: V_EXCEL TYPE OLE2_OBJECT, “excel 表
V_SHEET TYPE OLE2_OBJECT, “EXCEL 表中的SHEET
V_BOOK TYPE OLE2_OBJECT,
V_CELL TYPE OLE2_OBJECT, “SHEET 中的单元格
注:上面定义的4个一般为必然会用到的变量,下面的变量可以在用到时再做定义
V_RANGE TYPE OLE2_OBJECT, “选中区域
V_COLUMN TYPE OLE2_OBJECT, “选中列
V_BORDERS TYPE OLE2_OBJECT. “选中区域的边框
DATA: V_SHEET_NUMBER TYPE I,
PA_PATH TYPE STRING,
L_ROW TYPE I,
L_COL TYPE I,
第二步:打开已存在的EXCEL模板
CREATE OBJECT V_EXCEL ''Excel.Application''. "创建Excel对象
CALL METHOD OF V_EXCEL ''Workbooks'' = V_BOOK. " excel createwbook
CALL METHOD OF V_BOOK ''Open'' = V_BOOK
EXPORTING
#1 = PA_PATH. "文件存储的路径 ,字符串,C类型应该也可以,没有试验
"注:也可以新建一个EXCEL:call method of v_books ''Add'' = v_book.
IF SY-SUBRC <> 0.
MESSAGE ''Open file failed!'' TYPE ''E''.
STOP.
ENDIF.
SET PROPERTY OF V_EXCEL ''Visible'' = 1. "将已经打开的EXCEL表
1设置可见前台运行。为0时表示为后台运行
第三步:打开EXCEL表其中的一个SHEET并修改SHEET名
V_SHEET_NUMBER = 1. "打开EXCEL表第一个SHEET
CALL METHOD OF V_BOOK ''Sheets'' = V_SHEET "打开EXCEL的SHEET
EXPORTING #1 = PA_SHEET_NUMBER.
* CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET "效果和上面SHEETS一样,输出数据同样可以是SHEET名也可以是数字
* EXPORTING
* #1 = ''Sheet3''.
CALL METHOD OF V_SHEET ''ACTIVATE''. "显示当前选择的SHEET,如不写此句显示SHEET为第一个SHEET,不过下面的其他操作仍然只是对被选择的SHEET有效
SET PROPERTY OF V_SHEET ''NAME'' = ''SHIYAN''."此语句可以修改选择的SHEET名
第四步:往EXCEL表里填写内容
CALL METHOD OF V_SHEET ''Cells'' = V_CELL
EXPORTING
#1 = L_ROW "写入的行号
#2 = L_COL. "写入的列号
SET PROPERTY OF V_CELL ''Value'' = SY-DATUM. "SY-DATUM为填写的内容
第五步:保存并释放SAP对EXCEL的链接
SET PROPERTY OF V_EXCEL ''DisplayAlerts'' = 0. "不显示警告提示,如不加此句,保存文件时会弹出“当前位置以有名为*的文件,是否…”的询问对话框,加上此句则直接保存
CALL METHOD OF V_BOOK ''SAVEAS'' "保存EXCEL文件
EXPORTING #1 = PA_FULLPATH.
CALL METHOD OF V_BOOK ''Exit'' = V_BOOK. "此句作用尚不明确!不写没发现影响
FREE OBJECT V_EXCEL.
FREE OBJECT V_SHELL.
……
2.其他关于EXCEL表操作的补充说明:
2.1调用EXCEL表宏
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET
EXPORTING
#1 = ''SHEET1''.
CALL METHOD OF H_SHEET ''ACTIVATE''.
CALL METHOD OF EXCEL ''RUN'' EXPORTING #1 = ''ZMACRO1''.
2.2输入列号求得列字母表示(自编宏,HR项目组用,其他如没有自己写吧……)
CALL FUNCTION ''ZHRIS_GET_EXCEL_COLUMN''
EXPORTING
P_COLUMN = L_INT
IMPORTING
F_COLUMN = COL.
例:输入L_INT = 5 输出 COL = ‘e’.
2.3调整列宽度与行高及插入行
DATA V_COLUMN TYPE OLE2_OBJECT.
DATA V_ROWS TYPE OLE2_OBJECT.
*--调整列宽度
CALL METHOD OF V_EXCEL ''Columns'' = V_COLUMN "选定列
EXPORTING
#1 = ‘1:5’. "修改1-5列
SET PROPERTY OF V_COLUMN ''ColumnWidth'' = 30. "要调整的宽度
*--调整行宽度
CALL METHOD OF V_EXCEL ''ROWS'' = V_ROWS
EXPORTING
#1 = 1. "行号
SET PROPERTY OF V_ROWS ''rowheight'' = 50.
CALL METHOD OF V_ROWS ''Insert''. "插入一行
注:行高会影响到所有行,设置单独的行高方法待查!
2.4 获得当前EXCEL表的SHEET数量
DATA SHEETCOUNT TYPE I.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET. " 得到活动的worksheet
GET PROPERTY OF V_SHEET ''COUNT'' = SHEETCOUNT. "得到sheet数量
WRITE SHEETCOUNT.
2.5 获得当前打开的SHEET名称(需执行打开SHEET操作后才能执行)
DATA SHEETNAME TYPE STRING.
GET PROPERTY OF V_SHEET ''NAME'' = SHEETNAME. "此语句用来获得当前打开的SHEET名称
2.6 复制SHEET
DATA MODELSHEET TYPE OLE2_OBJECT.
DATA TMPSHEET TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = MODELSHEET " 要复制的SHEET
EXPORTING #1 = ''Sheet2''.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = TMPSHEET
EXPORTING #1 = ''Sheet3''.
CALL METHOD OF MODELSHEET ''COPY'' " 复制MODELSHEET 放到TMPSHEET前
EXPORTING #1 = TMPSHEET. " 如不加此项则建立一个新表存储SHEET
2.7 隐藏格线
DATA ACTIVEWINDOW TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''ACTIVEWINDOW'' = ACTIVEWINDOW. "得到活动窗口对象
SET PROPERTY OF ACTIVEWINDOW '' DISPLAYGRIDLINES'' = 0."隐藏格线(虚线)
注:不要用V_SHEET,可能会导致输出数据不正常,原因不明,新定义一个比较保险。
2.8 选中EXCEL表某区域并做操作
CALL METHOD OF V_SHEET ''range'' = V_RANGE "设定操作范围
EXPORTING
#1 = ''a3''
#2 = ''B5''.
CALL METHOD OF V_RANGE ''Select'' NO FLUSH. " 选择设定区域
CALL METHOD OF V_RANGE ''ClearContents''. "清空内容
SET PROPERTY OF V_RANGE ''MergeCells'' = 1. "合并单元格
SET PROPERTY OF V_RANGE ''HorizontalAlignment'' = 2. "设定对齐方式(1:无对齐 2:左对齐 3:居中 4:右对齐)
SET PROPERTY OF RANGE ''VerticalAlignment'' = 3.”
SET PROPERTY OF V_RANGE ''ShrinkToFit'' = 0 . "取消自动缩小字体 1:设置
GET PROPERTY OF V_RANGE ''borders'' = V_BORDERS NO FLUSH. "加边框
SET PROPERTY OF V_BORDERS ''linestyle'' = ''1'' NO FLUSH. "框线格式
SET PROPERTY OF V_RANGE ''WrapText'' = 1 . "单元格内容自动换行
2.9 移动SHEET
DATA V_MOVE TYPE OLE2_OBJECT.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_SHEET "选择要移动的SHEET
EXPORTING
#1 = ''Sheet1''.
CALL METHOD OF V_EXCEL ''WORKSHEETS'' = V_MOVE "选择移动到的位置
EXPORTING
#1 = ''Sheet3''.
CALL METHOD OF V_SHEET ''Move'' "移动 V_SHEET 到 V_MOVE 左边
EXPORTING
#1 = V_MOVE.
2.10一个问题。有时输入数据如111111111111111111,会显示为1E+17。
解决办法:
CALL METHOD OF h_excel ''COLUMNS'' = columnObj
EXPORTING
#1 = 6. "the column number
SET PROPERTY OF columnObj ''ColumnWidth'' = 10.
SET PROPERTY OF columnObj ''NumberFormat'' = ''@''.
三、实例程序
用下载模板的实例程序:
EXCEL各功能操作试验程序:
四、关于CALL METHOD DOCUMENT的补充说明(其他用法请见二下载模板的说明)
1.用下面这个METHOD可以直接打开下载的模板
CALL METHOD DOCUMENT->OPEN_DOCUMENT_FROM_TABLE
EXPORTING
DOCUMENT_SIZE = DOC_SIZE
DOCUMENT_TABLE = DOC_TABLE[]
2.用下面这个METHOD可以调用下载模板的动态宏
MACRO = ''Macro2''. "宏名称
CALL METHOD DOCUMENT->EXECUTE_MACRO
EXPORTING
MACRO_STRING = macro "调用宏的名称
* NO_FLUSH = '' ''
PARAM1 = param1 "各参数值(用到几个打开几个)
* PARAM10 =
* PARAM11 =
* PARAM12 =
PARAM2 = param2
PARAM3 = param4
PARAM4 = param3
* PARAM5 =
* PARAM6 =
* PARAM7 =
* PARAM8 =
* PARAM9 =
PARAM_COUNT = 4 "要传进的参数数量
* SCRIPT_NAME =
* IMPORTING
* ERROR = error
* RETCODE =
* CHANGING
* ERROR_STRING =
* RETVALUE =
.
注1:EXCEL和WORD里写宏最简单的方法便是录制,录宏的方法如下:执行菜单命令“工具—>宏—>录制新宏”开始录制,按照步骤把想实现的功能操作一遍,完毕后点击 最左边的停止按钮,再根据是否需要传递参数等要求修改一下录制好的宏即可。
注2:一般输出数据到WORD的话可能会用到邮件合并功能,邮件合并功能的设置方法如下:
(可以参考程序ZHRIS_PAFM024模板的用法)
将excel中的人员信息表作为数据源。在word中建立一个主文档,设计排版出一个空白的履历表,不变的那部分内容先填好,如“姓名”、“年龄”、“学历”等。
执行菜单命令“工具—信函与邮件—显示邮件合并工具栏”调出邮件合并工具栏。点击“打开数据源”按钮(左起第2个图标),在打开的对话框中找到并打开人员信息excel表,选择存有人员信息的那个工作表即可。 确定后退回word主界面,点击履历表“姓名”后面的空白单元格,然后点击“插入域”按钮(左起第6个图标),打开插入合并域对话框,选择“姓名”项,单击“插入”,最后单击“关闭”退出。这时,会发现履历表“姓名”后面的单元格中出现“《姓名》”字样,这就是合并域的所谓占位符了。依此类推,为其他项目插入相应的合并域。点击“查看合并数据”(标有“ABC”的图标),你会发现所有占位符都被替换成真实的数据了,单击工具栏上的左、右方向按钮,可以快速浏览所有的履历,如未发现问题,可单击“合并到新文档”按钮(倒数第4个图标),从弹出对话框中选择“全部”记录,确定即可生成一个全新的word文档,每个人的履历都被放在一个单独的页面,打印出来即可。
注3:当录制向WORD插入照片的宏时,会遇到无法设定鼠标位置的问题,用下面一个方法可以解决:(适合只需要插入一张照片的宏,多张照片需另想办法……)
宏的第一步先写插入照片的代码,在插入语句代码前加上Application.GoBack语句(对应操作SHIFT+F5)。返回模板将鼠标放在要插入照片的位置上,点击保存按钮(必须有修改过内容,文件不能处于已保存状态),然后关闭模板文件即可。
SHIFT+F5的作用:在初打开文件未做任何操作时使用可以使鼠标回到上一次保存文件时的位置。
注4:补充一个VBA宏命令:
修改另存为时默认的文件名:(文件名用动态从字段中取到的值)
Dim l_month As Integer
Dim l_year As Integer
l_month=ActiveDocument.MailMerge.DataSource.DataFi elds("MONTH").Value
l_year = ActiveDocument.MailMerge.DataSource.DataFields("YE AH").Value
ActiveDocument.SaveAs FileName:=l_year & "年" & l_month & "月工资劳务费审批单"
五、关于VBA与ABAP代码的说明(以下内容纯属个人理解,欢迎随时修正!)
OFFICE宏命令编程用到VISUAL BASIC,ABAP语言用程序实现OFFICE的各项功能其实也是调用(或者是实现?不是特别清楚=,.=)了VB语言而已,那么接下来就讲如何通过OFFICE录制的宏转化为ABAP语言代码。
以EXCEL相关内容举例:
要想操作EXCEL就得知道想要操作的对象,是整个EXCEL表,还是其中的单元格或是数据。