现在的位置: 首页 > 综合 > 正文

当ABAP遇到OLE

2013年04月20日 ⁄ 综合 ⁄ 共 8504字 ⁄ 字号 评论关闭

ABAP 编程过程中难免遇到各种和微软EXCEL交互的场景,因此本人将EXCEL操作封装成类,方便调用

*———————————————————————*
*&  ZEXCELCLASS
*&———————————————————————*
INCLUDE OLE2INCL.

*———————————————————————-*
*       CLASS EXCEL_PROXY DEFINITION
*———————————————————————-*
*
*———————————————————————-*
CLASS EXCEL_PROXY DEFINITION.
PUBLIC SECTION.
METHODS:
*   构造方法,创建一个EXCEL实例.
CONSTRUCTOR,
*   从外部对象加载EXCEL
SETEXCEL IMPORTING EXCELOBJECT TYPE OLE2_OBJECT ,
*   打开EXCEL模版文件并将返回的WORKBOOK放入成员变量
OPENEXCELTEMPLATEBYURI IMPORTING URI TYPE C,
*   将内表快速粘贴到EXCEL中
EXPORTTABTOEXCEL IMPORTING SHEETNO TYPE I “Sheet参数
LINE TYPE I  “RANGE行参数
COLUMN TYPE I “RANGE列参数
TAB TYPE STANDARD TABLE,
*   将一个数据写入EXCEL相应的格子中
APPENDDATA IMPORTING    SHEETNO TYPE I
TEXT TYPE C
BEGIN_ROW TYPE I
BEGIN_COL TYPE I
END_ROW   TYPE I
END_COL   TYPE I,
*    加入EXCEL一行
APPENDLINE IMPORTING    SHEETNO TYPE I
BEGIN_ROW TYPE I
BEGIN_COL TYPE I
END_ROW   TYPE I
END_COL   TYPE I,
*格式化单元格
EXCEL_FORMAT_RANGE IMPORTING
SHEETNO TYPE I
BEGIN_ROW TYPE I
BEGIN_COL TYPE I
END_ROW   TYPE I
END_COL   TYPE I
FONT_NAME TYPE C
FONT_SIZE TYPE I
FONT_STYLE TYPE C
HALIGNMENT TYPE I
VALIGNMENT TYPE I
BORDER_WEIGHT TYPE I,
*格式化单元格2
EXCEL_FORMAT_RANGE2 IMPORTING
SHEETNO TYPE I
BEGIN_ROW TYPE I
BEGIN_COL TYPE I
END_ROW   TYPE I
END_COL   TYPE I,

*调整行高
EXCEL_ROWHEIGHT IMPORTING
P_BEGROW  TYPE C
P_ENDROW  TYPE C
P_ROWHEIGHT TYPE I,
*调整列宽
EXCEL_COLWIDTH IMPORTING
P_BEGCOL TYPE C
P_ENDCOL TYPE C
P_COLWIDTH TYPE I,
*测试
EXCEL_CALL_METHOD,
*以文本格式输出,用于身份号码输出
EXCEL_TXT_FORMAT IMPORTING
SHEETNO TYPE I
BEGIN_ROW TYPE I
BEGIN_COL TYPE I
END_ROW   TYPE I
END_COL   TYPE I.

PRIVATE SECTION.
*   私有成员变量中记录着各种对象的引用
DATA:
M_EXCEL TYPE OLE2_OBJECT,        “Excel对象
M_WORKBOOKS TYPE OLE2_OBJECT,    “Workbooks List对象
M_WORKBOOK TYPE OLE2_OBJECT,     “Workbook对象
M_SHEETS TYPE OLE2_OBJECT,       “SHEETS对象
M_SHEET1 TYPE OLE2_OBJECT.
ENDCLASS.                    “EXCEL_PROXY DEFINITION

*———————————————————————-*
*       CLASS EXCEL_PROXY IMPLEMENTATION
*———————————————————————-*
*————————EXCEL代理————————————-*
*———————————————————————-*
CLASS EXCEL_PROXY IMPLEMENTATION.
*———————————————————————-*
*——————————构造方法——————————–*
*———————————————————————-*
METHOD CONSTRUCTOR.
*  获取Excel对象
CREATE OBJECT M_EXCEL ‘EXCEL.APPLICATION’.
SET PROPERTY OF M_EXCEL ‘Visible’ = 1.
CALL METHOD OF M_EXCEL ‘Workbooks’ = M_WORKBOOKS.
*  打开下载的Excel Book对象
CALL METHOD OF M_WORKBOOKS ‘Add’ = M_WORKBOOK.
ENDMETHOD.                    “CONSTRUCTOR
“constructor

METHOD SETEXCEL.
M_EXCEL = EXCELOBJECT.
SET PROPERTY OF M_EXCEL ‘Visible’ = 1.
CALL METHOD OF M_EXCEL ‘Workbooks’ = M_WORKBOOKS.
*  打开下载的Excel Book对象
CALL METHOD OF M_WORKBOOKS ‘Add’ = M_WORKBOOK.

ENDMETHOD.                    “SetExcel

*———————————————————————-*
*—————————–打开一个EXCEL模版文件——————–*
*———————————————————————-*
METHOD OPENEXCELTEMPLATEBYURI.
CALL METHOD OF M_WORKBOOKS ‘Open’ = M_WORKBOOK EXPORTING #1 = URI.
ENDMETHOD.                    “OpenExcelTemplateByUri
*———————————————————————-*
*—————————–* 将内表快速粘贴到EXCEL中—————-*
*———————————————————————-*
METHOD EXPORTTABTOEXCEL.
DATA:   M_RANGE TYPE OLE2_OBJECT.
* 1 获得一个可以放入剪切版的TABLE
TYPES: DATA1(2000) TYPE C,
TY TYPE TABLE OF DATA1.
DATA:IT TYPE TY.
DATA IT_REC TYPE DATA1.
DATA: COUNT TYPE I.

FIELD-SYMBOLS: <FS> TYPE ANY ,
<DYN_TABLE> TYPE STANDARD TABLE,
<DYN_WA> TYPE ANY .

ASSIGN TAB TO <DYN_TABLE>.

LOOP AT <DYN_TABLE> ASSIGNING <DYN_WA> .

DO.
ASSIGN COMPONENT SY-INDEX
OF STRUCTURE <DYN_WA> TO <FS>.
IF SY-SUBRC <> 0.
APPEND IT_REC TO IT.
CLEAR IT_REC.
EXIT.
ENDIF.
IF IT_REC IS INITIAL.
IT_REC = <FS>.
ELSE.
CONCATENATE
IT_REC
<FS>
INTO IT_REC
SEPARATED BY CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
ENDIF.
ENDDO.
ENDLOOP.

* 2 将TAB放入剪切版
CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
IMPORTING
DATA                 = IT[]
CHANGING
RC                   = COUNT
EXCEPTIONS
CNTL_ERROR           = 1
ERROR_NO_GUI         = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS               = 4.

*3获得一个EXCELSheet对象
CALL METHOD OF M_WORKBOOK ‘Worksheets’ = M_SHEETS.

*CALL METHOD OF M_sheets ‘Item’ = M_sheet1 EXPORTING #1 = SheetNo.

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.

SET PROPERTY OF M_RANGE ‘NumberFormatLocal’ = ‘@’.

CALL METHOD OF M_SHEET1 ‘Activate’.

CALL METHOD OF M_SHEET1 ‘Cells’ = M_RANGE
EXPORTING
#1 = LINE
#2 = COLUMN.

SET PROPERTY OF M_RANGE ‘NumberFormatLocal’ = ‘@’.

CALL METHOD OF M_RANGE ‘Select’.

CALL METHOD OF M_SHEET1 ‘Paste’.

ENDMETHOD.                    “EXPORTTABTOEXCEL

METHOD  APPENDDATA.

DATA:   L_RANGE TYPE OLE2_OBJECT,        “Range对象
L_CELL1 TYPE OLE2_OBJECT,        “Cell对象
L_CELL2 TYPE OLE2_OBJECT,        “Cell对象
L_BORDER TYPE OLE2_OBJECT.       “BORDER对象

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.

CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL1
EXPORTING
#1 = BEGIN_ROW
#2 = BEGIN_COL.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL2
EXPORTING
#1 = END_ROW
#2 = END_COL.
CALL METHOD OF M_SHEET1 ‘Range’ = L_RANGE
EXPORTING
#1 = L_CELL1
#2 = L_CELL2.
*  合并单元格
SET PROPERTY OF L_RANGE ‘MergeCells’ = ‘True’.
*  以文本形式显示
SET PROPERTY OF L_RANGE ‘NumberFormatLocal’ = ‘@’.
*  输出文字
SET PROPERTY OF L_RANGE ‘Value’ = TEXT.

ENDMETHOD.                    “appendDATA

METHOD APPENDLINE.

DATA:   L_RANGE TYPE OLE2_OBJECT,        “Range对象
L_CELL1 TYPE OLE2_OBJECT,        “Cell对象
L_CELL2 TYPE OLE2_OBJECT,        “Cell对象
L_BORDER TYPE OLE2_OBJECT.       “BORDER对象

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.

CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL1
EXPORTING
#1 = BEGIN_ROW
#2 = BEGIN_COL.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL2
EXPORTING
#1 = END_ROW
#2 = END_COL.
CALL METHOD OF M_SHEET1 ‘Range’ = L_RANGE
EXPORTING
#1 = L_CELL1
#2 = L_CELL2.
CALL METHOD OF L_RANGE ‘Insert’
EXPORTING
#1 = -4121.

ENDMETHOD.                    “APPENDLINE

* 设置单元格格式方法
METHOD EXCEL_FORMAT_RANGE.

DATA:   L_RANGE TYPE OLE2_OBJECT,        “Range对象
L_CELL1 TYPE OLE2_OBJECT,        “Cell对象
L_CELL2 TYPE OLE2_OBJECT,        “Cell对象
L_FONT TYPE OLE2_OBJECT,         “Font对象
L_BORDER TYPE OLE2_OBJECT.       “BORDER对象

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.

CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL1
EXPORTING
#1 = BEGIN_ROW
#2 = BEGIN_COL.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL2
EXPORTING
#1 = END_ROW
#2 = END_COL.
CALL METHOD OF M_SHEET1 ‘Range’ = L_RANGE
EXPORTING
#1 = L_CELL1
#2 = L_CELL2.

*  水平对齐
IF HALIGNMENT <> 0.
SET PROPERTY OF L_RANGE ‘HorizontalAlignment’ = HALIGNMENT.
ENDIF.

*  垂直对齐
IF VALIGNMENT <> 0.
SET PROPERTY OF L_RANGE ‘VerticalAlignment’ = VALIGNMENT.
ENDIF.

*  字体设置
IF FONT_NAME <> ” OR FONT_SIZE <> 0 OR FONT_STYLE <> ”.
GET PROPERTY OF L_RANGE ‘Font’ = L_FONT.
SET PROPERTY OF L_FONT ‘Name’ = FONT_NAME.
SET PROPERTY OF L_FONT ‘Size’ = FONT_SIZE.
SET PROPERTY OF L_FONT ‘FontStyle’ = FONT_STYLE.
ENDIF.

*  边框
IF BORDER_WEIGHT <> 0.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘7′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘8′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘9′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘10′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘11′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
GET PROPERTY OF L_RANGE ‘Borders’ = L_BORDER EXPORTING #1 = ‘12′.
SET PROPERTY OF L_BORDER ‘Weight’ = BORDER_WEIGHT.
ENDIF.

ENDMETHOD.                    “EXCEL_FORMAT_RANGE

* 设置行高
METHOD EXCEL_ROWHEIGHT.

DATA L_C TYPE OLE2_OBJECT.        “Rows对象
DATA L_COLLETTER(30) TYPE C.

CONCATENATE P_BEGROW ‘:’ P_ENDROW INTO L_COLLETTER.
CALL METHOD OF M_EXCEL ‘Rows’ = L_C
EXPORTING
#1 = L_COLLETTER.
SET PROPERTY OF L_C ‘RowHeight’ = P_ROWHEIGHT.
ENDMETHOD.                    “EXCEL_ROWHEIGHT

* 设置列宽
METHOD EXCEL_COLWIDTH.

DATA L_C TYPE OLE2_OBJECT.        “Columns对象
DATA L_COLLETTER(30) TYPE C.

CONCATENATE P_BEGCOL ‘:’ P_ENDCOL INTO L_COLLETTER.
CALL METHOD OF M_EXCEL ‘Columns’ = L_C
EXPORTING
#1 = L_COLLETTER.
SET PROPERTY OF L_C ‘ColumnWidth’ = P_COLWIDTH.
ENDMETHOD.                    ” EXCEL_COLWIDTH

METHOD EXCEL_FORMAT_RANGE2.

DATA: P_BEGCELL_ROW TYPE I,
P_BEGCELL_COL TYPE I,
P_ENDCELL_ROW TYPE I,
P_ENDCELL_COL TYPE I,
L_CELL1 TYPE OLE2_OBJECT,
L_CELL2 TYPE OLE2_OBJECT,
L_RANGE TYPE OLE2_OBJECT.

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL1
EXPORTING
#1 = BEGIN_ROW
#2 = BEGIN_COL.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL2
EXPORTING
#1 = END_ROW
#2 = END_COL.
CALL METHOD OF M_SHEET1 ‘Range’ = L_RANGE
EXPORTING
#1 = L_CELL1
#2 = L_CELL2.

**  合并单元格
*  SET PROPERTY OF l_range ‘MergeCells’ = ‘True’.
**  以文本形式显示
*  SET PROPERTY OF l_range ‘NumberFormatLocal’ = ‘@’.
**  输出文字
*  SET PROPERTY OF l_range ‘Value’ = p_appendtext.
*
SET PROPERTY OF L_RANGE ‘WrapText’ = ‘True’.
*
*    SET PROPERTY OF L_RANGE ‘ShrinkToFit’ = ‘False’.
ENDMETHOD.                    “EXCEL_FORMAT_RANGE2

METHOD EXCEL_CALL_METHOD.

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = 1.

DATA A TYPE C.
A = ‘Array(10,20,30)’.
CALL METHOD OF M_SHEET1 ‘abc’
EXPORTING
#1 = A.

ENDMETHOD.

METHOD EXCEL_TXT_FORMAT.
DATA:
L_CELL1 TYPE OLE2_OBJECT,
L_CELL2 TYPE OLE2_OBJECT,
L_RANGE TYPE OLE2_OBJECT.

CALL METHOD OF M_WORKBOOK ‘WorkSheets’ = M_SHEET1
EXPORTING
#1 = SHEETNO.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL1
EXPORTING
#1 = BEGIN_ROW
#2 = BEGIN_COL.
CALL METHOD OF M_SHEET1 ‘Cells’ = L_CELL2
EXPORTING
#1 = END_ROW
#2 = END_COL.
CALL METHOD OF M_SHEET1 ‘Range’ = L_RANGE
EXPORTING
#1 = L_CELL1
#2 = L_CELL2.

CALL METHOD OF L_RANGE ‘Select’.
SET PROPERTY OF L_RANGE ‘NumberFormatLocal’ = ‘@’.

ENDMETHOD.

ENDCLASS.                    “EXCEL_PROXY IMPLEMENTATION

抱歉!评论已关闭.