ABAP MS_EXCEL_OLE_STANDARD_DAT的Bug

本文分析了 ABAP 程序中使用 EXCEL_OLE_STANDARD_DAT 和 MS_EXCEL_OLE_STANDARD_DAT 函数导出数据到 Excel 时出现的两个 BUG:字段名类型强制转换导致的问题及多次调用时字段名错误地出现在数据区域。

REPORT z_barry_test NO STANDARD PAGE HEADING LINE-SIZE 240.

DATA: BEGIN OF itab OCCURS 0,
        ff1(10) TYPE c,
        ff2(10) TYPE n,
        ff3 TYPE d,
        ff4 TYPE t,
        ff5 TYPE p DECIMALS 2,
       END OF itab.

DATA: BEGIN OF itab_field OCCURS 0,
        fname(40) TYPE c ,
      END OF itab_field.

itab-ff1 = '测试ABC'.
itab-ff2 = '1234'.
itab-ff3 = '20100120'.
itab-ff4 = '163145'.
itab-ff5 = '13244.34'.
APPEND itab.

itab_field-fname = 'F1'.
APPEND itab_field.
itab_field-fname = 'F2'.
APPEND itab_field.
itab_field-fname = 'F3'.
APPEND itab_field.
itab_field-fname = 'F4'.
APPEND itab_field.
itab_field-fname = '5'. "针对非C、N、D、T类型列的列名,函数有Bug
APPEND itab_field.

CALL FUNCTION 'EXCEL_OLE_STANDARD_DAT'
  EXPORTING
    file_name                 = 'C:\TEST1'
    create_pivot              = 0
    data_sheet_name           = 'TEST 1'
  TABLES
    data_tab                  = itab
    fieldnames                = itab_field
  EXCEPTIONS
    file_not_exist            = 1
    filename_expected         = 2
    communication_error       = 3
    ole_object_method_error   = 4
    ole_object_property_error = 5
    invalid_filename          = 6
    invalid_pivot_fields      = 7
    download_problem          = 8
    OTHERS                    = 9.

CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
  EXPORTING
    file_name                 = 'C:\TEST2'
    data_sheet_name           = 'TEST 2'
  TABLES
    data_tab                  = itab
    fieldnames                = itab_field
  EXCEPTIONS
    file_not_exist            = 1
    filename_expected         = 2
    communication_error       = 3
    ole_object_method_error   = 4
    ole_object_property_error = 5
    invalid_filename          = 6
    invalid_pivot_fields      = 7
    download_problem          = 8
    OTHERS                    = 9.

Bug有两个:

1、Fieldname数据类型会被强制转变为对应列的类型,如果转换失败则Dump

2、如果连续两次或两次以上以上调用,列名会跑到数据区

另外,如果要导出的数据有中文且本机操作系统不是中文,则GUI须用中文登录

<think>好的,我现在需要解决用户提到的ABAP中ZCL_EXCEL类没有get_worksheets方法的问题。首先,我需要回忆一下ZCL_EXCEL类的结构。根据引用[1],用户之前使用过lo_excel->get_worksheet_by_index(1)来获取工作表,这说明该类可能通过索引来访问单个工作表,而不是获取所有工作表的列表。如果get_worksheets方法不存在,可能需要找到替代方案。接下来,根据引用[2],SAP标准类CL_FDT_XL_SPREADSHEET可能提供了一些处理Excel的方法,但用户的问题是关于ZCL_EXCEL类的,所以可能需要查看是否有类似的方法或者是否可以通过其他方式获取工作表列表。另外,引用[3]提到了一些Excel处理的方法,比如设置行高,但可能不直接相关。可能的解决方案之一是检查ZCL_EXCEL类的内部结构,是否有存储工作表的属性。例如,是否有内部表或集合保存所有工作表。例如,假设ZCL_EXCEL类有一个属性worksheets,是一个工作表对象的内部表,那么可以通过访问这个属性来获取所有工作表。但需要确认该类的实际结构。如果类中没有公开的获取方法,可能需要通过索引循环遍历工作表。例如,从索引1开始,循环调用get_worksheet_by_index直到返回空值,从而收集所有工作表。这种方法可能存在风险,比如索引不连续或有最大限制,但可能是可行的临时解决方案。另外,用户可能需要自定义一个方法,通过继承或增强ZCL_EXCEL类来添加get_worksheets方法。这需要ABAP开发权限,可能涉及类增强或使用隐式增强点。例如,在类的定义中添加一个方法,返回内部的工作表集合。 还需要考虑异常处理,比如处理不存在的索引或无效的工作表引用。同时,性能方面,如果工作表数量很大,循环遍历可能影响效率,但通常Excel工作表数量有限,可能问题不大。最后,根据用户提供的代码示例,他们之前使用get_worksheet_by_index(1),所以可能需要调整代码以遍历所有存在的索引,收集工作表到内部表中。这可能是最直接的替代方法。</think>### 解决方案:ZCL_EXCEL替代`get_worksheets`方法实现 #### 1. 问题定位 ZCL_EXCELABAP中常用的开源Excel操作类库。若类中缺少`get_worksheets`方法,需通过以下方式实现类似功能: - **检查类结构**:确认是否存在内部存储工作表的属性(如`worksheets`表)[^1] - **替代方法调用**:使用`get_worksheet_by_index`遍历索引获取所有工作表 - **自定义方法扩展**:通过类增强添加`get_worksheets`方法 #### 2. 替代方案实现 ##### 方法1:通过索引遍历工作表 ```abap DATA: lo_worksheets TYPE TABLE OF REF TO zcl_excel_worksheet, lv_index TYPE i VALUE 1. WHILE lv_index <= lo_excel->get_worksheets_size( ). "假设存在获取总数的方法 APPEND lo_excel->get_worksheet_by_index( lv_index ) TO lo_worksheets. lv_index = lv_index + 1. ENDWHILE. ``` - **注意**:若`get_worksheets_size`不存在,需手动设定最大索引阈值(如100)并处理异常 ##### 方法2:直接访问内部属性(需授权) 若类中存在内部工作表表属性`worksheets`: ```abap FIELD-SYMBOLS: <lt_worksheets> TYPE ANY TABLE. ASSIGN lo_excel->('WORKSHEETS') TO <lt_worksheets>. "通过反射访问私有属性 IF sy-subrc = 0. lo_worksheets = <lt_worksheets>. ENDIF. ``` #### 3. 自定义方法增强 通过ABAP类增强技术添加`get_worksheets`方法: ```abap CLASS zcl_excel DEFINITION PUBLIC CREATE PUBLIC. PUBLIC SECTION. METHODS get_worksheets RETURNING VALUE(rt_worksheets) TYPE REF TO zcl_excel_worksheet[]. ENDCLASS. CLASS zcl_excel IMPLEMENTATION. METHOD get_worksheets. rt_worksheets = me->worksheets. "假设内部存在worksheets属性 ENDMETHOD. ENDCLASS. ``` #### 4. 兼容性验证 - **版本差异**:检查不同ZCL_EXCEL版本中方法是否存在(如`get_active_worksheet`) - **异常处理**:添加`TRY...CATCH`块处理无效索引或空引用 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值