ABAP2XLSX with Excel Integration: Dynamic Report Generation
Emre Göçmen
Author

ABAP2XLSX with Excel Integration: Dynamic Report Generation
ABAP2XLSX is a powerful open-source library that enables SAP ABAP developers to programmatically create, modify, and read Excel files. This comprehensive guide will cover in detail how to create dynamic and professional Excel reports using ABAP2XLSX.
What is ABAP2XLSX?
ABAP2XLSX is an ABAP library developed for creating, reading, and modifying Excel format files (XLSX) in SAP systems. This library allows you to use Microsoft Excel's complex features through ABAP code.
Key advantages of ABAP2XLSX:
• Supports Excel's native format (XLSX)
• Can create formula calculations and charts
• Offers advanced formatting capabilities
• Efficiently processes large datasets
• Open source and continuously developed
• Works without SAP GUI dependency
Installation and Configuration
1. Downloading ABAP2XLSX Library
You can download the ABAP2XLSX library from GitHub or transfer it to your SAP system using abapGit:
* GitHub Repository: https://github.com/abap2xlsx/abap2xlsx
* Use the repository URL for abapGit installation
* Alternatively, download the ZIP file and transport manually
2. System Requirements
Minimum system requirements for ABAP2XLSX to work:
* SAP NetWeaver 7.0 or higher
* ABAP Objects support
* XML processing capabilities
* Frontend download/upload capabilities
Creating Basic Excel Files
1. Creating a Simple Excel File
First, let's create a basic Excel file:
REPORT z_abap2xlsx_basic_example.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zif_excel_writer,
lv_xstring TYPE xstring.
START-OF-SELECTION.
" Create Excel object
CREATE OBJECT lo_excel.
" Get the first worksheet
lo_worksheet = lo_excel->get_active_worksheet( ).
" Set worksheet title
lo_worksheet->set_title( 'Basic Report' ).
" Add data to cells
lo_worksheet->set_cell( ip_row = 1 ip_column = 1 ip_value = 'Title' ).
lo_worksheet->set_cell( ip_row = 1 ip_column = 2 ip_value = 'Value' ).
lo_worksheet->set_cell( ip_row = 2 ip_column = 1 ip_value = 'Total Sales' ).
lo_worksheet->set_cell( ip_row = 2 ip_column = 2 ip_value = 150000 ).
lo_worksheet->set_cell( ip_row = 3 ip_column = 1 ip_value = 'Profit Margin' ).
lo_worksheet->set_cell( ip_row = 3 ip_column = 2 ip_value = '15%' ).
" Convert Excel file to xstring format
CREATE OBJECT lo_writer TYPE zcl_excel_writer_2007.
lv_xstring = lo_writer->write_file( lo_excel ).
" Download file to user
PERFORM download_file USING lv_xstring 'basic_report.xlsx'.
FORM download_file USING iv_xstring TYPE xstring
iv_filename TYPE string.
DATA(data_tab) = cl_bcs_convert=>xstring_to_solix( iv_xstring = iv_xstring ).
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = xstrlen( iv_xstring )
filename = iv_filename
filetype = 'BIN'
TABLES
data_tab = data_tab
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
MESSAGE 'Excel file created successfully' TYPE 'S'.
ELSE.
MESSAGE 'Error creating Excel file' TYPE 'E'.
ENDIF.
ENDFORM.
2. Exporting Table Data to Excel
To export data from database to Excel:
REPORT z_abap2xlsx_table_export.
TYPES: BEGIN OF ty_sales_data,
vbeln TYPE vbeln, " Sales document
kunnr TYPE kunnr, " Customer number
name1 TYPE name1, " Customer name
netwr TYPE netwr, " Net value
waerk TYPE waers, " Currency
erdat TYPE erdat, " Creation date
END OF ty_sales_data.
DATA: lt_sales_data TYPE TABLE OF ty_sales_data,
lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zif_excel_writer,
lv_xstring TYPE xstring,
lv_row TYPE i VALUE 1,
lv_col TYPE i.
START-OF-SELECTION.
" Get sales data
PERFORM get_sales_data CHANGING lt_sales_data.
" Create Excel object
CREATE OBJECT lo_excel.
lo_worksheet = lo_excel->get_active_worksheet( ).
lo_worksheet->set_title( 'Sales Report' ).
" Create header row
PERFORM create_header USING lo_worksheet.
" Create data rows
PERFORM create_data_rows USING lo_worksheet lt_sales_data.
" Create and download Excel file
CREATE OBJECT lo_writer TYPE zcl_excel_writer_2007.
lv_xstring = lo_writer->write_file( lo_excel ).
PERFORM download_file USING lv_xstring 'sales_report.xlsx'.
FORM get_sales_data CHANGING pt_sales_data TYPE TABLE.
SELECT v~vbeln v~kunnr k~name1 v~netwr v~waerk v~erdat
FROM vbak AS v
INNER JOIN kna1 AS k ON v~kunnr = k~kunnr
INTO CORRESPONDING FIELDS OF TABLE pt_sales_data
UP TO 1000 ROWS
WHERE v~auart = 'TA'
AND v~erdat >= '20240101'
ORDER BY v~erdat DESCENDING.
ENDFORM.
FORM create_header USING po_worksheet TYPE REF TO zcl_excel_worksheet.
" Header row
po_worksheet->set_cell( ip_row = 1 ip_column = 1 ip_value = 'Sales Document' ).
po_worksheet->set_cell( ip_row = 1 ip_column = 2 ip_value = 'Customer No' ).
po_worksheet->set_cell( ip_row = 1 ip_column = 3 ip_value = 'Customer Name' ).
po_worksheet->set_cell( ip_row = 1 ip_column = 4 ip_value = 'Net Value' ).
po_worksheet->set_cell( ip_row = 1 ip_column = 5 ip_value = 'Currency' ).
po_worksheet->set_cell( ip_row = 1 ip_column = 6 ip_value = 'Creation Date' ).
" Format header row
DATA: lo_style TYPE REF TO zcl_excel_style.
CREATE OBJECT lo_style.
lo_style->font->bold = abap_true.
lo_style->font->color-rgb = zcl_excel_style_color=>c_black.
lo_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray.
" Apply style to header row
DO 6 TIMES.
po_worksheet->set_cell_style( ip_row = 1 ip_column = sy-index ip_style = lo_style ).
ENDDO.
ENDFORM.
FORM create_data_rows USING po_worksheet TYPE REF TO zcl_excel_worksheet
pt_sales_data TYPE TABLE.
DATA: lv_row TYPE i VALUE 2.
LOOP AT pt_sales_data INTO DATA(ls_sales_data).
po_worksheet->set_cell( ip_row = lv_row ip_column = 1 ip_value = ls_sales_data-vbeln ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 2 ip_value = ls_sales_data-kunnr ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 3 ip_value = ls_sales_data-name1 ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 4 ip_value = ls_sales_data-netwr ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 5 ip_value = ls_sales_data-waerk ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 6 ip_value = ls_sales_data-erdat ).
lv_row = lv_row + 1.
ENDLOOP.
ENDFORM.
Advanced Formatting and Formulas
1. Cell Formatting
You can format Excel cells for professional appearance:
FORM format_excel_cells USING po_worksheet TYPE REF TO zcl_excel_worksheet.
DATA: lo_style_header TYPE REF TO zcl_excel_style,
lo_style_number TYPE REF TO zcl_excel_style,
lo_style_date TYPE REF TO zcl_excel_style.
" Header style
CREATE OBJECT lo_style_header.
lo_style_header->font->bold = abap_true.
lo_style_header->font->size = 12.
lo_style_header->font->color-rgb = zcl_excel_style_color=>c_white.
lo_style_header->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_style_header->fill->fgcolor-rgb = zcl_excel_style_color=>c_blue.
lo_style_header->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center.
" Number format style
CREATE OBJECT lo_style_number.
lo_style_number->number_format->format_code = '#,##0.00'.
lo_style_number->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right.
" Date format style
CREATE OBJECT lo_style_date.
lo_style_date->number_format->format_code = 'dd.mm.yyyy'.
lo_style_date->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center.
" Apply styles
po_worksheet->set_cell_style( ip_row = 1 ip_column = 1 ip_style = lo_style_header ).
po_worksheet->set_cell_style( ip_row = 2 ip_column = 4 ip_style = lo_style_number ).
po_worksheet->set_cell_style( ip_row = 2 ip_column = 6 ip_style = lo_style_date ).
" Set column widths
po_worksheet->set_column_width( ip_column = 1 ip_width = 15 ).
po_worksheet->set_column_width( ip_column = 2 ip_width = 12 ).
po_worksheet->set_column_width( ip_column = 3 ip_width = 30 ).
po_worksheet->set_column_width( ip_column = 4 ip_width = 15 ).
po_worksheet->set_column_width( ip_column = 5 ip_width = 10 ).
po_worksheet->set_column_width( ip_column = 6 ip_width = 12 ).
ENDFORM.
2. Adding Excel Formulas
You can add formulas to perform calculations in Excel:
FORM add_excel_formulas USING po_worksheet TYPE REF TO zcl_excel_worksheet
iv_last_row TYPE i.
DATA: lv_sum_formula TYPE string,
lv_avg_formula TYPE string,
lv_count_formula TYPE string,
lv_formula_row TYPE i.
lv_formula_row = iv_last_row + 2.
" Sum formula
lv_sum_formula = |SUM(D2:D{ iv_last_row })|.
po_worksheet->set_cell( ip_row = lv_formula_row ip_column = 3 ip_value = 'TOTAL:' ).
po_worksheet->set_cell_formula( ip_row = lv_formula_row ip_column = 4 ip_formula = lv_sum_formula ).
" Average formula
lv_avg_formula = |AVERAGE(D2:D{ iv_last_row })|.
po_worksheet->set_cell( ip_row = lv_formula_row + 1 ip_column = 3 ip_value = 'AVERAGE:' ).
po_worksheet->set_cell_formula( ip_row = lv_formula_row + 1 ip_column = 4 ip_formula = lv_avg_formula ).
" Count formula
lv_count_formula = |COUNT(D2:D{ iv_last_row })|.
po_worksheet->set_cell( ip_row = lv_formula_row + 2 ip_column = 3 ip_value = 'COUNT:' ).
po_worksheet->set_cell_formula( ip_row = lv_formula_row + 2 ip_column = 4 ip_formula = lv_count_formula ).
" Apply special style to formula cells
DATA: lo_formula_style TYPE REF TO zcl_excel_style.
CREATE OBJECT lo_formula_style.
lo_formula_style->font->bold = abap_true.
lo_formula_style->font->color-rgb = zcl_excel_style_color=>c_blue.
lo_formula_style->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_formula_style->fill->fgcolor-rgb = zcl_excel_style_color=>c_gray_light.
DO 3 TIMES.
po_worksheet->set_cell_style( ip_row = lv_formula_row + sy-index - 1
ip_column = 3
ip_style = lo_formula_style ).
po_worksheet->set_cell_style( ip_row = lv_formula_row + sy-index - 1
ip_column = 4
ip_style = lo_formula_style ).
ENDDO.
ENDFORM.
Creating Charts
1. Adding Basic Charts
You can add charts to visually present your data:
FORM add_chart_to_excel USING po_worksheet TYPE REF TO zcl_excel_worksheet
iv_last_row TYPE i.
DATA: lo_chart TYPE REF TO zcl_excel_drawing_chart,
lo_chart_area TYPE REF TO zcl_excel_chart_area,
lv_chart_row TYPE i.
lv_chart_row = iv_last_row + 5.
" Create chart object
CREATE OBJECT lo_chart.
" Set chart type (Column chart)
lo_chart->type = zcl_excel_drawing_chart=>c_type_column.
" Set chart title
lo_chart->title = 'Sales Analysis'.
" Define data range
DATA: lv_data_range TYPE string.
lv_data_range = |A1:D{ iv_last_row }|.
" Set chart data source
lo_chart->set_chart_data( ip_range = lv_data_range ).
" Set chart position
lo_chart->set_position( ip_from_row = lv_chart_row
ip_from_col = 1
ip_to_row = lv_chart_row + 15
ip_to_col = 8 ).
" Add chart to worksheet
po_worksheet->add_drawing( lo_chart ).
" Customize chart area
CREATE OBJECT lo_chart_area.
lo_chart_area->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_chart_area->fill->fgcolor-rgb = zcl_excel_style_color=>c_white.
lo_chart->chart_area = lo_chart_area.
ENDFORM.
Multiple Worksheet Management
1. Creating Multiple Worksheets
You can use multiple worksheets for complex reports:
FORM create_multiple_worksheets USING po_excel TYPE REF TO zcl_excel.
DATA: lo_worksheet_summary TYPE REF TO zcl_excel_worksheet,
lo_worksheet_detail TYPE REF TO zcl_excel_worksheet,
lo_worksheet_chart TYPE REF TO zcl_excel_worksheet.
" Summary sheet
lo_worksheet_summary = po_excel->get_active_worksheet( ).
lo_worksheet_summary->set_title( 'Summary Report' ).
PERFORM create_summary_sheet USING lo_worksheet_summary.
" Create detail sheet
lo_worksheet_detail = po_excel->add_new_worksheet( ).
lo_worksheet_detail->set_title( 'Detail Report' ).
PERFORM create_detail_sheet USING lo_worksheet_detail.
" Create chart sheet
lo_worksheet_chart = po_excel->add_new_worksheet( ).
lo_worksheet_chart->set_title( 'Chart Analysis' ).
PERFORM create_chart_sheet USING lo_worksheet_chart.
ENDFORM.
FORM create_summary_sheet USING po_worksheet TYPE REF TO zcl_excel_worksheet.
" Summary information
po_worksheet->set_cell( ip_row = 1 ip_column = 1 ip_value = 'SUMMARY REPORT' ).
po_worksheet->set_cell( ip_row = 3 ip_column = 1 ip_value = 'Total Sales:' ).
po_worksheet->set_cell( ip_row = 3 ip_column = 2 ip_value = 'Detail Report!SUM(D:D)' ).
po_worksheet->set_cell( ip_row = 4 ip_column = 1 ip_value = 'Customer Count:' ).
po_worksheet->set_cell( ip_row = 4 ip_column = 2 ip_value = 'Detail Report!COUNT(B:B)' ).
po_worksheet->set_cell( ip_row = 5 ip_column = 1 ip_value = 'Average Sales:' ).
po_worksheet->set_cell( ip_row = 5 ip_column = 2 ip_value = 'Detail Report!AVERAGE(D:D)' ).
" Apply title style
DATA: lo_title_style TYPE REF TO zcl_excel_style.
CREATE OBJECT lo_title_style.
lo_title_style->font->bold = abap_true.
lo_title_style->font->size = 16.
lo_title_style->font->color-rgb = zcl_excel_style_color=>c_blue.
po_worksheet->set_cell_style( ip_row = 1 ip_column = 1 ip_style = lo_title_style ).
ENDFORM.
Performance Optimization
1. Optimization for Large Datasets
To improve performance when working with large datasets:
FORM optimize_large_datasets USING po_worksheet TYPE REF TO zcl_excel_worksheet
pt_data TYPE STANDARD TABLE.
DATA: lv_row TYPE i VALUE 1,
lv_col TYPE i,
lv_batch_size TYPE i VALUE 1000,
lv_total_rows TYPE i,
lv_processed_rows TYPE i VALUE 0.
" Calculate total rows
DESCRIBE TABLE pt_data LINES lv_total_rows.
" Process data in batches
DO.
DATA: lt_batch TYPE STANDARD TABLE OF ty_sales_data.
" Get batch-sized data
APPEND LINES OF pt_data FROM ( lv_processed_rows + 1 )
TO ( lv_processed_rows + lv_batch_size )
TO lt_batch.
IF lt_batch IS INITIAL.
EXIT.
ENDIF.
" Add batch data to Excel
LOOP AT lt_batch INTO DATA(ls_data).
lv_row = lv_processed_rows + sy-tabix + 1.
po_worksheet->set_cell( ip_row = lv_row ip_column = 1 ip_value = ls_data-vbeln ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 2 ip_value = ls_data-kunnr ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 3 ip_value = ls_data-name1 ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 4 ip_value = ls_data-netwr ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 5 ip_value = ls_data-waerk ).
po_worksheet->set_cell( ip_row = lv_row ip_column = 6 ip_value = ls_data-erdat ).
ENDLOOP.
lv_processed_rows = lv_processed_rows + lines( lt_batch ).
" Show progress
IF lv_processed_rows MOD 5000 = 0.
MESSAGE s000(0k) WITH 'Processed rows:' lv_processed_rows.
ENDIF.
CLEAR: lt_batch.
ENDDO.
ENDFORM.
Error Handling and Logging
1. Comprehensive Error Handling
For error handling during Excel creation process:
FORM create_excel_with_error_handling.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_writer TYPE REF TO zif_excel_writer,
lv_xstring TYPE xstring,
lv_error_msg TYPE string.
TRY.
" Create Excel object
CREATE OBJECT lo_excel.
lo_worksheet = lo_excel->get_active_worksheet( ).
" Data processing
PERFORM process_data_with_validation USING lo_worksheet
CHANGING lv_error_msg.
IF lv_error_msg IS NOT INITIAL.
MESSAGE lv_error_msg TYPE 'E'.
RETURN.
ENDIF.
" Create Excel file
CREATE OBJECT lo_writer TYPE zcl_excel_writer_2007.
lv_xstring = lo_writer->write_file( lo_excel ).
" Download file
PERFORM download_file_with_validation USING lv_xstring
'error_handled_report.xlsx'
CHANGING lv_error_msg.
IF lv_error_msg IS INITIAL.
MESSAGE 'Excel file created successfully' TYPE 'S'.
PERFORM log_success.
ELSE.
MESSAGE lv_error_msg TYPE 'E'.
PERFORM log_error USING lv_error_msg.
ENDIF.
CATCH zcx_excel INTO DATA(lo_excel_exception).
lv_error_msg = |Excel processing error: { lo_excel_exception->get_text( ) }|.
MESSAGE lv_error_msg TYPE 'E'.
PERFORM log_error USING lv_error_msg.
CATCH cx_sy_create_object_error INTO DATA(lo_create_error).
lv_error_msg = |Object creation error: { lo_create_error->get_text( ) }|.
MESSAGE lv_error_msg TYPE 'E'.
PERFORM log_error USING lv_error_msg.
ENDTRY.
ENDFORM.
Best Practices and Tips
1. Code Organization
Recommendations for code organization in ABAP2XLSX projects:
* Well-organized class structure
CLASS lcl_excel_generator DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING iv_template_name TYPE string OPTIONAL,
generate_report IMPORTING it_data TYPE STANDARD TABLE
RETURNING VALUE(rv_xstring) TYPE xstring,
add_worksheet IMPORTING iv_name TYPE string
RETURNING VALUE(ro_worksheet) TYPE REF TO zcl_excel_worksheet,
apply_formatting IMPORTING io_worksheet TYPE REF TO zcl_excel_worksheet,
add_charts IMPORTING io_worksheet TYPE REF TO zcl_excel_worksheet.
PRIVATE SECTION.
DATA: mo_excel TYPE REF TO zcl_excel,
mo_writer TYPE REF TO zif_excel_writer,
mv_template_name TYPE string.
METHODS: initialize_excel,
create_styles,
finalize_excel RETURNING VALUE(rv_xstring) TYPE xstring.
ENDCLASS.
CLASS lcl_excel_generator IMPLEMENTATION.
METHOD constructor.
mv_template_name = iv_template_name.
initialize_excel( ).
ENDMETHOD.
METHOD initialize_excel.
CREATE OBJECT mo_excel.
CREATE OBJECT mo_writer TYPE zcl_excel_writer_2007.
create_styles( ).
ENDMETHOD.
METHOD generate_report.
DATA: lo_worksheet TYPE REF TO zcl_excel_worksheet.
lo_worksheet = mo_excel->get_active_worksheet( ).
lo_worksheet->set_title( 'Main Report' ).
" Data processing logic goes here
rv_xstring = finalize_excel( ).
ENDMETHOD.
METHOD finalize_excel.
rv_xstring = mo_writer->write_file( mo_excel ).
ENDMETHOD.
ENDCLASS.
Advanced Features
1. Conditional Formatting
Use conditional formatting to highlight data:
FORM add_conditional_formatting USING po_worksheet TYPE REF TO zcl_excel_worksheet
iv_last_row TYPE i.
DATA: lo_cond_format TYPE REF TO zcl_excel_conditional_formatting,
lo_style_high TYPE REF TO zcl_excel_style,
lo_style_low TYPE REF TO zcl_excel_style.
" Style for high values
CREATE OBJECT lo_style_high.
lo_style_high->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_style_high->fill->fgcolor-rgb = zcl_excel_style_color=>c_green.
lo_style_high->font->color-rgb = zcl_excel_style_color=>c_white.
" Style for low values
CREATE OBJECT lo_style_low.
lo_style_low->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
lo_style_low->fill->fgcolor-rgb = zcl_excel_style_color=>c_red.
lo_style_low->font->color-rgb = zcl_excel_style_color=>c_white.
" Create conditional formatting
CREATE OBJECT lo_cond_format.
" Rule for high values (>100000)
lo_cond_format->add_rule(
ip_range = |D2:D{ iv_last_row }|
ip_type = zcl_excel_conditional_formatting=>c_type_cell_value
ip_operator = zcl_excel_conditional_formatting=>c_operator_greater_than
ip_formula = '100000'
ip_style = lo_style_high ).
" Rule for low values (<10000)
lo_cond_format->add_rule(
ip_range = |D2:D{ iv_last_row }|
ip_type = zcl_excel_conditional_formatting=>c_type_cell_value
ip_operator = zcl_excel_conditional_formatting=>c_operator_less_than
ip_formula = '10000'
ip_style = lo_style_low ).
" Add conditional formatting to worksheet
po_worksheet->add_conditional_formatting( lo_cond_format ).
ENDFORM.
Conclusion
The ABAP2XLSX library provides powerful capabilities for Excel integration to SAP developers. With the techniques learned in this guide, you can:
• Create professional-looking Excel reports
• Use complex formatting and formulas
• Efficiently process large datasets
• Implement error handling and performance optimization
• Use advanced Excel features in ABAP
By applying these techniques in your projects, you can provide better reporting experiences to your users and improve data analysis processes.
Comments
No comments yet.
Be the first to comment.



