ABAP学习(16):ABAP2XLSX,操作excel

ABAP2XLSX

    ABAP2XLS是一个操作EXCEL的开源项目,相比较OLE2和DOI方式操作excel更加方便。

    ABAP中搜索ZDEMO_EXCEL*搜索Program可以查看SAP提供的示例程序,实现多种Excel。

1.创建excel

    Excel类:zcl_excel类,代表一个excel文档;

    Worksheet类:zcl_excel_worksheet类,代表一个worksheet;

    异常类:zcx_excel类,异常类;

    超链接类:zcl_excel_hyperlink类,通过设置超链接可链接到指定sheet栏位或者打开网络链接;

    创建excel过程:

    1、定义zcl_excel类对象对应变量lo_excel;

    2、CREATE OBJECT lo_excel,创建zcl_excel类对象;

    3、通过调用zcl_excel的get_active_sheet方法,获取当前活动sheet,当创建zcl_excel对象后,默认有一个worksheet处于活动;

    4、调用add_new_worksheet方法,可以创建新的worksheet;

示例:

"excel文档类对象
DATA:lo_excel TYPE REF TO zcl_excel.
"excel worksheet类对象
DATA:lo_worksheet TYPE REF TO zcl_excel_worksheet.
"异常类
DATA:lf_cxexcel TYPE REF TO ZCX_EXCEL.

"创建excel
FORM creat_excel.
  "excel超链接
  DATA:lo_hyperlink TYPE REF TO zcl_excel_hyperlink.
  TRY.
      "创建excel对象
      CREATE OBJECT lo_excel.
      "获得当前worksheet
      lo_worksheet = lo_excel->get_active_worksheet( ).

      "设置单元格
      lo_worksheet->set_cell( ip_column = 'A' ip_row = 1 ip_value = 'hello world!' ).
      lo_worksheet->set_cell( ip_column = 'A' ip_row = 2 ip_value = sy-datum ).
      lo_worksheet->set_cell( ip_column = 'A' ip_row = 3 ip_value = sy-uzeit ).

      "创建超链接
      "外部链接
      lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'https://www.baidu.com' ).
      lo_worksheet->set_cell( ip_column = 'A' ip_row = 4 ip_value = '百度一下' ip_hyperlink = lo_hyperlink ).

      "内部链接到其他sheet
      lo_hyperlink = zcl_excel_hyperlink=>create_internal_link( iv_location = 'itab!A1' ).
      lo_worksheet->set_cell( ip_column = 'A' ip_row = 5 ip_value = 'itab:A1' ip_hyperlink = lo_hyperlink ).

    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

2.excel下载与显示

    Excel下载和显示需要将excel转换成xstring操作。

    通过类型zif_excel_writer的cl_writer对象,调用write_file方法,将zcl_excel对象转换成xstring。将xstring转换为solix_tab类型变量,方便显示和下载操作。

2.1将excel转换xstring

    使用zif_excel_writer类,如果需要下载成xlsx类型文档,创建实例化对象时类型为zcl_excel_writer_2007;通过write_file方法获取xstring类型数据;再将xstring类型data转换为solix_tab类型数据。

示例:

"下载显示excel转换
DATA:cl_writer TYPE REF TO zif_excel_writer.
DATA:xdata TYPE xstring.
DATA:t_rawdata TYPE solix_tab.
DATA:bytecount TYPE i.

"excel转换成xstring
FORM translate_excel.
  "实例化cl_writer对象
  CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007.
  xdata = cl_writer->write_file( lo_excel ).

*  "方式1:convert to binary
*  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
*    EXPORTING
*      buffer        = xdata
*    IMPORTING
*      output_length = bytecount
*    TABLES
*      binary_tab    = t_rawdata.

  "方式2:This method is only available on AS ABAP > 6.40
  "excel转换
  t_rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring  = xdata ).
  "统计字节数
  bytecount = xstrlen( xdata ).
ENDFORM.

2.2GUI直接显示excel

示例:

"在ABAP显示
FORM display_excel.
  DATA:error TYPE REF TO i_oi_error.
  DATA:t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY.
  DATA:cl_control  TYPE REF TO i_oi_container_control. "OIContainerCtrl
  DATA:cl_document TYPE REF TO i_oi_document_proxy.   "Office Dokument

  c_oi_container_control_creator=>get_container_control(
    IMPORTING
      control = cl_control
      error   = error
  ).
  APPEND error TO t_errors.

  cl_control->init_control(
     EXPORTING
       inplace_enabled     = 'X'
       no_flush            = 'X'
       r3_application_name = 'Demo Document Container'
       parent              = cl_gui_container=>screen0
     IMPORTING
       error               = error
     EXCEPTIONS
       OTHERS  = 2
    ).
  APPEND error TO t_errors.

  cl_control->get_document_proxy(
    EXPORTING
      document_type  = 'Excel.Sheet'                " EXCEL
      no_flush       = ' '
    IMPORTING
      document_proxy = cl_document
      error  = error
  ).
  APPEND error TO t_errors.

  cl_document->open_document_from_table(
     EXPORTING
       document_size    = bytecount
       document_table   = t_rawdata
       open_inplace     = 'X'
   ).
  WRITE: '.'.  " To create an output.  That way screen0 will exist
ENDFORM.

2.3导出excel到本地

    主要使用cl_gui_frontend_services=>gui_download方法下载。

示例:

"下载到本地
FORM download_excel.
  DATA:filepath TYPE String VALUE 'C:'.
  DATA:filename TYPE String VALUE 'abap2xlsx1'.

  "选择文件保存路径
  cl_gui_frontend_services=>directory_browse(
      EXPORTING
        window_title         = 'Select path to download EXCEL-file'
        initial_folder       = filepath
      CHANGING
        selected_folder      = filepath
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4
    ).

  filename = filepath && '\' && filename && '.XLSX'.
"下载excel cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = bytecount filename = filename filetype =
'BIN' CHANGING data_tab = t_rawdata ). ENDFORM.

2.4将excel保存为csv文件

    使用zif_excel_writer类,如果需要下载成csv类型文档,创建实例化对象时类型为zcl_excel_writer_csv;调用write_file方法将zcl_excel转换为xstring;再将xstring类型数据转换为solix_tab类型数据。这个是单个sheet下载,使用zcl_excel_writer_csv类对象的set_active_sheet_index()设置要下载的worksheet。

示例:

"excel转换下载成csv
FORM translate_csv.
  "cl_writer对象
  CREATE OBJECT cl_writer TYPE zcl_excel_writer_csv.
  zcl_excel_writer_csv=>set_delimiter( ip_value = cl_abap_char_utilities=>horizontal_tab ).
  zcl_excel_writer_csv=>set_enclosure( ip_value = '''' ).
  zcl_excel_writer_csv=>set_endofline( ip_value = cl_abap_char_utilities=>cr_lf ).
  "单个sheet写入,set_active_sheet_index_by_name( )
  zcl_excel_writer_csv=>set_active_sheet_index( i_active_worksheet = 2 ).
  xdata = cl_writer->write_file( lo_excel ).
  "后续操作和excel一致,文件后缀.csv
ENDFORM.

2.5文件类型xlsm读写

    使用zif_excel_writer类,如果需要下载成xlsm类型文档,创建实例化对象时类型为zcl_excel_writer_xlsm.通过write_file方法获取xstring类型数据;再将xstring类型data转换为solix_tab类型数据。

    使用zif_excel_reader类,创建对象时类型为zcl_excel_reader_xlsm,通过类对象的load_file()方法加载xlsm类型文档。

示例:

"读写xlsm类型文档
FORM translate_xlsm.
  DATA:lo_excel_writer TYPE REF TO zif_excel_writer.
  DATA:lo_excel_reader TYPE REF TO zif_excel_reader.
 
  TRY .
      CREATE OBJECT lo_excel_reader TYPE zcl_excel_reader_xlsm.
      CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_xlsm.
      lo_excel = lo_excel_reader->load_file( '文件路径' ).
      xdata = lo_excel_writer->write_file( lo_excel ).

      "后续操作和excel一致,文件后缀.xlsm
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

2.6alv导出到excel

    使用zcl_excel_converter类导出alv到excel。

    1、创建zcl_excel_converter对象;

    2、调用convert方法,传入cl_salv_table和内表等参数;

    3、调用writer_file方法导出到excel;

示例1:

"使用zcl_excel_converter导出excel
FORM export_excel_conv.
  DATA:t_sflight TYPE TABLE OF sflight.
  DATA:lo_salv TYPE REF TO  cl_salv_table.

  SELECT * INTO TABLE t_sflight FROM sflight UP TO 10 ROWS.
  TRY.
      cl_salv_table=>factory(
        EXPORTING
          list_display = abap_false
        IMPORTING
          r_salv_table = lo_salv
        CHANGING
          t_table      = t_sflight[] ).
    CATCH cx_salv_msg .
  ENDTRY.

  "调用显示alv
*  lo_salv->display( ).
  DATA: lo_converter TYPE REF TO zcl_excel_converter.
  "创建zcl_excel_converter类
  CREATE OBJECT lo_converter.
  TRY .
      lo_converter->convert(
        EXPORTING
          io_alv        = lo_salv
          it_table      = t_sflight
          i_row_int     = 2
          i_column_int  = 2
          ).
    CATCH zcx_excel.
  ENDTRY.

  "调用write_file方法导出excel
  lo_converter->write_file( i_path = 'D:/test.xlsx' ).
ENDFORM.                    "EXPORT_TO_EXCEL_CONV

 

    使用zcl_excel_worksheet导出alv到excel。

    1、调用zcl_excel_worksheet对象的方法bind_alv(),将alv和worksheet绑定;

    2、然后zif_excel_writer接口实现对象,将lo_excel转换为xstring,然后再转换为solix_tab类型,最后调用cl_gui_frontend_services的gui_download方法导出excel。

示例2:

"使用worksheet的bind_alv方法
FORM export_excel_bind.
  DATA:t_sflight TYPE TABLE OF sflight.
  DATA:lo_salv TYPE REF TO  cl_salv_table.

  SELECT * INTO TABLE t_sflight FROM sflight UP TO 10 ROWS.
  TRY.
      cl_salv_table=>factory(
        EXPORTING
          list_display = abap_false
        IMPORTING
          r_salv_table = lo_salv
        CHANGING
          t_table      = t_sflight[] ).
    CATCH cx_salv_msg .
  ENDTRY.

  "调用显示alv
*  lo_salv->display( ).

  TRY .
      "将alv绑定到worksheet,
      "只是绑定,导出excel需要调用gui_download方法
      lo_worksheet->bind_alv(
          io_alv      = lo_salv
          it_table    = t_sflight
          i_top       = 2
          i_left      = 1
             ).
    CATCH zcx_excel.
  ENDTRY.

  "下载excel操作
  "zcl_excel_writer对象,实例化
  CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007.
  xdata = cl_writer->write_file( lo_excel ).
  t_rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring  = xdata ).

  "统计字节数
  bytecount = xstrlen( xdata ).
  "下载excel
  cl_gui_frontend_services=>gui_download(
    EXPORTING
       bin_filesize = bytecount
       filename     = 'D:/test.xlsx'
       filetype     = 'BIN'
    CHANGING
       data_tab     = t_rawdata
    ).
ENDFORM.

   

  使用zcl_excel_worksheet的bind_alv_ole2方法直接导出。

    1、通过get_globals_from_slvc_fullscr方法获取屏幕的alv对象;

    2、直接调用bind_alv_ole2方法,就可以将alv导出到excel。

示例3:

"通过worksheet的bind_alv_ole2方法,将alv导出
FORM export_excel_bind1.
  "屏幕alv对象
  DATA:lo_alv TYPE REF TO cl_gui_alv_grid.
  "excel header
  DATA:gt_listheader TYPE slis_t_listheader.
  DATA:wa_listheader LIKE LINE OF gt_listheader.
  "excel保存路径
  DATA:l_path TYPE string VALUE 'C:temp/test.xlsx'.

  "获取屏幕alv对象
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_alv.

  wa_listheader-typ = 'H'.
  wa_listheader-info = 'header line'.
  APPEND wa_listheader TO gt_listheader.
  wa_listheader-typ = 'S'.
  wa_listheader-info = 'second line'.
  APPEND wa_listheader TO gt_listheader.
  wa_listheader-typ = 'A'.
  wa_listheader-info = '地址信息'.
  APPEND wa_listheader TO gt_listheader.

  "调用lo_worksheet的bind_alv_ole2方法,直接调用下载
  lo_worksheet->bind_alv_ole2(
    EXPORTING
*      I_DOCUMENT_URL          = SPACE " excel template
*      I_XLS                   = 'X' " create in xls format?
      i_save_path             = l_path
      io_alv                  = lo_alv
      it_listheader           = gt_listheader
      i_top                   = 2
      i_left                  = 1
*      I_COLUMNS_HEADER        = 'X'
*      I_COLUMNS_AUTOFIT       = 'X'
*      I_FORMAT_COL_HEADER     =
*      I_FORMAT_SUBTOTAL       =
*      I_FORMAT_TOTAL          =
    EXCEPTIONS
      miss_guide              = 1
      ex_transfer_kkblo_error = 2
      fatal_error             = 3
      inv_data_range          = 4
      dim_mismatch_vkey       = 5
      dim_mismatch_sema       = 6
      error_in_sema           = 7
      OTHERS                  = 8
          ).
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

2.7excel上传

    通过zcl_excel_reader_2007类实例化对象cl_reader,调用load_file方法,获取zcl_excel类对象lo_excel。通过lo_excel获取worksheet,然后通过worksheet获取上传excel单元格内容,将单元格内容保存到内表。

示例:

"读取excel

FORM read_excel.

  "excel文档类对象

  DATA:lo_excel TYPE REF TO zcl_excel.

  "excel worksheet类对象

  DATA:lo_worksheet TYPE REF TO zcl_excel_worksheet.

  "异常类

  DATA:lf_cxexcel TYPE REF TO ZCX_EXCEL.

  "上传excel

  DATA:cl_reader TYPE REF TO zif_excel_reader.

  "excel导入内表

  DATA:BEGIN OF t_excel OCCURS 0,

      str1 TYPE string,

      str2 TYPE string,

      str3 TYPE string,

      str4 TYPE string,

      END OF t_excel.

  "读取行列数

  DATA:col_count TYPE I.

  DATA:row_count TYPE I.

  DATA:col TYPE I.

  DATA:row TYPE I.

  

  TRY.

      CREATE OBJECT lo_excel.

      "cl_reader对象

      CREATE OBJECT cl_reader TYPE zcl_excel_reader_2007.

      lo_excel = cl_reader->load_file( i_filename = 'D:\test.xlsx' ).

      lo_worksheet = lo_excel->get_active_worksheet( ).

 

      "获取行数,列数

      row_count = lo_worksheet->get_highest_row( ).

      col_count = lo_worksheet->get_highest_column( ).

 

      DO row_count TIMES.

        row = sy-index.

        CLEAR t_excel.

        DO col_count TIMES.

          col = sy-index.

          CASE col.

            WHEN 1.

              lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = t_excel-str1 ).

            WHEN 2.

              lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = t_excel-str2 ).

            WHEN 3.

              lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = t_excel-str3 ).

            WHEN 4.

              lo_worksheet->get_cell( EXPORTING ip_column = col ip_row = row IMPORTING ep_value = t_excel-str4 ).

          ENDCASE.

        ENDDO.

        APPEND t_excel.

      ENDDO.

 

      LOOP AT t_excel.

        WRITE:/ t_excel-str1,t_excel-str2,t_excel-str3,t_excel-str4.

      ENDLOOP.

    CATCH ZCX_EXCEL INTO lf_cxexcel.

      "获取错误信息

      DATA:result TYPE string.

      CALL METHOD lf_cxexcel->IF_MESSAGE~GET_TEXT

        RECEIVING

          result = result.

      MESSAGE result TYPE 'E'.

  ENDTRY.

ENDFORM.

3.设置workbook属性

    设置workbook保护,禁止编辑、新增worksheet。

示例:

"设置workbook级别protection,禁止编辑新建worksheet
FORM set_workbook.
  lo_excel->zif_excel_book_protection~protected = zif_excel_book_protection=>c_protected.
  lo_excel->zif_excel_book_protection~lockrevision = zif_excel_book_protection=>c_locked.
  lo_excel->zif_excel_book_protection~lockstructure = zif_excel_book_protection=>c_locked.
  lo_excel->zif_excel_book_protection~lockwindows = zif_excel_book_protection=>c_locked.
  lo_excel->zif_excel_book_protection~workbookpassword = zcl_excel_common=>encrypt_password( 'secret' ).
  lo_excel->zif_excel_book_protection~revisionspassword = zcl_excel_common=>encrypt_password( 'secret' ).
ENDFORM.

4.设置worksheet属性

    1、获取zcl_excel_worksheet类对象;

    通过zcl_excel对象调用add_new_worksheet方法创建类zcl_excel_worksheet实例对象lo_worksheet;

    通过lo_worksheet调用对应方法设置worksheet属性;

示例:

"设置worksheet
FORM set_worksheet.
  "sheet颜色
  DATA:ls_tabcolor TYPE ZEXCEL_S_TABCOLOR.

  "打印头和脚
  DATA:ls_header  TYPE zexcel_s_worksheet_head_foot.
  DATA:ls_footer  TYPE zexcel_s_worksheet_head_foot.

  "設置自動列寬
  "列选择对象
  DATA:lo_column_dimension TYPE REF TO zcl_excel_worksheet_columndime.

  TRY .
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'sheet2' ).
      lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected.
      "设置sheet标签颜色
      ls_tabcolor-rgb = zcl_excel_style_color=>c_blue.
      lo_worksheet->set_tabcolor( iv_tabcolor = ls_tabcolor ).
      "设置sheet隐藏
*      lo_worksheet->zif_excel_sheet_properties~hidden = zif_excel_sheet_properties=>c_hidden.
      "设置隐藏0
      lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_value = 'C2隐藏0:' ).
      lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_value = 0 ).
      lo_worksheet->zif_excel_sheet_properties~show_zeros  = zif_excel_sheet_properties=>c_hidezero.

      "sheet打印设置,printing settings
      lo_worksheet->sheet_setup->set_page_margins( ip_header = '1' ip_footer = '1' ip_unit = 'cm' ).
      lo_worksheet->sheet_setup->black_and_white   = 'X'.
      lo_worksheet->sheet_setup->fit_to_page       = 'X'.  " you should turn this on to activate fit_to_height and fit_to_width
      lo_worksheet->sheet_setup->fit_to_height     = 0.    " used only if ip_fit_to_page = 'X'
      lo_worksheet->sheet_setup->fit_to_width      = 2.    " used only if ip_fit_to_page = 'X'
      lo_worksheet->sheet_setup->orientation       = zcl_excel_sheet_setup=>c_orientation_landscape.
      lo_worksheet->sheet_setup->page_order        = zcl_excel_sheet_setup=>c_ord_downthenover.
      lo_worksheet->sheet_setup->paper_size        = zcl_excel_sheet_setup=>c_papersize_a4.
      lo_worksheet->sheet_setup->scale             = 80.   " used only if ip_fit_to_page = SPACE
      "设置打印头和脚
      " Header and Footer
      ls_header-right_value = 'print date &D'.
      ls_header-right_font-size = 8.
      ls_header-right_font-name = zcl_excel_style_font=>c_name_arial.
      ls_footer-left_value = '&Z&F'. "Path / Filename
      ls_footer-left_font = ls_header-right_font.
      ls_footer-right_value = 'page &P of &N'. "page x of y
      ls_footer-right_font = ls_header-right_font.
      lo_worksheet->sheet_setup->set_header_footer( ip_odd_header  = ls_header
                                                    ip_odd_footer  = ls_footer ).

      "设置隐藏列
      lo_worksheet->zif_excel_sheet_properties~hide_columns_from = 'M'.

      "设置行收缩展开,lv_collapsed:true收缩,false展开
      lo_worksheet->set_row_outline( iv_row_from = 10
                               iv_row_to   = 16
                               iv_collapsed = abap_true ).  " collapsed

      "设置sheet保护
      DATA:lo_style TYPE REF TO zcl_excel_style.
      DATA:lv_style_guid TYPE zexcel_cell_style.

      lo_worksheet->zif_excel_sheet_protection~protected  = zif_excel_sheet_protection=>c_protected.
      "设置密码加密
      lo_worksheet->zif_excel_sheet_protection~password   = zcl_excel_common=>encrypt_password( 'secret' ).
      lo_worksheet->zif_excel_sheet_protection~sheet      = zif_excel_sheet_protection=>c_active.
      lo_worksheet->zif_excel_sheet_protection~objects    = zif_excel_sheet_protection=>c_active.
      lo_worksheet->zif_excel_sheet_protection~scenarios  = zif_excel_sheet_protection=>c_active.

      lo_style = lo_excel->add_new_style( ).
      "设置unlocked锁住样式
      lo_style->protection->locked = zcl_excel_style_protection=>c_protection_unlocked.
      lv_style_guid = lo_style->get_guid( ).
      "设置可编辑
      lo_worksheet->set_cell( ip_column = 'E' ip_row = 2 ip_value = 'unlocked' ip_style = lv_style_guid ).

      "设置单元格尺寸
      lo_worksheet->zif_excel_sheet_properties~zoomscale = 150.
*      lo_worksheet->zif_excel_sheet_properties~zoomscale_normal = 150.
*      lo_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = 150.
*      lo_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = 150.

      "设置是否显示打印sheet网格线
      lo_worksheet->set_show_gridlines(  i_show_gridlines  = abap_false ).
      lo_worksheet->set_print_gridlines( i_print_gridlines = abap_false ).

      "設置自動列寬
      "列选择
      lo_column_dimension = lo_worksheet->get_column_dimension( ip_column = 'E' ).
      "设置自动列宽
      lo_column_dimension->set_auto_size( ip_auto_size = abap_true ).

    CATCH ZCX_EXCEL.

  ENDTRY.
ENDFORM.

 

   2. 获取设置当前活动worksheet,特别注意操作多个worksheet时,当前哪个worksheet处于活动状态。

示例:

"设置获取active worksheet
FORM set_active_sheet.
  "当创建lo_excle->add_new_worksheet(),当前创建worksheet处于active状态
  "get_active_sheet_index()方法,获取活动worksheet的index
  "get_active_worksheet()方法,获取活动worksheet
  "set_active_sheet_index()方法,通过index设置活动worksheet
  "set_active_sheet_index_by_name()方法,
ENDFORM.

5.设置单元格样式

    设置单元格样式:主要是zcl_excel_style类,使用zexcel_cell_style数据类型保存guid。

    1、通过excel对象lo_excel调用add_new_style,创建zcl_excel_style类对象;

    2、通过zcl_excel_style对象属性font,fill,borders,alignment,number_format等,设置显示style;

    3、通过zcl_excel_style对象的get_guid方法获取style对应的guid;

    4、zcl_excel_worksheet类lo_worksheet的set_cell方法输入参数ip_style等于对应获取的guid;

示例:

"设置单元格样式
FORM set_style.
  "style类
  DATA:lo_style TYPE REF TO zcl_excel_style.
  "style的guid
  DATA:lv_style_guid TYPE zexcel_cell_style.TRY.
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'sheet3' ).
    CATCH ZCX_EXCEL.
  ENDTRY.

  "字体设置,类:zcl_excel_style_font
  "创建一个新style
  lo_style = lo_excel->add_new_style( ).
  "加粗
  lo_style->font->bold   = abap_true.
  "斜体
  lo_style->font->italic = abap_true.
  "下划线
  lo_style->font->underline = abap_true.
  "下划线mode,单下划线双下划线
  lo_style->font->underline_mode = zcl_excel_style_font=>c_underline_double.
  "字体family,C_FAMILY_XXX
  lo_style->font->family = zcl_excel_style_font=>c_family_roman.
  "字体名:c_name_XXX,直接设置字体名:'YouYuan'
*  lo_style->font->name   = zcl_excel_style_font=>c_name_arial.
  lo_style->font->name   = 'YouYuan'.
  "字体主题:C_SCHEME_XXX
 "注意:设置多个样式类型时,会出现STYLE1设置FONT字体,STYLE2设置FONT字体无效
"注意都要有FONT->SCHEME,当STYLE2 or 3 没有设置SCHEME时,设置FONT失效
lo_style->font->scheme = zcl_excel_style_font=>c_scheme_none. "字体颜色,使用CSS颜色值:后面六位,前两位默认FF * lo_style->font->color-rgb = zcl_excel_style_color=>c_red. lo_style->font->color-rgb = 'FF66FFCC'. "自定义color,设置红绿蓝;create_new_argb方法和create_new_argb_int方法,返回zecel_style_color_argb类型 * zcl_excel_style_color=>create_new_argb( ip_red = 'FF' ip_green = '00' ip_blu = '00' ). "颜色对应结构体ZEXCEL_S_STYLE_COLOR * zexcel_s_style_color-rgb对应:ZEXCEL_STYLE_COLOR_ARGB类型 * zexcel_s_style_color-indexed 对应:ZEXCEL_STYLE_COLOR_INDEXED类型 * zexcel_s_style_color-theme 对应:ZEXCEL_STYLE_COLOR_THEME类型 * zexcel_s_style_color-tint 对应:ZEXCEL_STYLE_COLOR_TINT类型 "字体大小 lo_style->font->size = 11. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 1 ip_style = lv_style_guid ip_value = 'style样式字体' ). CATCH ZCX_EXCEL. ENDTRY.
"fill设置,类:zcl_excel_style_fill "创建一个新style lo_style = lo_excel->add_new_style( ). "填充类型 lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. "前景色 lo_style->fill->fgcolor-rgb = 'FF66FFCC'. "背景色 lo_style->fill->bgcolor-rgb = 'FF000022'. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 2 ip_style = lv_style_guid ip_value = 'style样式fill' ). CATCH ZCX_EXCEL. ENDTRY.
"设置边框,类:zcl_excel_style_borders
"border类 DATA:lo_border TYPE REF TO zcl_excel_style_border.
"创建一个新style lo_style = lo_excel->add_new_style( ). "创建border对象 CREATE OBJECT lo_border. "设置border样式 lo_border->border_style = zcl_excel_style_border=>c_border_dashdot. lo_border->border_color-rgb = 'FFCC0066'. "设置所有border lo_style->borders->allborders = lo_border. "通过down,left,right,top设置单独边框 * lo_style->borders->down = lo_border. "设置单元格中交叉线 * lo_style->borders->diagonal = lo_border. * lo_style->borders->diagonal_mode = zcl_excel_style_borders=>c_diagonal_both. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_style = lv_style_guid ip_value = 'style样式border' ). CATCH ZCX_EXCEL. ENDTRY. "设置alignment,类:zcl_excel_style_alignment "创建一个新style lo_style = lo_excel->add_new_style( ). "设置水平方向,c_horizontal_xxxx:居中center,靠左left,靠右right,默认general lo_style->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_left. "设置竖直方向,c_vertical_xxxx:顶部top,底部bottom,中间center,排齐justify lo_style->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. "设置文本旋转 lo_style->alignment->textrotation = 0. "设置缩小适应 lo_style->alignment->shrinktofit = abap_true. "设置缩进字符 lo_style->alignment->indent = 2. "换行 lo_style->alignment->wraptext = abap_true. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 4 ip_style = lv_style_guid ip_value = 'style样式alignment' ) CATCH ZCX_EXCEL. ENDTRY.
"设置number_format格式,类:zcl_excel_style_number_format "创建一个新style lo_style = lo_excel->add_new_style( ). "日期格式 lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_date_ddmmyyyy. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 5 ip_style = lv_style_guid ip_value = sy-datum ). CATCH ZCX_EXCEL. ENDTRY. "创建一个新style lo_style = lo_excel->add_new_style( ). "文本格式 lo_style->number_format->format_code = zcl_excel_style_number_format=>c_format_text. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_style = lv_style_guid ip_value = '01234' ). CATCH ZCX_EXCEL. ENDTRY. "设置保护protection,类:zcl_excel_style_protection "创建一个新style lo_style = lo_excel->add_new_style( ). "是否隐藏?? * lo_style->protection->hidden = zcl_excel_style_protection=>c_protection_hidden. "是否锁住?? lo_style->protection->locked = '1'. "获取style的编码uuid lv_style_guid = lo_style->get_guid( ). TRY . "设置style lo_worksheet->set_cell( ip_column = 'C' ip_row = 7 ip_style = lv_style_guid ip_value = 'style样式protection' ). CATCH ZCX_EXCEL. ENDTRY. ENDFORM.

注意:

zcl_excel_style_number_format类中有预定义的格式类型,当都不满足需求时,可以直接根据定义的字符格式规则,设定需要的格式。

微软文档链接:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2014/ee634206(v=sql.120)?redirectedfrom=MSDN

示例:这里发现当Red后面括号里面内容和括号直接需要空格隔开,不然括号出不来。显示效果负数变成红色括号括起来

  lo_style->number_format->format_code = '$#,##0.00_);[Red]( $#,##0.00 )'.

格式规范

说明

显示不带格式的数字。

0(零字符)

数字占位符。 显示一个数字或一个零。 如果表达式在格式字符串中出现零的位置有一个数字,则显示该数字,否则在该位置显示一个零。

如果数字的位数少于格式表达式中零的个数(不管在小数点的哪一侧),将显示前导零或尾随零。 如果小数点分隔符右侧的数字位数多于格式表达式中小数点分隔符右侧的零的个数,将对数字四舍五入,使其小数位数与零的个数一样多。 如果小数点分隔符左侧的数字位数多于格式表达式中小数点分隔符左侧的零的个数,则将显示多出的位数而不作任何修改。

#

数字占位符。 显示一个数字或不显示任何内容。 如果表达式在格式字符串中出现 # 字符的位置有一个数字,则显示该数字,否则该位置什么也不显示。

除了当数字的位数少于格式表达式中小数点分隔符任意一侧的 # 字符数时不显示前导零或尾随零外,该符号的作用类似于零 (0) 数字占位符。

.(圆点字符)

小数点占位符。 小数点占位符确定在小数点分隔符左侧和右侧显示几位数。 如果格式表达式中该符号的左侧只包含 # 字符,则小于 1 的数字以小数点分隔符开头。 若要显示随小数显示的前导零,请使用零作为小数点分隔符左侧的第一个数字占位符。 在某些区域设置中,用逗号作为小数点分隔符。 在格式化输出中用作小数点占位符的实际字符取决于系统所识别的数字格式。 因此,在您的格式中应将句点用作小数点占位符,即使您位于使用逗号作为小数点占位符的区域设置中。 格式化字符串将以适合区域设置的正确格式显示。

%

百分比占位符。 将表达式乘以 100。 在格式字符串中出现百分比字符的位置插入百分比字符 (%)。

,(逗号字符)

千位分隔符。 千位分隔符将在小数点分隔符左侧具有四位或更多位数的数字中的千位和百位分隔开。 如果格式包含一个由数字占位符(0 或 #)包围的千位分隔符,则指定千位分隔符的标准用法。

一个千位分隔符紧挨小数点分隔符的左侧(无论是否指定小数)或者作为字符串中最右侧的字符表示“通过除以 1000 来将数字按比例减小,并按需要四舍五入”。小于 1,000 但大于或等于 500 的数字显示为 1,小于 500 的数字显示为 0。 此位置有两个相邻千位分隔符表示按一百万倍的比例因子缩小,并且每增加一个分隔符表示另外缩小 1,000 倍。

多个分隔符出现在紧挨小数点分隔符左侧或字符串最右侧位置被视为指定使用千位分隔符。 在某些区域设置中,用句点作为千位分隔符。 在格式化输出中用作千位分隔符的实际字符取决于您的系统所识别的数字格式。 因此,在您的格式中应将逗号用作千位分隔符,即使您位于使用句点作为千位分隔符的区域设置中。 格式化字符串将以适合区域设置的正确格式显示。

例如,考虑以下三个格式字符串:

“#,0.”,该字符串使用千位分隔符将数字一亿的格式设置为字符串“100,000,000”。

“#0,.”,该字符串按 1000 的因子进行缩小,将数字一亿的格式设置为字符串“100000”。

“#,0,.”该字符串使用千位分隔符和按 1000 的因子进行缩小,将数字一亿的格式设置为字符串“100,000”。

:(冒号字符)

时间分隔符。 在某些区域设置中,可能用其他字符表示时间分隔符。 在设置时间值的格式时,时间分隔符用于分隔小时、分钟和秒。 在格式化输出中用作时间分隔符的实际字符取决于您的系统设置。

/(正斜杠字符)

日期分隔符。 在某些区域设置中,可能用其他字符表示日期分隔符。 在设置日期值的格式时,日期分隔符用于分隔年、月和日。 在格式化输出中用作日期分隔符的实际字符取决于您的系统设置。

E-E+e-e+

科学记数法格式。 如果格式表达式在 E-、E+、e- 或 e+ 的左侧至少包含一个数字占位符(0 或 #),则以科学记数法格式显示数字,并在数字与其指数之间插入 E 或 e。 左侧的数字占位符的个数决定了指数中的数字个数。 使用 E- 或 e- 可在负指数的后面放置一个减号。 使用 E+ 或 e+ 可在负指数的后面放置一个减号,在正指数的后面放置一个加号。 还必须在该符号右侧包括数字占位符以获取正确的格式。

- + $ ( )

文字字符。 这些字符将完全按格式字符串中所键入的形式显示。 若要显示所列字符以外的其他字符,请在该字符前加上一个反斜杠 (\) 或将该字符放在双引号 (" ") 中。

\(反斜杠字符)

显示格式字符串中的下一个字符。 若要将具有特殊含义的字符显示为文字字符,请在该字符前加上一个反斜杠 (\)。 反斜杠本身不显示。 使用反斜杠与将下一个字符放在双引号中的作用是相同的。 若要显示反斜杠,请使用两个反斜杠 (\\)。

不能显示为文字字符的字符示例为日期格式字符和时间格式字符(a、c、d、h、m、n、p、q、s、t、w、y、/ 和 :)、数字格式字符(#、0、%、E、e、逗号和句点)和字符串格式字符(@、&、<、> 和 !)。

"ABC"

显示双引号 (" ") 里面的字符串。 若要将字符串包含在代码内的样式参数中,必须将文本放在 Chr (34) 之间(34 为引号 (") 的字符代码)。

 

微软文档链接:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2014/ee634398(v=sql.120)

 

日期格式相关说明:

 

格式规范

说明

(:)

时间分隔符。 在某些区域设置中,可能用其他字符表示时间分隔符。 在设置时间值的格式时,时间分隔符用于分隔小时、分钟和秒。 在格式化输出中用作时间分隔符的实际字符取决于您应用程序的当前区域性值。

(/)

日期分隔符。 在某些区域设置中,可能用其他字符表示日期分隔符。 在设置日期值的格式时,日期分隔符用于分隔年、月和日。 在格式化输出中用作日期分隔符的实际字符取决于您应用程序的当前区域性。

(%)

用于指示应以单个字母格式读取后面的字符,而不考虑任何尾随字母。 此外,还用于指示以用户定义的格式读取单个字母格式。 有关其他详细信息,请参阅以下内容。

d

将天显示为不带前导零的数字(例如,1)。 如果这是用户定义的数字格式中的唯一字符,则使用 %d。

dd

将天显示为带一个前导零的数字(例如,01)。

ddd

将天显示为缩写(例如,Sun)。

dddd

将天显示为全名(例如,Sunday)。

M

将月显示为不带前导零的数字(例如,一月表示为 1)。 如果这是用户定义的数字格式中的唯一字符,则使用 %M。

MM

将月显示为带一个前导零的数字(例如,01/12/01)。

MMM

将月显示为缩写(例如,Jan)。

MMMM

将月显示为完整的月份名称(例如,January)。

gg

显示时期/时代字符串(例如,A.D.)。

h

使用 12 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15 PM)。 如果这是用户定义的数字格式中的唯一字符,则使用 %h。

hh

使用 12 小时制时钟将小时显示为带前导零的数字(例如,01:15:15 PM)。

H

使用 24 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15)。 如果这是用户定义的数字格式中的唯一字符,则使用 %H。

HH

使用 24 小时制时钟将小时显示为带前导零的数字(例如,01:15:15)。

m

将分钟显示为不带前导零的数字(例如,12:1:15)。 如果这是用户定义的数字格式中的唯一字符,则使用 %m。

mm

将分钟显示为带前导零的数字(例如,12:01:15)。

s

将秒显示为不带前导零的数字(例如,12:15:5)。 如果这是用户定义的数字格式中的唯一字符,则使用 %s。

ss

将秒显示为带前导零的数字(例如,12:15:05)。

f

显示秒的小数部分。 例如,ff 显示百分之一秒,而 ffff 显示万分之一秒。 在用户定义的格式中最多可以使用 7 个 f 符号。 如果这是用户定义的数字格式中的唯一字符,则使用 %f。

t

使用 12 小时制时钟,对于中午之前的任何小时都显示大写字母 A;对于中午与 11:59 P.M 之间的任何小时都显示大写字母 P。 如果这是用户定义的数字格式中的唯一字符,则使用 %t。

tt

对于使用 12 小时制时钟的区域设置,对中午之前的任何小时都显示大写字母 AM;对于中午与 11:59 P.M 之间的任何小时都显示 PM。

对于使用 24 小时制时钟的区域设置,不显示任何内容。

y

将年显示为不带前导零的数字 (0-9)。 如果这是用户定义的数字格式中的唯一字符,则使用 %y。

yy

以带一个前导零的两位数字格式显示年(如果适用)。

yyy

以四位数字格式显示年。

yyyy

以四位数字格式显示年。

z

显示不带前导零的时区偏移量(例如,-8)。 如果这是用户定义的数字格式中的唯一字符,则使用 %z。

zz

显示带一个前导零的时区偏移量(例如,-08)

zzz

显示完整的时区偏移量(例如,-08:00)

 

 

设置单元格对应数据ABAP类型。

示例:

"设置单元格对应ABAP数据类型
FORM set_typedesc.
  TRY.
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'sheet6' ).
      "设置type desc
      "cl_abap_typedescr=>typekind_string,
      "cl_abap_typedescr=>typekind_packed,
      "cl_abap_typedescr=>typekind_num,
      "cl_abap_typedescr=>typekind_date,
      lo_worksheet->set_cell(
        ip_column = 'C'
        ip_row = 1
        ip_abap_type = cl_abap_typedescr=>typekind_string
        ip_value = 'string' ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

6.显示内表到excel

    通过worksheet的bind_table方法将一个内表显示到sheet中

示例:

"展示一个内表到excel
FORM show_itab.
  "内表定义
  DATA:t_sflight LIKE TABLE OF sflight.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE t_sflight FROM sflight WHERE CARRID = 'AA'.

  "excel内表设置
  DATA: ls_table_settings TYPE zexcel_s_table_settings.
  "excel内表显示栏位,样式
  DATA: lt_field_catalog TYPE zexcel_t_fieldcatalog.
  "指针
  FIELD-SYMBOLS:<fs_catalog> TYPE zexcel_s_fieldcatalog.

  TRY .
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      "设置sheet标题
      lo_worksheet->set_title( ip_title = 'itab' ).
      "设置内表样式
      ls_table_settings-table_name = 'itab'.
      ls_table_settings-table_style = zcl_excel_table=>builtinstyle_medium2.
      "设置内表起始列和行
      ls_table_settings-top_left_column = 'B'.
      ls_table_settings-top_left_row = 2.
*      ls_table_settings-bottom_right_column = 'F'.
*      ls_table_settings-bottom_right_row = 8.
      "行条纹
      ls_table_settings-show_row_stripes  = abap_false.
      "列条纹
      ls_table_settings-show_column_stripes  = abap_true.
      "无过滤器
      ls_table_settings-nofilters = abap_true.

      "iconset
      DATA: ls_iconset TYPE zexcel_conditional_iconset.
      "条件格式
      DATA: lo_style_conditional   TYPE REF TO zcl_excel_style_conditional.
      "设置显示图标类型c_iconset_XXXX,不同图标
      ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_5rating.
      "iconset_数字,数字是几设置几个cfvo,显示不同图标区间
      ls_iconset-cfvo1_type  = zcl_excel_style_conditional=>c_cfvo_type_percent.
      ls_iconset-cfvo1_value = '0'.
      ls_iconset-cfvo2_type  = zcl_excel_style_conditional=>c_cfvo_type_percent.
      ls_iconset-cfvo2_value = '20'.
      ls_iconset-cfvo3_type  = zcl_excel_style_conditional=>c_cfvo_type_percent.
      ls_iconset-cfvo3_value = '30'.
      ls_iconset-cfvo4_type  = zcl_excel_style_conditional=>c_cfvo_type_percent.
      ls_iconset-cfvo4_value = '40'.
      ls_iconset-cfvo5_type  = zcl_excel_style_conditional=>c_cfvo_type_percent.
      ls_iconset-cfvo5_value = '50'.

      "条件设置
      lo_style_conditional = lo_worksheet->add_new_conditional_style( ).
      "规则
      lo_style_conditional->rule  = zcl_excel_style_conditional=>c_rule_iconset.
      "优先级
      lo_style_conditional->priority = 1.
      lo_style_conditional->mode_iconset  = ls_iconset.
      "是否同时显示单元格值
      ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true.

      "获取内表字段
      lt_field_catalog = zcl_excel_common=>get_fieldcatalog( ip_table = t_sflight ).
      "设置field catalog
      "zexcel_s_fieldcatalog字段解析
      "position:字段显示位置
      "dynpfld:字段是否显示,true显示,false隐藏
      "abap_type:字段对应ABAP类型
      "cond_style:可以添加zcl_excel_style_conditional,图标显示
      "totals_function:该列添加统计行,统计类型,
      "TOTALS_FUNCTION_AVERAGE:平均值
      "TOTALS_FUNCTION_COUNT:统计记录数
      "TOTALS_FUNCTION_MAX:最大值
      "TOTALS_FUNCTION_MIN:最小值
      "TOTALS_FUNCTION_SUM:合计
      LOOP AT lt_field_catalog ASSIGNING <fs_catalog>.
        CASE <fs_catalog>-fieldname.
          WHEN 'CARRID'.
            <fs_catalog>-position = 1.
            <fs_catalog>-dynpfld = abap_true.
          WHEN 'CONNID'.
            <fs_catalog>-position = 2.
            <fs_catalog>-dynpfld = abap_true.
            <fs_catalog>-abap_type = cl_abap_typedescr=>typekind_int.
          WHEN 'FLDATE'.
            <fs_catalog>-position = 3.
            <fs_catalog>-dynpfld = abap_true.
            <fs_catalog>-totals_function = zcl_excel_table=>totals_function_count.
          WHEN 'PRICE'.
            <fs_catalog>-position = 4.
            <fs_catalog>-dynpfld = abap_true.
            <fs_catalog>-cond_style = lo_style_conditional.
            <fs_catalog>-totals_function = zcl_excel_table=>totals_function_sum.
          WHEN OTHERS.
            <fs_catalog>-dynpfld = abap_false.
        ENDCASE.
      ENDLOOP.

      "设置内表和worksheet绑定
      lo_worksheet->bind_table(
        ip_table = t_sflight
        is_table_settings = ls_table_settings
        it_field_catalog  = lt_field_catalog
        ).
      "设置固定行
      lo_worksheet->freeze_panes( ip_num_rows = 3 ).
 
      "设置活动的lo_worksheet,从1开始,
      "使用set_active_sheet_index_by_name方法,通过sheet名设置active sheet
      lo_excel->set_active_sheet_index( 1 ).
    CATCH ZCX_EXCEL INTO lf_cxexcel.
      "获取错误信息
      DATA:result TYPE String.
      CALL METHOD lf_cxexcel->IF_MESSAGE~GET_TEXT
        RECEIVING
          result = result.
      MESSAGE result TYPE 'E'.
  ENDTRY.
ENDFORM.

7.condition图标显示

  通过zcl_excel_style_conditional类,显示不同图标。

示例:

"图标显示
FORM conditional_format.
  "条件格式
  DATA: lo_style_conditional   TYPE REF TO zcl_excel_style_conditional.
  TRY.
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'sheet4' ).

"iconset DATA: ls_iconset TYPE zexcel_conditional_iconset. "设置显示图标类型c_iconset_XXXX,不同图标 ls_iconset-iconset = zcl_excel_style_conditional=>c_iconset_3trafficlights2. "iconset_数字,数字是几设置几个cfvo,显示不同图标区间 ls_iconset-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_percent. ls_iconset-cfvo1_value = '0'. ls_iconset-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percent. ls_iconset-cfvo2_value = '33'. ls_iconset-cfvo3_type = zcl_excel_style_conditional=>c_cfvo_type_percent. ls_iconset-cfvo3_value = '66'. "是否同时显示单元格值 ls_iconset-showvalue = zcl_excel_style_conditional=>c_showvalue_true. "条件设置 lo_style_conditional = lo_worksheet->add_new_conditional_style( ). "规则 lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_iconset. "优先级 lo_style_conditional->priority = 1. lo_style_conditional->mode_iconset = ls_iconset. "设置范围range lo_style_conditional->set_range( ip_start_column = 'C' ip_start_row = 4 ip_stop_column = 'C' ip_stop_row = 8 ). lo_worksheet->set_cell( ip_row = 4 ip_column = 'C' ip_value = 100 ). lo_worksheet->set_cell( ip_row = 5 ip_column = 'C' ip_value = 1000 ). lo_worksheet->set_cell( ip_row = 6 ip_column = 'C' ip_value = 150 ). lo_worksheet->set_cell( ip_row = 7 ip_column = 'C' ip_value = 10 ). lo_worksheet->set_cell( ip_row = 8 ip_column = 'C' ip_value = 500 ).
"databar DATA:ls_databar TYPE zexcel_conditional_databar. ls_databar-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. ls_databar-cfvo1_value = '0'. ls_databar-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_max. ls_databar-cfvo2_value = '0'. ls_databar-colorrgb = 'FF638EC6'. "条件设置 lo_style_conditional = lo_worksheet->add_new_conditional_style( ). "规则 lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_databar. "优先级 lo_style_conditional->priority = 1. lo_style_conditional->mode_databar = ls_databar. "设置范围range lo_style_conditional->set_range( ip_start_column = 'D' ip_start_row = 4 ip_stop_column = 'D' ip_stop_row = 8 ). lo_worksheet->set_cell( ip_row = 4 ip_column = 'D' ip_value = 100 ). lo_worksheet->set_cell( ip_row = 5 ip_column = 'D' ip_value = 200 ). lo_worksheet->set_cell( ip_row = 6 ip_column = 'D' ip_value = 300 ). lo_worksheet->set_cell( ip_row = 7 ip_column = 'D' ip_value = 400 ). lo_worksheet->set_cell( ip_row = 8 ip_column = 'D' ip_value = 500 ). "colorscale DATA:ls_colorscale TYPE zexcel_conditional_colorscale. ls_colorscale-cfvo1_type = zcl_excel_style_conditional=>c_cfvo_type_min. ls_colorscale-cfvo1_value = 0. ls_colorscale-cfvo2_type = zcl_excel_style_conditional=>c_cfvo_type_percentile. ls_colorscale-cfvo2_value = '50'. ls_colorscale-colorrgb1 = 'FFF8696B'. ls_colorscale-colorrgb2 = 'FF63BE7B'. "条件设置 lo_style_conditional = lo_worksheet->add_new_conditional_style( ). "规则 lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_colorscale. "优先级 lo_style_conditional->priority = 1. lo_style_conditional->mode_colorscale = ls_colorscale. "设置范围range lo_style_conditional->set_range( ip_start_column = 'E' ip_start_row = 4 ip_stop_column = 'E' ip_stop_row = 8 ). lo_worksheet->set_cell( ip_row = 4 ip_column = 'E' ip_value = 10 ). lo_worksheet->set_cell( ip_row = 5 ip_column = 'E' ip_value = 20 ). lo_worksheet->set_cell( ip_row = 6 ip_column = 'E' ip_value = 30 ). lo_worksheet->set_cell( ip_row = 7 ip_column = 'E' ip_value = 40 ). lo_worksheet->set_cell( ip_row = 8 ip_column = 'E' ip_value = 50 ). "cellis "根据条件,设置单元格样式 DATA:lo_style TYPE REF TO zcl_excel_style. DATA:lv_style_guid TYPE zexcel_cell_style. DATA:ls_cellis TYPE zexcel_conditional_cellis. lo_style = lo_excel->add_new_style( ). lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid. lo_style->fill->bgcolor-rgb = 'FF00CCFF'. lv_style_guid = lo_style->get_guid( ).
    "条件设置 lo_style_conditional
= lo_worksheet->add_new_conditional_style( ). lo_style_conditional->rule = zcl_excel_style_conditional=>c_rule_cellis. ls_cellis-formula = '"hello"'. ls_cellis-operator = zcl_excel_style_conditional=>c_operator_equal. ls_cellis-cell_style = lv_style_guid. lo_style_conditional->mode_cellis = ls_cellis. lo_style_conditional->priority = 1. lo_style_conditional->set_range( ip_start_column = 'G' ip_start_row = 2 ip_stop_column = 'G' ip_stop_row = 2 ). lo_worksheet->set_cell( ip_row = 1 ip_column = 'G' ip_value = 'G2输入hello显示样式:' ). CATCH ZCX_EXCEL. ENDTRY. ENDFORM.

8.设置单元格公式

    设置单元格公式:通过set_cell方法的ip_formula参数设置;

示例:

"formula,公式
FORM set_formula.
  TRY .
      lo_excel->set_active_sheet_index_by_name( 'sheet4' ).
      "获取worksheet,通过sheet名
      lo_worksheet = lo_excel->get_worksheet_by_name( 'sheet4' ).
      lo_worksheet->set_cell( ip_row = 9 ip_column = 'C' ip_value = '求和:' ).
      lo_worksheet->set_cell( ip_row = 10 ip_column = 'C' ip_formula = 'SUM(C4:C5)' ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

批量设置多个单元格公式:

    使用zcl_excel_commom的shift_formula方法批量获取动态公式。

示例:

"通过循环获取动态公式
      DO 2 TIMES.
        "获取转换的公式
        lv_formula = zcl_excel_common=>shift_formula( 
          iv_reference_formula = 'SUM(C4:C5)'
          iv_shift_cols        = 0    
          iv_shift_rows        = sy-index ). 
        lv_row = 10 + sy-index.  " Absolute row = sy-index rows below reference cell
        lo_worksheet->set_cell( ip_row = lv_row ip_column = 'C' ip_formula = lv_formula ).
      ENDDO.

9.定义range区域

    定义一个range区域,相当于Excel选择区域,进行批量单元格设置。

示例:

"range获取
FORM set_range.
  "range
  DATA:lo_range TYPE REF TO zcl_excel_range.
  "sheet名
  DATA: lv_title TYPE zexcel_sheet_title VALUE 'sheet4'.
  lo_range = lo_excel->add_new_range( ).
  lo_range->name = 'range'.

  "A4A5区域
  lo_range->set_value( ip_sheet_name    = lv_title
                       ip_start_column  = 'A'
                       ip_start_row     = 4
                       ip_stop_column   = 'A'
                       ip_stop_row      = 5 ).
ENDFORM.

10.通用zcl_excel_common类

    通用方法类zcl_excel_common,提供一些通用方法使用。

示例:

"ZCL_EXCEL_COMMON类
FORM common_excel.
  "ZCL_EXCEL_COMMON类提供一些通用方法
  "CONVERT_COLUMN2ALPHA:将列号转换对应字母
  "DATE_TO_EXCEL_STRING:将日期转换为string类型对应数字字符串
  "ENCRYPT_PASSWORD:加密密码字符串
  "EXCEL_STRING_TO_DATE:将日期数字字符串转换为日期
  "SHIFT_FORMULA:移动应用单元格公式
ENDFORM.

11.设置单元格验证

  1.通过zcl_excel_worksheet类对象lo_worksheet的add_new_worksheet方法获取zcl_excel_data_validation类;  

  2.通过zcl_excel_data_validation类设置验证规则;

示例:

"单元格验证
FORM set_validation.
  "range
  DATA:lo_range TYPE REF TO zcl_excel_range.
  "data validation验证规则
  DATA:lo_data_validation TYPE REF TO zcl_excel_data_validation.

  TRY.
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'data validation' ).
      "设置下拉选择值
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value = '苹果' ).
      lo_worksheet->set_cell( ip_row = 2 ip_column = 'A' ip_value = '梨子' ).
      lo_worksheet->set_cell( ip_row = 3 ip_column = 'A' ip_value = '香蕉' ).
      "创建新range
      lo_range = lo_worksheet->add_new_range( ).
      lo_range->name = 'fruit'.
      "ip_sheet_name设置range数据所在sheet,设置range范围
      lo_range->set_value(
       ip_sheet_name = 'data validation'
       ip_start_column = 'A'
       ip_start_row = '1'
       ip_stop_column = 'A'
       ip_stop_row = '3'
       ).

      "创建验证规则
      lo_data_validation = lo_worksheet->add_new_data_validation( ).
      "验证类型:下拉选择框
      lo_data_validation->type = zcl_excel_data_validation=>c_type_list.
      lo_data_validation->formula1 = 'fruit'.
      "规则所在单元格
      lo_data_validation->cell_row = 4.
      lo_data_validation->cell_column = 'A'.
      lo_worksheet->set_cell( ip_row = 4 ip_column = 'A' ip_value = 'Select a value' ).

      "创建验证规则
      lo_data_validation = lo_worksheet->add_new_data_validation( ).
      "验证类型:文本长度
      lo_data_validation->type = zcl_excel_data_validation=>c_type_textlength.
      "操作符:小于等于
      lo_data_validation->operator = zcl_excel_data_validation=>c_operator_lessthanorequal.
      "公式
      lo_data_validation->formula1 = 10.
      "规则所在单元格
      lo_data_validation->cell_row = 2.
      lo_data_validation->cell_column = 'B'.
      "规则区域
*      lo_data_validation->cell_row_to = 3.
*      lo_data_validation->cell_column = 'D'.
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'B' ip_value = 'text长度小于10:' ).

      "创建验证规则
      lo_data_validation = lo_worksheet->add_new_data_validation( ).
      "验证类型:
      lo_data_validation->type = zcl_excel_data_validation=>c_type_whole.
      "操作符:between
      lo_data_validation->operator    = zcl_excel_data_validation=>c_operator_between.
      "范围
      lo_data_validation->formula1    = 1.
      lo_data_validation->formula2    = 10.
      "选择单元格,弹出提示信息
      lo_data_validation->prompttitle = 'Range'.
      lo_data_validation->prompt      = 'Enter a value between 1 and 10'.
      "错误弹窗,显示错误信息
      lo_data_validation->errortitle  = 'Error'.
      lo_data_validation->error       = 'You have entered a wrong value. Please use only numbers between 1 and 10.'.
      "规则生效单元格
      lo_data_validation->cell_row    = 2.
      lo_data_validation->cell_column = 'C'.
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'C' ip_value = '数字在1-10:' ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

12.设置单元格合并

    使用zcl_excel_worksheet类对象set_merge方法,合并单元格操作。

示例:

"单元格合并
FORM set_merge.
  TRY .
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'F' ip_value = '单元格合并' ).
      "设置单元格合并
      lo_worksheet->set_merge(
      ip_column_start = 'F'
      ip_column_end = 'H'
      ip_row = 1
      ip_row_to = 2 ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

13.行列选择

    使用zcl_excel_worksheet_columndime类对象保存列信息,zcl_excel_worksheet_rowdimensi 类对象保存行信息。

    通过zcl_excel_worksheet类对象的get_column_dimension方法获取列对象;

    通过zcl_excel_worksheet类对象的get_row_dimension方法行对象;

    调用行列对象方法设置行列参数。

示例:

"行列选择
FORM select_area.
  "列选择对象
  DATA:column_dimension TYPE REF TO zcl_excel_worksheet_columndime.
  "行选择对象
  DATA:row_dimension TYPE REF TO zcl_excel_worksheet_rowdimensi.

  TRY .
      "列选择
      column_dimension = lo_worksheet->get_column_dimension( ip_column = 'A' ).
      "设置列属性
      "设置列宽
      column_dimension->set_width( ip_width = 6 ).
      "设置自动列宽
      column_dimension->set_auto_size( ip_auto_size = abap_true ).
      "设置是否可见
      column_dimension->set_visible( ip_visible = abap_true ).
      "设置列样式
      "style类
      DATA:lo_style TYPE REF TO zcl_excel_style.
      "style的guid
      DATA:lv_style_guid TYPE zexcel_cell_style.
      "创建一个新style
      lo_style = lo_excel->add_new_style( ).
      "文本格式
      lo_style->number_format->format_code =  zcl_excel_style_number_format=>c_format_text.
      "获取style的编码uuid
      lv_style_guid = lo_style->get_guid( ).
      column_dimension->set_column_style_by_guid( ip_style_guid = lv_style_guid ).
      "设置outline level,出现列收缩展开栏
      column_dimension->set_outline_level( ip_outline_level = 0 ).

      "行选择
      row_dimension = lo_worksheet->get_row_dimension( ip_row = 1 ).
      "设置行高
      row_dimension->set_row_height( ip_row_height = 32 ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

14.获取worksheet的行列数

    通过zcl_excel_worksheet类对象的ge_hightest_row方法获取当前worksheet中行数;

    通过zcl_excel_worksheet类对象的ge_hightest_column方法获取当前worksheet中列数;

示例:

"获取excel的列数和行数
FORM get_rc.
  "行数
  DATA:lv_rows TYPE I.
  "列数
  DATA:lv_columns TYPE I.
  "列数对应字母
  DATA:col_alpha TYPE zexcel_cell_column_alpha.

  TRY .
      "获取行列数
      lv_rows = lo_worksheet->get_highest_row( ).
      lv_columns = lo_worksheet->get_highest_column( ).
      "将列数转换成对应列字母
      col_alpha = zcl_excel_common=>convert_column2alpha( ip_column = 2 ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

15.excel显示图片

    通过zcl_excel_drawing类对象实现excel中绘制图片。

示例:

"显示图片
FORM set_drawing.
  "绘制图片对象
  DATA:lo_drawing TYPE REF TO zcl_excel_drawing.
  TRY .
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'drawing' ).

      "显示本地路径图片
      DATA:t_solix TYPE solix_tab.
      DATA:lv_len TYPE I.
      DATA:lv_xstring TYPE xstring.

      CALL METHOD cl_gui_frontend_services=>gui_upload
        EXPORTING
          filename   = 'D:\图片\back2.jpg'
          filetype   = 'BIN'
        IMPORTING
          filelength = lv_len
        CHANGING
          data_tab   = t_solix.
      IF sy-subrc <> 0 .
        MESSAGE '读取失败!' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_len
        IMPORTING
          buffer       = lv_xstring
        TABLES
          binary_tab   = t_solix
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
      "创建zcl_excel_drawing对象
      lo_drawing = lo_excel->add_new_drawing( ).
      lo_drawing->set_position( ip_from_row = 3 ip_from_col = 'B' ).
      lo_drawing->set_media( ip_media = lv_xstring
                             ip_media_type = zcl_excel_drawing=>c_media_type_bmp
                             ip_width = 83
                             ip_height = 160 ).
      "worksheet添加图片
      lo_worksheet->add_drawing( lo_drawing ).

      "加载tcode:SMW0图片
      DATA:ls_key TYPE wwwdatatab.
      ls_key-relid = 'MI'.
      "SMW0,通过object id可以查找到图片
      ls_key-objid = 'SAPLOGO.GIF'.
      lo_drawing = lo_excel->add_new_drawing( ).
      lo_drawing->set_position( ip_from_row = 16
                                ip_from_col = 'B' ).
      lo_drawing->set_media_www( ip_key = ls_key
                                 ip_width = 166
                                 ip_height = 75 ).
      "worksheet添加图片
      lo_worksheet->add_drawing( lo_drawing ).
      "Mime repository (by default Question mark in standard Web Dynpro WDT_QUIZ
      "使用lo_worksheet->set_media_mime方法
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

16.设置过滤器filter

    通过zcl_excel_autofilter类对象实现过滤器filter。

示例:

"设置filter
FORM set_filter.
  DATA:t_sflight TYPE TABLE OF sflight.
  SELECT * FROM sflight INTO TABLE t_sflight UP TO 10 ROWS.
  "将alv或者内表绑定到excel,converter类
  DATA:lo_converter TYPE REF TO zcl_excel_converter.
  "自动过滤类
  DATA:lo_autofilter TYPE REF TO zcl_excel_autofilter.
  "过滤器范围
  DATA:ls_area TYPE zexcel_s_autofilter_area.
  "列单元格值
  DATA:lv_cell_value TYPE zexcel_cell_value.

  TRY .
      "创建一个新的worksheet
      lo_worksheet = lo_excel->add_new_worksheet( ).
      lo_worksheet->set_title( ip_title = 'filter' ).

      CREATE OBJECT lo_converter.
      lo_converter->convert(
        EXPORTING
          it_table = t_sflight
          i_row_int = 1
          i_column_int = 1
          io_worksheet = lo_worksheet
        CHANGING
          co_excel = lo_excel
      ).
    "当前worksheet,创建新的filter对象
    lo_autofilter = lo_excel->add_new_autofilter( io_sheet = lo_worksheet ) .
    ls_area-row_start = 1.
    ls_area-col_start = 1.
    ls_area-row_end = lo_worksheet->get_highest_row( ).
    ls_area-col_end = lo_worksheet->get_highest_column( ).
    lo_autofilter->set_filter_area( ls_area ).
    "设置第三列filter value
*    lo_worksheet->get_cell( EXPORTING
*                             ip_column    = 'C'
*                             ip_row       = 2
*                          IMPORTING
*                             ep_value     = lv_cell_value ).
    "设置列筛选值
*    lo_autofilter->set_value( i_column = 3 i_value  = lv_cell_value ).
    CATCH ZCX_EXCEL.
  ENDTRY.
ENDFORM.

 

 

格式规范

说明

(:)

时间分隔符。 在某些区域设置中,可能用其他字符表示时间分隔符。 在设置时间值的格式时,时间分隔符用于分隔小时、分钟和秒。 在格式化输出中用作时间分隔符的实际字符取决于您应用程序的当前区域性值。

(/)

日期分隔符。 在某些区域设置中,可能用其他字符表示日期分隔符。 在设置日期值的格式时,日期分隔符用于分隔年、月和日。 在格式化输出中用作日期分隔符的实际字符取决于您应用程序的当前区域性。

(%)

用于指示应以单个字母格式读取后面的字符,而不考虑任何尾随字母。 此外,还用于指示以用户定义的格式读取单个字母格式。 有关其他详细信息,请参阅以下内容。

d

将天显示为不带前导零的数字(例如,1)。 如果这是用户定义的数字格式中的唯一字符,则使用 %d。

dd

将天显示为带一个前导零的数字(例如,01)。

ddd

将天显示为缩写(例如,Sun)。

dddd

将天显示为全名(例如,Sunday)。

M

将月显示为不带前导零的数字(例如,一月表示为 1)。 如果这是用户定义的数字格式中的唯一字符,则使用 %M。

MM

将月显示为带一个前导零的数字(例如,01/12/01)。

MMM

将月显示为缩写(例如,Jan)。

MMMM

将月显示为完整的月份名称(例如,January)。

gg

显示时期/时代字符串(例如,A.D.)。

h

使用 12 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15 PM)。 如果这是用户定义的数字格式中的唯一字符,则使用 %h。

hh

使用 12 小时制时钟将小时显示为带前导零的数字(例如,01:15:15 PM)。

H

使用 24 小时制时钟将小时显示为不带前导零的数字(例如,1:15:15)。 如果这是用户定义的数字格式中的唯一字符,则使用 %H。

HH

使用 24 小时制时钟将小时显示为带前导零的数字(例如,01:15:15)。

m

将分钟显示为不带前导零的数字(例如,12:1:15)。 如果这是用户定义的数字格式中的唯一字符,则使用 %m。

mm

将分钟显示为带前导零的数字(例如,12:01:15)。

s

将秒显示为不带前导零的数字(例如,12:15:5)。 如果这是用户定义的数字格式中的唯一字符,则使用 %s。

ss

将秒显示为带前导零的数字(例如,12:15:05)。

f

显示秒的小数部分。 例如,ff 显示百分之一秒,而 ffff 显示万分之一秒。 在用户定义的格式中最多可以使用 7 个 f 符号。 如果这是用户定义的数字格式中的唯一字符,则使用 %f。

t

使用 12 小时制时钟,对于中午之前的任何小时都显示大写字母 A;对于中午与 11:59 P.M 之间的任何小时都显示大写字母 P。 如果这是用户定义的数字格式中的唯一字符,则使用 %t。

tt

对于使用 12 小时制时钟的区域设置,对中午之前的任何小时都显示大写字母 AM;对于中午与 11:59 P.M 之间的任何小时都显示 PM。

对于使用 24 小时制时钟的区域设置,不显示任何内容。

y

将年显示为不带前导零的数字 (0-9)。 如果这是用户定义的数字格式中的唯一字符,则使用 %y。

yy

以带一个前导零的两位数字格式显示年(如果适用)。

yyy

以四位数字格式显示年。

yyyy

以四位数字格式显示年。

z

显示不带前导零的时区偏移量(例如,-8)。 如果这是用户定义的数字格式中的唯一字符,则使用 %z。

zz

显示带一个前导零的时区偏移量(例如,-08)

zzz

显示完整的时区偏移量(例如,-08:00)

posted @ 2019-12-07 10:52  渔歌晚唱  阅读(3302)  评论(0编辑  收藏  举报