Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7185073
  • 博文数量: 655
  • 博客积分: 10264
  • 博客等级: 上将
  • 技术积分: 8278
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-04 17:47
个人简介

ABAP顾问

文章分类

全部博文(655)

文章存档

2017年(2)

2014年(8)

2013年(3)

2012年(2)

2011年(18)

2010年(102)

2009年(137)

2008年(274)

2007年(134)

分类:

2007-11-27 16:26:01

*&---------------------------------------------------------------------*
*& Report  Z_BARRY_EXCEL_TEST                                          *
*&                                                                     *
*&---------------------------------------------------------------------*
*&  Excel OLE 测试                                                     *
*&---------------------------------------------------------------------*
REPORT z_barry_excel_test .
 
 
INCLUDE ole2incl.
DATA: excel_obj     TYPE ole2_object,
      workbook_obj  TYPE ole2_object,
      sheet_obj     TYPE ole2_object,
      sheet_obj2    TYPE ole2_object,
      cell_obj      TYPE ole2_object,
      column_obj    TYPE ole2_object,
      range_obj     TYPE ole2_object,
      borders_obj   TYPE ole2_object,
      button_obj    TYPE ole2_object,
      int_obj       TYPE ole2_object,
      font_obj      TYPE ole2_object,
      row_obj       TYPE ole2_object.
DATA: celldata(40) TYPE c .
DATA: BEGIN OF itab OCCURS 0 ,
        ff1(10) TYPE c,
        ff2(10) TYPE c,
      END OF itab.
START-OF-SELECTION.
  itab-ff1 = 'A1'.
  itab-ff2 = 'A2'.
  APPEND itab.
  itab-ff1 = 'B1'.
  itab-ff2 = 'B2'.
  APPEND itab.
  itab-ff1 = 'C1'.
  itab-ff2 = 'C2'.
  APPEND itab.
  itab-ff1 = 'D1'.
  itab-ff2 = 'D2'.
  APPEND itab.
  itab-ff1 = 'E1'.
  itab-ff2 = 'E2'.
  APPEND itab.
  PERFORM open_excel_file USING  excel_obj
                                 workbook_obj
                                 sheet_obj
                                 'C:\XLS_TMPLT.XLS'
                                 'TestSheet'
                                 '1' .
  PERFORM excel_range_write USING excel_obj
                                  'A1:B2'
                                  'abcd'.
  PERFORM excel_row_insert  USING sheet_obj
                                  '1'
                                  '2'.
  PERFORM excel_column_insert USING sheet_obj
                                    'A'
                                    '2'.
  PERFORM rowheight USING excel_obj
                          '1:6'
                          '30'.
  PERFORM columnwidth USING excel_obj
                            'A:C'
                            '20'.
  PERFORM excel_cell_read USING excel_obj
                                '1'
                                'A'
                                celldata .
  PERFORM excel_range_write USING excel_obj
                                  'C1:D2'
                                  celldata .
  PERFORM excel_sheet_add USING workbook_obj
                                sheet_obj2
                                'Test02'.
  PERFORM excel_range_write USING excel_obj
                                  'C1:D2'
                                  'aaaaa'.
  PERFORM borderrange USING excel_obj
                            'A1:C3'.
  PERFORM runmacro USING excel_obj
                         'Macro1'.
  PERFORM fill_sheet_itab USING 2 3.
  CALL METHOD OF sheet_obj 'Activate' .
  PERFORM fill_sheet_itab USING 2 3.
  PERFORM protect_sheet .
  GET PROPERTY OF excel_obj 'ActiveWorkbook' = workbook_obj.
  PERFORM excel_save USING excel_obj.
  CALL METHOD OF workbook_obj 'CLOSE'.
  CALL METHOD OF excel_obj 'QUIT'.
*&---------------------------------------------------------------------*
*& 创建Excel对象
*&---------------------------------------------------------------------*
FORM open_excel_file USING  lcobj_excel
                            lcobj_workbook
                            lcobj_sheet
                            lc_filename
                            lc_sheetname
                            lc_visible.
  CREATE OBJECT lcobj_excel 'Excel.Application'.
  IF sy-subrc NE 0.
    MESSAGE e796(f9) WITH '不能创建Excel对象'.
  ENDIF.
  CALL METHOD OF lcobj_excel 'Workbooks' = lcobj_workbook.
  CALL METHOD OF lcobj_workbook 'Open' = lcobj_workbook
    EXPORTING #1 = lc_filename.
  IF sy-subrc NE 0.
    MESSAGE e796(f9) WITH '打开文件错误'.
  ENDIF.
  SET PROPERTY OF lcobj_excel 'Visible' = lc_visible.
  CALL METHOD OF lcobj_workbook 'Sheets' = lcobj_sheet
    EXPORTING #1 = 1.
  SET PROPERTY OF lcobj_sheet 'Name' = lc_sheetname.
ENDFORM.                    "excel_initialization
*&---------------------------------------------------------------------*
*& 读取单元格的数据
*&---------------------------------------------------------------------*
FORM excel_cell_read USING lcobj_excel
                           lc_row
                           lc_col
                           lc_value.
  DATA: lc_cell TYPE ole2_object.
  GET PROPERTY OF lcobj_excel 'Cells' = lc_cell
  exporting #1 = lc_row
            #2 = lc_col.
  GET PROPERTY OF lc_cell 'Value' = lc_value.
ENDFORM.                    "excel_cell_read
*&---------------------------------------------------------------------*
*& 写数据至Range
*&---------------------------------------------------------------------*
FORM excel_range_write USING lcobj_excel
                             lc_range
                             lc_value.
  DATA: lc_cell TYPE ole2_object.
  CALL METHOD OF lcobj_excel 'RANGE' = lc_cell
    EXPORTING
    #1 = lc_range.
  PERFORM font USING lc_cell 1 '30'.
  SET PROPERTY OF lc_cell 'VALUE' = lc_value.
ENDFORM.                    "excel_cell_write
*&---------------------------------------------------------------------*
*& 插入N行
*&---------------------------------------------------------------------*
FORM excel_row_insert USING lcobj_sheet
                            lc_row
                            lc_count.
  DATA lc_range TYPE ole2_object.
  DO lc_count TIMES.
    CALL METHOD OF lcobj_sheet 'Rows' = lc_range
      EXPORTING #1 = lc_row.
    CALL METHOD OF lc_range 'Copy'.
    CALL METHOD OF lcobj_sheet 'Rows' = lc_range
      EXPORTING #1 = lc_row.
    CALL METHOD OF lc_range 'Insert'.
    CALL METHOD OF lc_range 'ClearContents'. "是否需要清空Cell
  ENDDO.
ENDFORM.                    "excel_row_insert
*&---------------------------------------------------------------------*
*& 插入N列
*&---------------------------------------------------------------------*
FORM excel_column_insert USING  lcobj_sheet
                                lc_col
                                lc_count.
  DATA lc_range TYPE ole2_object.
  CALL METHOD OF lcobj_sheet 'COLUMNS' = lc_range
    EXPORTING #1 = lc_col.
  CALL METHOD OF lc_range 'Copy'.
  CALL METHOD OF lcobj_sheet 'COLUMNS' = lc_range
    EXPORTING #1 = lc_col.
  DO lc_count TIMES.
    CALL METHOD OF lc_range 'Insert'.
  ENDDO.
  CALL METHOD OF lc_range 'ClearContents'.
ENDFORM.                    "excel_column_insert
*&---------------------------------------------------------------------*
*& 增加一个Sheet
*&---------------------------------------------------------------------*
FORM excel_sheet_add USING  lcobj_workbook
                            lcobj_sheet
                            lc_newsheetname.
  DATA lc_newsheet TYPE ole2_object.
  GET PROPERTY OF lcobj_workbook 'Sheets' = lcobj_sheet.
  CALL METHOD OF lcobj_sheet 'Add' = lc_newsheet.
  SET PROPERTY OF lc_newsheet 'Name' = lc_newsheetname.
ENDFORM.                    "excel_sheet_add
*&---------------------------------------------------------------------*
*& 增加一个Workbook
*&---------------------------------------------------------------------*
FORM excel_workbook_add USING lcobj_excel
                              lcobj_workbook.
  DATA lc_newworkbook TYPE ole2_object.
  GET PROPERTY OF lcobj_excel 'Workbooks' = lcobj_workbook.
  CALL METHOD OF lcobj_workbook 'Add' = lc_newworkbook.
ENDFORM.                    "excel_workbook_add
*&---------------------------------------------------------------------*
*& 设置Cell的字体
*&---------------------------------------------------------------------*
FORM font USING lcobj_cell
                bold
                size.
  DATA lc_font TYPE ole2_object.
  CALL METHOD OF lcobj_cell 'FONT' = lc_font.
  SET PROPERTY OF lc_font 'BOLD' = bold.
  SET PROPERTY OF lc_font 'SIZE' = size.
  FREE OBJECT lc_font.
ENDFORM.                    "font
*&---------------------------------------------------------------------*
*& 行高
*&---------------------------------------------------------------------*
FORM rowheight USING lcobj_excel
                     row
                     height .
  DATA lc_row TYPE ole2_object .
  CALL METHOD OF lcobj_excel 'ROWS' = lc_row
    EXPORTING #1 = row.
  SET PROPERTY OF lc_row 'RowHeight' = height .
  FREE OBJECT lc_row.
ENDFORM .                    "rowheight
*&---------------------------------------------------------------------*
*& 列宽
*&---------------------------------------------------------------------*
FORM columnwidth USING lcobj_excel
                       column
                       width .
  DATA ls_col TYPE ole2_object .
  CALL METHOD OF lcobj_excel 'COLUMNS' = ls_col
    EXPORTING
    #1 = column.
  SET PROPERTY OF ls_col  'columnwidth' = width .
  FREE OBJECT ls_col.
ENDFORM .                    "columnwidth
*---------------------------------------------------------------------*
* 添加Range的边框                                                     *
*---------------------------------------------------------------------*
FORM borderrange USING lcobj_excel
                       range .
  DATA: lc_cell TYPE ole2_object ,
        lc_borders TYPE ole2_object .
  CALL METHOD OF lcobj_excel 'RANGE' = lc_cell
    EXPORTING
    #1 = range.
  DO 4 TIMES .
    CALL METHOD OF lc_cell 'BORDERS' = lc_borders
      EXPORTING #1 = sy-index.
    SET PROPERTY OF lc_borders 'LineStyle' = '1'.
    SET PROPERTY OF lc_borders 'WEIGHT' = 2.                "4=max
    SET PROPERTY OF lc_borders 'ColorIndex' = '3'.
  ENDDO.
  FREE OBJECT lc_borders.
  FREE OBJECT lc_cell.
ENDFORM.                    "borderrange

*---------------------------------------------------------------------*
* FORM fill_sheet_itab                                                *
*---------------------------------------------------------------------*
* 把内表依次放入Cell                                                  *
*---------------------------------------------------------------------*
FORM  fill_sheet_itab USING rowindex
                            colindex.
  DATA: row    TYPE  i ,
        col    TYPE  i .
  DATA: lcobj_cell TYPE ole2_object .
  FIELD-SYMBOLS:  .
  row = rowindex .
  LOOP AT itab .
    col = colindex .
    DO 20 TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE itab TO .
      IF sy-subrc <> 0 .
        EXIT.
      ENDIF.
      CALL METHOD OF excel_obj 'Cells' = lcobj_cell
        EXPORTING #1 = row
        #2 = col.
      SET PROPERTY OF lcobj_cell 'Value' = .
      col = col + 1.
    ENDDO.
    row = row + 1.
  ENDLOOP.
ENDFORM.                    "fill_sheet_itab
 
*---------------------------------------------------------------------*
* 执行Excel的宏                                                       *
*---------------------------------------------------------------------*
FORM runmacro USING lcobj_excel
                    macroname.
  CALL METHOD OF lcobj_excel 'RUN'
    EXPORTING
    #1 = macroname.
ENDFORM.                    "runmacro
 
*&---------------------------------------------------------------------*
* 保护工作表
*----------------------------------------------------------------------*
FORM protect_sheet .
  CALL METHOD OF sheet_obj 'PROTECT'
      EXPORTING
        #1 = 'pass' " Password
        #2 = 1 " Protect Drawing Objects
        #3 = 1 " Protect Contents
        #4 = 1." Protect Scenarios.
ENDFORM.                    " protect_sheet
 
*&---------------------------------------------------------------------*
*& 保存Excel
*&---------------------------------------------------------------------*
FORM excel_save USING lcobj_excel.
  SET PROPERTY OF lcobj_excel 'DisplayAlerts' = 0.
  CALL METHOD OF lcobj_excel 'Save'.
*  CALL METHOD OF workbook_obj 'SAVEAS'  "另存
*    EXPORTING
*      #1 = 'C:\Test.xls'
*      #2 = 1.
ENDFORM.                    "excel_save
阅读(10421) | 评论(17) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2009-02-27 10:45:15

DOI怎样动态实现单元格合并

chinaunix网友2008-12-07 19:29:23

确实比较烦。哪位大侠能给点例子?

qdbarry2008-12-04 22:29:34

我感觉用带参数的宏比较好,但是决定Left、TOP等参数比较烦

chinaunix网友2008-12-04 21:05:54

shape是图形,方框、椭圆之类的。

chinaunix网友2008-12-03 20:30:33

shape 是啥?