使用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
相关产品推荐
相关产品推荐

