*&---------------------------------------------------------------------* *& Report ZDEMO_CALENDAR *& abap2xlsx Demo: Create Calendar with Pictures *&---------------------------------------------------------------------* *& This report creates a monthly calendar in the specified date range. *& Each month is put on a seperate worksheet. The pictures for each *& month can be specified in a tab delimited file called "Calendar.txt" *& which is saved in the Export Directory. By default this is the SAP *& Workdir. The file contains 3 fields: *& *& Month (with leading 0) *& Image Filename *& Image Description *& *& The Images should be landscape JPEG's with a 3:2 ratio and min. *& 450 pixel height. They must also be saved in the Export Directory. *& In my tests I've discovered a limit of 20 MB in the *& cl_gui_frontend_services=>gui_download method. So keep your images *& smaller or chnage to a server export using OPEN DATASET. *&---------------------------------------------------------------------* REPORT zdemo_calendar. TYPE-POOLS: abap. INCLUDE zdemo_calendar_classes. DATA: lv_workdir TYPE string. PARAMETERS: p_path TYPE zexcel_export_dir. PARAMETERS: p_from TYPE dfrom DEFAULT '20120101', p_to TYPE dto DEFAULT '20121231'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. lv_workdir = p_path. cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir CHANGING selected_folder = lv_workdir ). p_path = lv_workdir. INITIALIZATION. cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). cl_gui_cfw=>flush( ). p_path = lv_workdir. START-OF-SELECTION. DATA: lo_excel TYPE REF TO zcl_excel, lo_excel_writer TYPE REF TO zif_excel_writer, lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime, lo_row_dim TYPE REF TO ZCL_EXCEL_WORKSHEET_ROWDIMENSI, lo_drawing TYPE REF TO zcl_excel_drawing. DATA: lo_style_month TYPE REF TO zcl_excel_style, lv_style_month_guid TYPE zexcel_cell_style. DATA: lo_style_border TYPE REF TO zcl_excel_style, lo_border_dark TYPE REF TO zcl_excel_style_border, lv_style_border_guid TYPE zexcel_cell_style. DATA: lo_style_center TYPE REF TO zcl_excel_style, lv_style_center_guid TYPE zexcel_cell_style. DATA: lv_file TYPE xstring, lv_bytecount TYPE i, lt_file_tab TYPE solix_tab. DATA: lv_full_path TYPE string, image_descr_path TYPE string, lv_file_separator TYPE c. DATA: lv_content TYPE xstring, width TYPE i. DATA: month TYPE i, month_nr TYPE fcmnr, count TYPE i VALUE 1, title TYPE zexcel_sheet_title, value TYPE string, image_path TYPE string, date_from TYPE datum, date_to TYPE datum, row TYPE zexcel_cell_row, to_col TYPE zexcel_cell_column_alpha, to_col_int TYPE i. DATA: month_names TYPE TABLE OF t247. FIELD-SYMBOLS: <month_name> LIKE LINE OF month_names. TYPES: BEGIN OF tt_datatab, month_nr TYPE fcmnr, filename TYPE string, descr TYPE string, END OF tt_datatab. DATA: image_descriptions TYPE TABLE OF tt_datatab. FIELD-SYMBOLS: <img_descr> LIKE LINE OF image_descriptions. CONSTANTS: lv_default_file_name TYPE string VALUE 'Calendar', "#EC NOTEXT from_row TYPE zexcel_cell_row VALUE 28, from_col TYPE zexcel_cell_column_alpha VALUE 'C', c_height TYPE i VALUE 450, " Image Height c_factor TYPE f VALUE '1.5'. " Image Ratio, default 3:2 IF p_path IS INITIAL. p_path = lv_workdir. ENDIF. cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). CONCATENATE p_path lv_file_separator lv_default_file_name '.xlsx' INTO lv_full_path. "#EC NOTEXT " Read Image Names for Month and Description CONCATENATE p_path lv_file_separator lv_default_file_name '.txt' INTO image_descr_path. "#EC NOTEXT cl_gui_frontend_services=>gui_upload( EXPORTING filename = image_descr_path " Name of file filetype = 'ASC' " File Type (ASCII, Binary) has_field_separator = 'X' read_by_line = 'X' " File Written Line-By-Line to the Internal Table CHANGING data_tab = image_descriptions " Transfer table for file contents EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. " Creates active sheet CREATE OBJECT lo_excel. " Create Styles " Create an underline double style lo_style_month = lo_excel->add_new_style( ). " lo_style_month->font->underline = abap_true. " lo_style_month->font->underline_mode = zcl_excel_style_font=>c_underline_single. lo_style_month->font->name = zcl_excel_style_font=>c_name_roman. lo_style_month->font->scheme = zcl_excel_style_font=>c_scheme_none. lo_style_month->font->family = zcl_excel_style_font=>c_family_roman. lo_style_month->font->bold = abap_true. lo_style_month->font->size = 36. lv_style_month_guid = lo_style_month->get_guid( ). " Create border object CREATE OBJECT lo_border_dark. lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. "Create style with border lo_style_border = lo_excel->add_new_style( ). lo_style_border->borders->allborders = lo_border_dark. lo_style_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. lo_style_border->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. lv_style_border_guid = lo_style_border->get_guid( ). "Create style alignment center lo_style_center = lo_excel->add_new_style( ). lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. lo_style_center->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. lv_style_center_guid = lo_style_center->get_guid( ). " Get Month Names CALL FUNCTION 'MONTH_NAMES_GET' TABLES month_names = month_names. zcl_date_calculation=>months_between_two_dates( EXPORTING i_date_from = p_from i_date_to = p_to i_incl_to = abap_true IMPORTING e_month = month ). date_from = p_from. WHILE count <= month. IF count = 1. " Get active sheet lo_worksheet = lo_excel->get_active_worksheet( ). ELSE. lo_worksheet = lo_excel->add_new_worksheet( ). ENDIF. lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. title = count. value = count. CONDENSE title. CONDENSE value. lo_worksheet->set_title( title ). lo_worksheet->set_print_gridlines( abap_false ). lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. lo_worksheet->sheet_setup->margin_top = '0.80'. lo_worksheet->sheet_setup->margin_left = '0.55'. lo_worksheet->sheet_setup->margin_right = '0.05'. lo_worksheet->sheet_setup->margin_bottom = '0.30'. lo_col_dim = lo_worksheet->get_column_dimension( 'A' ). lo_col_dim->set_width( '1.0' ). lo_col_dim = lo_worksheet->get_column_dimension( 'B' ). lo_col_dim->set_width( '2.0' ). lo_col_dim = lo_worksheet->get_column_dimension( 'K' ). lo_col_dim->set_width( '3.0' ). lo_worksheet->sheet_setup->horizontal_centered = abap_true. " Add Month Name month_nr = date_from+4(2). READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING <month_name>. CONCATENATE <month_name>-ltx ` ` date_from(4) INTO value. row = from_row - 2. lo_worksheet->set_cell( EXPORTING ip_column = from_col " Cell Column ip_row = row " Cell Row ip_value = value " Cell Value ip_style = lv_style_month_guid ). to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 7. to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). lo_worksheet->set_merge( EXPORTING ip_column_start = from_col " Cell Column Start ip_column_end = to_col " Cell Column End ip_row = row " Cell Row ip_row_to = row " Cell Row ). " Add drawing from a XSTRING read from a file UNASSIGN <img_descr>. READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING <img_descr>. IF <img_descr> IS ASSIGNED. value = <img_descr>-descr. row = from_row - 3. lo_worksheet->set_cell( EXPORTING ip_column = from_col " Cell Column ip_row = row " Cell Row ip_value = value " Cell Value ). lo_row_dim = lo_worksheet->get_row_dimension( row ). lo_row_dim->set_row_height( '22.0' ). CONCATENATE p_path lv_file_separator <img_descr>-filename INTO image_path. lo_drawing = lo_excel->add_new_drawing( ). lo_drawing->set_position( ip_from_row = 1 ip_from_col = 'B' ). lv_content = zcl_helper=>load_image( image_path ). width = c_height * c_factor. lo_drawing->set_media( ip_media = lv_content ip_media_type = zcl_excel_drawing=>c_media_type_jpg ip_width = width ip_height = c_height ). lo_worksheet->add_drawing( lo_drawing ). ENDIF. " Add Calendar CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' EXPORTING day_in = date_from IMPORTING last_day_of_month = date_to. zcl_helper=>add_calendar( EXPORTING i_date_from = date_from i_date_to = date_to i_from_row = from_row i_from_col = from_col i_day_style = lv_style_border_guid i_cw_style = lv_style_center_guid CHANGING c_worksheet = lo_worksheet ). count = count + 1. date_from = date_to + 1. ENDWHILE. lo_excel->set_active_sheet_index_by_name( '1' ). CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. lv_file = lo_excel_writer->write_file( lo_excel ). " Convert to binary CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_file IMPORTING output_length = lv_bytecount TABLES binary_tab = lt_file_tab. * " This method is only available on AS ABAP > 6.40 * lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). * lv_bytecount = xstrlen( lv_file ). " Save the file cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = lv_bytecount filename = lv_full_path filetype = 'BIN' CHANGING data_tab = lt_file_tab EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.