ABAP使用OLE2对象创建EXCEL文件

 

正文

厌倦了总是下载一模一样的EXCEL文档?没有颜色,边框,有效性验证....

让我们看看怎样用OLE2对象来创造可爱的EXCEL工作表吧!(效果如下)

OLE2创建的EXCEL工作表

首先你需要知道微软EXCEL中的不同部分的名称,每个部分在我们的程序中都代表一个OLE2对象

EXCEL的不同部分

本文地址:http://www.cnblogs.com/hhelibeb/p/5787396.html

原文地址:Using ole2 objects for create an excel file

转载请注明

 

2018.03.29:做了一年多ABAP开发工作之后,译者认为OLE是个很难用很烦人的东西,强烈推荐使用XLSX Workbench进行EXCEL表单/报表的开发工作:

XLSX Workbench for SAP 

 

开始

  所有例子都使用了下面这个模板报表。你只需要复制代码,并且粘贴到为它预留的空白位置。

  在这个报表当中,你将会看到如何创建一个新文档,如何保存它,以及如何关闭它。

复制代码
REPORT zric_ole2.
TYPE-POOLS: soi,ole2.
DATA:  lo_application   TYPE  ole2_object,
       lo_workbook      TYPE  ole2_object,
       lo_workbooks     TYPE  ole2_object,
       lo_range         TYPE  ole2_object,
       lo_worksheet     TYPE  ole2_object,
       lo_worksheets    TYPE  ole2_object,
       lo_column        TYPE  ole2_object,
       lo_row           TYPE  ole2_object,
       lo_cell          TYPE  ole2_object,
       lo_font          TYPE ole2_object.

  DATA: lo_cellstart      TYPE ole2_object,
        lo_cellend        TYPE ole2_object,
        lo_selection      TYPE ole2_object,
        lo_validation     TYPE ole2_object.

  DATA: lv_selected_folder TYPE string,
        lv_complete_path   TYPE char256,
        lv_titulo          TYPE string.

    CALL METHOD cl_gui_frontend_services=>directory_browse
      EXPORTING
        window_title    = lv_titulo
        initial_folder  = 'C:\'
      CHANGING
        selected_folder = lv_selected_folder
      EXCEPTIONS
        cntl_error      = 1
        error_no_gui    = 2
        OTHERS          = 3.
  CHECK NOT lv_selected_folder IS INITIAL.

  CREATE OBJECT lo_application 'Excel.Application'.
  CALL METHOD OF lo_application 'Workbooks' = lo_workbooks.
  CALL METHOD OF lo_workbooks 'Add' = lo_workbook.
  SET PROPERTY OF lo_application 'Visible' = 0.
  GET PROPERTY OF lo_application 'ACTIVESHEET' = lo_worksheet.


* ----------
* ---- PASTE HERE THE CODE
* ----------


CONCATENATE lv_selected_folder '\Test' INTO lv_complete_path.

  CALL METHOD OF lo_workbook 'SaveAs'
    EXPORTING
    #1 = lv_complete_path.
  IF sy-subrc EQ 0.
     MESSAGE 'File downloaded successfully' TYPE 'S'.
  ELSE.
     MESSAGE 'Error downloading the file' TYPE 'E'.
  ENDIF.

  CALL METHOD OF lo_application 'QUIT'.
  FREE OBJECT lo_worksheet.
  FREE OBJECT lo_workbook.
  FREE OBJECT lo_application.

 
复制代码

 

基本动作

Select a cell
Select range of cells
Select a column
Select a row
Get the selection reference
Change the active worksheet
Change the name of worksheet
Add worksheet

 

 

Zoom

 

(译者注:原文的Add worksheet代码有遗漏,本人进行了补正)

修改内容

我认为理解这部分的工作原理的最佳方式是在EXCEL中创建一个宏,观察它的Visual Basic代码,以此“翻译”成ABAP代码。

要创建一个宏,首先你需要激活开发者标签,下面的链接解释了如何做这件事:

http://office.microsoft.com/en-us/excel-help/show-the-developer-tab-or-run-in-developer-mode-HA010173052.aspx

创建一个宏很简单,你可以按照这个链接中的办法做:

http://office.microsoft.com/en-us/excel-help/create-or-delete-a-macro-HP010014111.aspx

我也建议你下载一份VB语言参考作为指导:

http://msdn.microsoft.com/en-us/library/aa220733(v=office.11).aspx

对比VB代码和ABAP代码,你会理解它的工作原理。你不需要在任何情形下都把VB代码完全转换为ABAP,只转换你需要的部分。

1 - 选取一个单元格,设置值:

VB选取单元格设置值

CALL METHOD OF lo_worksheet 'Cells' = lo_cell
    EXPORTING
    #1 = 1  "Row
    #2 = 2. "Column

SET PROPERTY OF lo_cell 'Value' = 'Hello World'.

 

结果:

结果1

2- 修改字体大小

VB修改字体大小

复制代码
  CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 1  "Row
      #2 = 2. "Column

  SET PROPERTY OF lo_cell 'Value' = 'Hello World'.
  CALL METHOD OF lo_cell 'FONT' = lo_font.
  SET PROPERTY OF lo_font 'Name' = 'Arial'.
  SET PROPERTY OF lo_font 'Size' = 15.
复制代码

结果:

结果2

3- 颜色,粗体,下划线,斜体:

VB颜色粗体下划线斜体

复制代码
    CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 1  "Row
      #2 = 2. "Column

  SET PROPERTY OF lo_cell 'Value' = 'Hello World'.
  CALL METHOD OF lo_cell 'FONT' = lo_font.

  SET PROPERTY OF lo_font 'Color' = -16776961.
  SET PROPERTY OF lo_font 'TintAndShade' = 0.

  SET PROPERTY OF lo_font 'Bold' = 1.
  SET PROPERTY OF lo_font 'Italic' = 1.
  SET PROPERTY OF lo_font 'Underline' = 2. "xlUnderlineStyleSingle

  DATA: lo_interior TYPE ole2_object.
  CALL METHOD OF lo_cell 'Interior' = lo_interior.
  SET PROPERTY OF lo_interior 'Color' = 15773696.
复制代码

 

结果:

结果3

4- 添加边框

VB添加边框

复制代码
  DATA: lo_borders TYPE ole2_object. 

  CALL METHOD OF lo_cell 'Borders' = lo_borders EXPORTING #1 = '7'. "xlEdgeLeft
  SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous

  CALL METHOD OF lo_cell 'Borders' = lo_borders EXPORTING #1 = '8'. "xlEdgeTop
  SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous

  CALL METHOD OF lo_cell 'Borders' = lo_borders EXPORTING #1 = '9'. "xlEdgeBottom
  SET PROPERTY OF lo_borders 'LineStyle' = '1'. "xlContinuous

  CALL METHOD OF lo_cell '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' = 4. "xlThick
复制代码

结果:

结果4

 

5 - 修改单元格格式

VB修改单元格格式

复制代码
CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 1  "Row
      #2 = 1. "Column
  SET PROPERTY OF lo_cell 'Value' = '1.23'.
  SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.

  CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 3  "Row
      #2 = 1. "Column
  SET PROPERTY OF lo_cell 'Value' = '02/01/2012'.
  SET PROPERTY OF lo_cell 'NumberFormat' = 'm/d/yyyy'.

  CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 5  "Row
      #2 = 1. "Column
  SET PROPERTY OF lo_cell 'NumberFormat' = '0.00'.
  SET PROPERTY OF lo_cell 'Value' = '1/2'.
  SET PROPERTY OF lo_cell 'NumberFormat' = '# ?/?'.
复制代码

 

结果:

结果5

6 - 添加有效性验证

比如说,只允许2000.01和2010.01之间的日期,如果在这个范围之外,提示错误。

VB Add validation

复制代码
  CALL METHOD OF lo_worksheet 'Cells' = lo_cell
      EXPORTING
      #1 = 1  "Row
      #2 = 1. "Column

  CALL METHOD OF lo_cell 'select'.
  CALL METHOD OF lo_application 'selection' = lo_selection.
  CALL METHOD OF lo_selection 'Validation' = lo_validation.

  CALL METHOD OF lo_validation 'Add'
    EXPORTING
    #1 = 4 "Type       = xlValidateDate
    #2 = 1 "AlertStype = xlValidAlertStop
    #3 = 1 "Operator   = xlBetween
    #4 = '1/1/2000' "Formula1
    #5 = '1/1/2010'."Formula2

  SET PROPERTY OF lo_validation 'ErrorMessage' = 'Enter a valid date'.
复制代码

结果:

结果6

- 创建一个包含其它工作簿中的值的下拉菜单:

这里有一个在EXCEL里面创建的例子:

http://office.microsoft.com/en-us/excel-help/create-or-remove-a-drop-down-list-HP005202215.aspx

下拉菜单

ABAP

结果:

结果7

 

改善性能

如果你想要下载大量数据,会花费很多时间。为了提高性能,我们从abap复制数据到剪切板,然后把它粘贴到excel里面。

比较两种方式的运行时间(代码已折叠):

Cell by Cell

一个单元格一个单元格地写入,要花费约145秒

时间花费

Copy-Paste

使用复制粘贴的方法,花费的时间少于4秒!

时间花费

 

有用的子程序

我已经创建了一个包含文件,其中含有多个有用的子程序。包含文件的代码放在本文的末尾。你可以测试报表程序,观察它们是如何运行的。

 

Test report: Example of use the include ZRIC_OLE2_UTILS

 

运行后,你可以下载到这样的一个excel:

download result

Code of include ZRIC_OLE2_UTILS

相关内容:

http://help.sap.com/printdocu/core/print46c/en/data/pdf/bcfesde6/bcfesde6.pdf

http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP+OLE+-+Download+tables+to+multiple+worksheets+in+Excel

https://msdn.microsoft.com/en-us/library/office/ff840772.aspx

 

 译者注:如果读者不知道某些属性的枚举值应如何设定,可以参考相关内容中的微软文档中的内容。

posted @ 2018-09-10 19:37  金秋岁月  阅读(863)  评论(0)    收藏  举报