You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用abap2xlsx读写XLSX时,除新工作表外其余格式丢失问题

问题:abap2xlsx追加工作表后,旧工作表格式丢失

问题现象

首次创建XLSX文件一切正常,但覆盖文件追加新工作表时,除新创建的工作表外,其余所有旧工作表的格式全部丢失。

业务场景与工具

需要读取应用服务器上的XLSX文件并追加新工作表,使用abap2xlsx工具实现。

现有代码实现

1. 读取/创建Excel实例

方法定义:

METHODS get_excel
    IMPORTING
      i_file_path type string
    RETURNING
      value(r_result) TYPE ref to zcl_excel.

方法实现:

METHOD get_excel.

  TRY.
      DATA(excel_reader) = NEW zcl_excel_reader_2007( ).
      r_result = excel_reader->zif_excel_reader~load_file( i_filename        = i_file_path
                                                           i_from_applserver = 'X'
                 ).
    CATCH zcx_excel cx_root.
      r_result = new #(  ).
  ENDTRY.

ENDMETHOD.

2. 创建新工作表并绑定ALV表格

DATA(excel) = get_excel( file_path ).
DATA(worksheet) = excel->add_new_worksheet( ip_title = i_title ).
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(alv)                       
                        CHANGING  t_table      = c_table ).
worksheet->bind_alv( io_alv   = alv
                     it_table = c_table
                     i_top    = 3       ).

3. 保存文件到应用服务器

方法定义:

METHODS save_file
    IMPORTING i_excel     TYPE REF TO zcl_excel
              i_file_path TYPE string
    RAISING   zcx_excel
              cx_sy_file_open_mode
              cx_static_check.

方法实现:

METHOD save_file.

  TRY.
      DATA(excel_reader) = NEW zcl_excel_writer_2007( ).
      DATA(content) = excel_reader->zif_excel_writer~write_file( io_excel = i_excel ).

      OPEN DATASET i_file_path IN BINARY MODE FOR output.

          TRANSFER content TO i_file_path.

      CLOSE DATASET i_file_path.
    CATCH zcx_excel
          cx_sy_file_open_mode cx_root INTO DATA(error).
      RAISE EXCEPTION error.
  ENDTRY.

ENDMETHOD.

已尝试的替代方案

改用load方法读取文件内容,而非load_file,但问题依旧:

DATA xdata_excel type xstring.
OPEN DATASET i_file_path IN BINARY MODE FOR  INPUT.
  READ DATASET i_file_path INTO xdata_excel.
CLOSE DATASET i_file_path.
r_result = excel_reader->zif_excel_reader~load(
                 i_excel2007            =  xdata_excel
               ).

解决思路与方案

问题根源

abap2xlsx的zcl_excel_reader_2007默认读取时,可能未完整加载单元格样式、字体、边框等格式资源;或者写入时,旧工作表关联的格式未被正确打包到新文件中。另外,使用bind_alv绑定新表时,新生成的样式可能覆盖全局样式池,导致旧表的样式引用失效。

具体解决方案

  • 强制加载所有格式
    创建读取器后,显式开启样式加载(需确认版本支持该方法):

    DATA(excel_reader) = NEW zcl_excel_reader_2007( ).
    excel_reader->set_load_styles( abap_true ). " 开启完整样式加载
    r_result = excel_reader->zif_excel_reader~load_file( i_filename = i_file_path i_from_applserver = 'X' ).
    
  • 隔离新工作表样式
    绑定ALV前备份全局样式池,绑定后恢复,避免旧样式被覆盖:

    DATA(original_style_pool) = excel->mo_styles. " 备份全局样式池
    worksheet->bind_alv( io_alv = alv it_table = c_table i_top = 3 ).
    excel->mo_styles = original_style_pool. " 恢复原有样式池
    
  • 检查写入逻辑
    确认zcl_excel_writer_2007在写入时遍历了所有工作表的格式资源,确保旧表样式被正确写入新文件。

  • 升级abap2xlsx版本
    该问题可能是工具已知bug,升级到最新版本的abap2xlsx,查看是否有相关修复。


内容的提问来源于stack exchange,提问作者Almos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:07:12