Sap работа с excel

ABAP программа загрузки данных из EXCEL в SAP систему. Разберу на примере загрузку Excel файла, проверку и преобразование данных, полученных при загрузке ABAP. 
Это полезная и часто используемая задача.

Загрузка данных из Excel

Рассмотрим один из вариантов загрузки данных из Excel на примере программы ABAP. Подробно разберу каждый блок программы для лучшего понимания. Ссылку на файл Excel для тестирования данной программы приведу в конце данной статьи.

Программа ABAP Excel. Загрузка из Excel в SAP

Селекционный экран ABAP для выбора файла

Создаю селекционный экран ABAP на который добавлю одно поле для выбора файла из которого будут загружаться данные.

PARAMETERS p_file TYPE string LOWER CASE.

Селекционный экран ABAP для выбора файла Excel.

Селекционный экран ABAP для выбора файла Excel.

Средство поиска ABAP для файла

Так же в этой части кода добавляю средство поиска ABAP для поля файла через использование события AT SELECTION-SCREEN ON VALUE-REQUEST.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  cl_salv_test_data=>select_file( IMPORTING filename = p_file ).

Окно выбора файла стандартный проводник

Окно выбора файла стандартный проводник

Определяю тип для внутренней таблицы результата

Я определил локальный тип структуры результата для большей наглядности в статье, но на его месте может быть и тип ABAP словаря.

START-OF-SELECTION.

  TYPES:

    BEGIN OF ts_data,

      carrid    TYPE s_carr_id,

      connid    TYPE s_conn_id,

      fldate    TYPE s_date,

      price TYPE s_price,

      currency  TYPE s_currcode,

      planetype TYPE s_planetye,

      seatsmax  TYPE s_seatsmax,

      seatsocc  TYPE s_seatsocc,

      gjahr     TYPE gjahr,

      monat     TYPE monat,

    END OF ts_data.

Внутренняя таблица lt_sflight это таблица в которую будет помещён итоговый уже преобразованный результат загрузки. А таблица lt_intern это внутренняя таблица abap в которую изначально будут помещены данные из Excel для дальнейшей обработки.

  DATA:

    lt_sflight TYPE STANDARD TABLE OF ts_data,

    lt_intern  TYPE TABLE OF alsmex_tabline.

Структура ABAP словаря alsmex_tabline

Структура ABAP словаря alsmex_tabline

ФМ ALSM_EXCEL_TO_INTERNAL_TABLE

Сама загрузка происходит при вызове функционального метода ALSM_EXCEL_TO_INTERNAL_TABLE, разберём подробно его параметры:

    CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’

      EXPORTING

        filename                = CONV rlgrapfilename( p_file )

        i_begin_col             = 1

        i_begin_row             = 2

        i_end_col               = 10

        i_end_row               = 10000

      TABLES

        intern                  = lt_intern

      EXCEPTIONS

        inconsistent_parameters = 1

        upload_ole              = 2

        OTHERS                  = 3.

  • filename – путь к файлу Excel. Использование конструкции CONV в этом случае преобразует параметр p_file к нужному типу.
  • i_begin_col – номер колонки с которой начинать загрузку
  • i_begin_row – номер строки с которой начинаем загрузку. В нашем случае установил значение 2 так как мне не нужно обрабатывать первую строку заголовка.
  • i_end_col – сколько колонок нам нужно анализировать при загрузке
  • i_end_row – сколько записей максимум берётся для анализа.
  • intern – внутренняя таблица в которую будут загружаться данные из файла.

Обработка результата загрузки данных из Excel

С использованием конструкции нового синтаксиса LOOP AT GROUP BY обходим таблицу сгруппировав её по столбцу row, в котором расположен номер строки. И после обработки всей группы с одинаковым номером строки мы добавляем запись в таблицу результата и переходим к следующей группе.

Более подробно загрузка и обработка данных после разбирается в видео и не забывайте подписаться на мой канал YouCoder.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

      LOOP AT lt_intern INTO DATA(ls_intern)

        GROUP BY ( row = ls_internrow )

        REFERENCE INTO DATA(lr_grp).

        DATA(ls_alv) = VALUE ts_data( ).

        LOOP AT GROUP lr_grp REFERENCE INTO DATA(lr_item).

          CHECK lr_item>value IS NOT INITIAL.

          CASE lr_item>col.

            WHEN 1.

              ls_alvcarrid = lr_item>value.

            WHEN 2.

              ls_alvconnid = lr_item>value.

            WHEN 3.

              ls_alvfldate = |{ lr_item>value+6(4) }{ lr_item>value+3(2) }{ lr_item>value(2) }|. » 29.04.2015 20150429

            WHEN 4.

              lr_item>value = replace( val = lr_item>value regex =‘[,]’ with = ‘.’ occ = 0 ). » 427,94

              ls_alvprice = lr_item>value.

            WHEN 5.

              ls_alvcurrency = lr_item>value.

            WHEN 6.

              ls_alvplanetype = lr_item>value.

            WHEN 7.

              ls_alvseatsmax = lr_item>value.

            WHEN 8.

              IF strlen( lr_item>value ) > 10.

                ls_alvseatsocc = lr_item>value.

              ENDIF.

            WHEN 9.

              IF lr_item>value CO |0123456789| AND lr_item>value >= 1 AND lr_item>value <= 9999.

                ls_alvgjahr = lr_item>value.

              ENDIF.

            WHEN 10.

              IF lr_item>value CO |0123456789| AND lr_item>value >= 1 AND lr_item>value <= 12 .

                ls_alvmonat = lr_item>value.

              ENDIF.

            WHEN OTHERS.

              CONTINUE.

          ENDCASE.

        ENDLOOP.

        APPEND ls_alv TO lt_sflight.

      ENDLOOP.

Конструкции языка ABAP используемые в коде выше:
  • replace – замена символа в строке ABAP
  • strlen – длина строки ABAP
  • LOOP AT GROUP – группировка в цикле ABAP
Быстрый вывод внутренней таблицы ABAP на экран для тестирования:

cl_demo_output=>display( lt_sflight ).

Шаблон программы ABAP загрузки данных из Excel.

Ниже привёл полный код программы загрузки для удобства копирования и тестирования:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

START-OF-SELECTION.

  TYPES:

    BEGIN OF ts_data,

      carrid    TYPE s_carr_id,

      connid    TYPE s_conn_id,

      fldate    TYPE s_date,

      price     TYPE s_price,

      currency  TYPE s_currcode,

      planetype TYPE s_planetye,

      seatsmax  TYPE s_seatsmax,

      seatsocc  TYPE s_seatsocc,

      gjahr     TYPE gjahr,

      monat     TYPE monat,

    END OF ts_data.

  DATA:

    lt_sflight TYPE STANDARD TABLE OF ts_data,

    lt_intern  TYPE TABLE OF alsmex_tabline.

  IF p_file IS NOT INITIAL.

    CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’

      EXPORTING

        filename                = CONV rlgrapfilename( p_file )

        i_begin_col             = 1

        i_begin_row             = 2

        i_end_col               = 10

        i_end_row               = 10000

      TABLES

        intern                  = lt_intern

      EXCEPTIONS

        inconsistent_parameters = 1

        upload_ole              = 2

        OTHERS                  = 3.

    IF sysubrc = 0.

      LOOP AT lt_intern INTO DATA(ls_intern)

        GROUP BY ( row = ls_internrow )

        REFERENCE INTO DATA(lr_grp).

        DATA(ls_alv) = VALUE ts_data( ).

        LOOP AT GROUP lr_grp REFERENCE INTO DATA(lr_item).

          CHECK lr_item>value IS NOT INITIAL.

          CASE lr_item>col.

            WHEN 1.

              ls_alvcarrid = lr_item>value.

            WHEN 2.

              ls_alvconnid = lr_item>value.

            WHEN 3.

              ls_alvfldate = |{ lr_item>value+6(4) }{ lr_item>value+3(2) }{ lr_item>value(2) }|. » 29.04.2015 20150429

            WHEN 4.

              lr_item>value = replace( val = lr_item>value regex =‘[,]’ with = ‘.’ occ = 0 ). » 427,94

              ls_alvprice = lr_item>value.

            WHEN 5.

              ls_alvcurrency = lr_item>value.

            WHEN 6.

              ls_alvplanetype = lr_item>value.

            WHEN 7.

              ls_alvseatsmax = lr_item>value.

            WHEN 8.

              IF strlen( lr_item>value ) > 10.

                ls_alvseatsocc = lr_item>value.

              ENDIF.

            WHEN 9.

              IF lr_item>value CO |0123456789| AND lr_item>value >= 1 AND lr_item>value <= 9999.

                ls_alvgjahr = lr_item>value.

              ENDIF.

            WHEN 10.

              IF lr_item>value CO |0123456789| AND lr_item>value >= 1 AND lr_item>value <= 12 .

                ls_alvmonat = lr_item>value.

              ENDIF.

            WHEN OTHERS.

              CONTINUE.

          ENDCASE.

        ENDLOOP.

        APPEND ls_alv TO lt_sflight.

      ENDLOOP.

    ENDIF.

    cl_demo_output=>display( lt_sflight ).

  ENDIF.

Если статья оказалась Вам полезна поддержите проект. Спасибо!

Сайт ABAP программирование YouCoder – это сборник статей и видео о языке программирования ABAP и работе в SAP системе. Есть как уроки abap для начинающих так и новый синтаксис в ABAP и SAP обучение для консультантов SAP.

TRY.

    DATA: lv_rc TYPE i.

    DATA: it_files TYPE filetable.

    DATA: lv_action TYPE i.

    cl_gui_frontend_services=>file_open_dialog( EXPORTING

                                                  file_filter = |xlsx (*.xlsx)|*.xlsx|{ cl_gui_frontend_services=>filetype_all }|

                                                CHANGING

                                                  file_table  = it_files

                                                  rc          = lv_rc

                                                  user_action = lv_action ).

    IF lv_action = cl_gui_frontend_services=>action_ok.

      IF lines( it_files ) > 0.

        DATA: lv_filesize TYPE w3paramcont_len.

        DATA: lv_filetype TYPE w3paramcont_type.

        DATA: it_bin_data TYPE w3mimetabtype.

        cl_gui_frontend_services=>gui_upload( EXPORTING

                                                filename   = |{ it_files[ 1 ]filename }|

                                                filetype   = ‘BIN’

                                              IMPORTING

                                                filelength = lv_filesize

                                              CHANGING

                                                data_tab   = it_bin_data ).

        DATA(lv_bin_data) = cl_bcs_convert=>solix_to_xstring( it_solix = it_bin_data ).

        DATA(o_excel) = NEW cl_fdt_xl_spreadsheet( document_name = CONV #( it_files[ 1 ]filename )

                                                   xdocument     = lv_bin_data ).

        DATA: it_worksheet_names TYPE if_fdt_doc_spreadsheet=>t_worksheet_names.

        o_excel>if_fdt_doc_spreadsheet~get_worksheet_names( IMPORTING worksheet_names = it_worksheet_names ).

        IF lines( it_worksheet_names ) > 0.

          DATA(o_worksheet_itab) = o_excel>if_fdt_doc_spreadsheet~get_itab_for_alv_update( ).

          ASSIGN o_worksheet_itab>* TO FIELDSYMBOL(<worksheet>).

          TRY.

              DATA: o_salv TYPE REF TO cl_salv_table.

              cl_salv_table=>factory( IMPORTING

                                        r_salv_table   = o_salv

                                      CHANGING

                                        t_table        = <worksheet> ).

              o_salv>get_functions( )>set_all( abap_true ).

              o_salv>get_columns( )>set_optimize( abap_true ).

              o_salv>get_display_settings( )>set_list_header( ‘Worksheet’ ).

              o_salv>get_display_settings( )>set_striped_pattern( abap_true ).

              o_salv>get_selections( )>set_selection_mode( if_salv_c_selection_mode=>row_column ).

              LOOP AT o_salv>get_columns( )>get( ) ASSIGNING FIELDSYMBOL(<c>).

                DATA(o_col) = <c>r_column.

                o_col>set_short_text( || ).

                o_col>set_medium_text( || ).

                o_col>set_long_text( |{ o_col>get_columnname( ) }| ).

              ENDLOOP.

              o_salv>display( ).

            CATCH cx_root INTO DATA(e_txt).

              WRITE: / e_txt>get_text( ).

          ENDTRY.

        ENDIF.

      ENDIF.

    ENDIF.

  CATCH cx_root INTO DATA(e_text).

    MESSAGE e_text>get_text( ) TYPE ‘S’ DISPLAY LIKE ‘E’.

ENDTRY.

<?sap.transform simple?>

<tt:transform xmlns:tt=«http://www.sap.com/transformation-templates» xmlns:ddic=«http://www.sap.com/abapxml/types/dictionary» xmlns:def=«http://www.sap.com/abapxml/types/defined»>

  <tt:root name=«MAINDATA» type=«ddic:ZZZ_S_TEST_XLS»/>

  <tt:template>

    <?msoapplication progid=«Excel.Sheet»?>

    <Workbook xmlns=«urn:schemas-microsoft-com:office:spreadsheet» xmlns:o=«urn:schemas-microsoft-com:office:office» xmlns:x=«urn:schemas-microsoft-com:office:excel» xmlns:ss=«urn:schemas-microsoft-com:office:spreadsheet» xmlns:html=

«http://www.w3.org/TR/REC-html40»>

      <DocumentProperties xmlns=«urn:schemas-microsoft-com:office:office»>

        <Author>Pashigorev A.</Author>

        <LastAuthor>Пашигорев Александр Юрьевич</LastAuthor>

        <Created>20210304T13:13:54Z</Created>

        <LastSaved>20210305T09:52:44Z</LastSaved>

        <Company>Home</Company>

        <Version>16.00</Version>

      </DocumentProperties>

      <OfficeDocumentSettings xmlns=«urn:schemas-microsoft-com:office:office»>

        <AllowPNG/>

      </OfficeDocumentSettings>

      <ExcelWorkbook xmlns=«urn:schemas-microsoft-com:office:excel»>

        <WindowHeight>12285</WindowHeight>

        <WindowWidth>28800</WindowWidth>

        <WindowTopX>0</WindowTopX>

        <WindowTopY>0</WindowTopY>

        <ProtectStructure>False</ProtectStructure>

        <ProtectWindows>True</ProtectWindows>

      </ExcelWorkbook>

      <Styles>

        <Style ss:ID=»Default» ss:Name=»Normal»>

          <Alignment ss:Vertical=»Bottom»/>

          <Borders/>

          <Font ss:Color=»#000000″ ss:FontName=»Times New Roman» ss:Size=»12″ x:CharSet=»204″ x:Family=»Swiss»/>

          <Interior/>

          <NumberFormat/>

          <Protection/>

        </Style>

        <Style ss:ID=»s112″>

          <Alignment ss:Horizontal=»Center» ss:Vertical=»Bottom»/>

          <Borders>

            <Border ss:LineStyle=»Continuous» ss:Position=»Bottom» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Left» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Right» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Top» ss:Weight=»1″/>

          </Borders>

          <Interior ss:Color=»#D6DCE4″ ss:Pattern=»Solid»/>

        </Style>

        <Style ss:ID=»s113″>

          <Borders>

            <Border ss:LineStyle=»Continuous» ss:Position=»Bottom» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Left» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Right» ss:Weight=»1″/>

            <Border ss:LineStyle=»Continuous» ss:Position=»Top» ss:Weight=»1″/>

          </Borders>

        </Style>

        <Style ss:ID=»s114″>

          <Font ss:Bold=»1″ ss:Color=»#000000″ ss:FontName=»Times New Roman» ss:Size=»12″ x:CharSet=»204″ x:Family=»Roman»/>

        </Style>

        <Style ss:ID=»s116″>

          <Borders>

            <Border ss:LineStyle=»Continuous» ss:Position=»Bottom» ss:Weight=»1″/>

          </Borders>

        </Style>

      </Styles>

      <Worksheet ss:Name=«Лист1»>

        <Table ss:DefaultColumnWidth=«54» ss:DefaultRowHeight=«15.75» ss:ExpandedColumnCount=«3» x:FullColumns=«1» x:FullRows=«1»>

          <Column ss:AutoFitWidth=«0» ss:Width=«85.5»/>

          <Column ss:AutoFitWidth=«0» ss:Width=«65.25»/>

          <Column ss:AutoFitWidth=«0» ss:Width=«63.75»/>

          <Row ss:AutoFitHeight=«0»>

            <Cell ss:MergeAcross=«2» ss:StyleID=«s112»>

              <Data  ss:Type=«String» > <tt:value ref=«.MAINDATA.SHOP»/> </Data>

            </Cell>

          </Row>

          <Row ss:AutoFitHeight=«0»>

            <Cell ss:StyleID=«s113»>

              <Data ss:Type=«String»>Наименование</Data>

            </Cell>

            <Cell ss:StyleID=«s113»>

              <Data ss:Type=«String»>Цена</Data>

            </Cell>

            <Cell ss:StyleID=«s113»>

              <Data ss:Type=«String»>Количество</Data>

            </Cell>

          </Row>

          <tt:loop ref=«.MAINDATA.PRICELIST» name=«TABLE»>

            <Row ss:AutoFitHeight=«0»>

              <Cell ss:StyleID=«s113»>

                <Data ss:Type=«String»> <tt:value ref=«$TABLE.NAME»/> </Data>

              </Cell>

              <Cell ss:StyleID=«s113»>

                <Data ss:Type=«String»> <tt:value ref=«$TABLE.PRICE»/> </Data>

              </Cell>

              <Cell ss:StyleID=«s113»>

                <Data ss:Type=«String»> <tt:value ref=«$TABLE.COL»/> </Data>

              </Cell>

            </Row>

          </tt:loop>

          <Row ss:AutoFitHeight=«0»>

            <Cell ss:StyleID=«s114»>

              <Data ss:Type=«String»>Менеджер:</Data>

            </Cell>

            <Cell ss:Index=«3» ss:StyleID=«s116»>

              <Data ss:Type=«String» tt:valueref=«MAINDATA.MANAGER»>  </Data>

            </Cell>

          </Row>

        </Table>

        <WorksheetOptions xmlns=«urn:schemas-microsoft-com:office:excel»>

          <PageSetup>

            <Header x:Margin=«0.3»/>

            <Footer x:Margin=«0.3»/>

            <PageMargins x:Bottom=«0.75» x:Left=«0.7» x:Right=«0.7» x:Top=«0.75»/>

          </PageSetup>

          <Unsynced/>

          <Print>

            <ValidPrinterInfo/>

            <PaperSizeIndex>9</PaperSizeIndex>

            <HorizontalResolution>600</HorizontalResolution>

            <VerticalResolution>600</VerticalResolution>

          </Print>

          <Selected/>

          <Panes>

            <Pane>

              <Number>3</Number>

              <ActiveRow>30</ActiveRow>

              <ActiveCol>1</ActiveCol>

            </Pane>

          </Panes>

          <ProtectObjects>False</ProtectObjects>

          <ProtectScenarios>False</ProtectScenarios>

        </WorksheetOptions>

      </Worksheet>

      <Worksheet ss:Name=«Лист2»>

        <Table ss:DefaultColumnWidth=«54» ss:DefaultRowHeight=«15.75» ss:ExpandedColumnCount=«1» ss:ExpandedRowCount=«1» x:FullColumns=«1» x:FullRows=«1»>

          <Row ss:AutoFitHeight=«0»>

            <Cell>

              <Data ss:Type=«String»>Данные List 2</Data>

            </Cell>

          </Row>

        </Table>

        <WorksheetOptions xmlns=«urn:schemas-microsoft-com:office:excel»>

          <PageSetup>

            <Header x:Margin=«0.3»/>

            <Footer x:Margin=«0.3»/>

            <PageMargins x:Bottom=«0.75» x:Left=«0.7» x:Right=«0.7» x:Top=«0.75»/>

          </PageSetup>

          <Unsynced/>

          <Panes>

            <Pane>

              <Number>3</Number>

              <ActiveRow>2</ActiveRow>

            </Pane>

          </Panes>

          <ProtectObjects>False</ProtectObjects>

          <ProtectScenarios>False</ProtectScenarios>

        </WorksheetOptions>

      </Worksheet>

      <Worksheet ss:Name=«Лист3»>

        <Table ss:DefaultColumnWidth=«54» ss:DefaultRowHeight=«15.75» ss:ExpandedColumnCount=«1» ss:ExpandedRowCount=«1» x:FullColumns=«1» x:FullRows=«1»>

          <Row ss:AutoFitHeight=«0»/>

        </Table>

        <WorksheetOptions xmlns=«urn:schemas-microsoft-com:office:excel»>

          <PageSetup>

            <Header x:Margin=«0.3»/>

            <Footer x:Margin=«0.3»/>

            <PageMargins x:Bottom=«0.75» x:Left=«0.7» x:Right=«0.7» x:Top=«0.75»/>

          </PageSetup>

          <Unsynced/>

          <ProtectObjects>False</ProtectObjects>

          <ProtectScenarios>False</ProtectScenarios>

        </WorksheetOptions>

      </Worksheet>

    </Workbook>

  </tt:template>

</tt:transform>

Рано или поздно каждый консультант сталкивается с задачей быстрой и эффективной обработки большого массива данных из системы. Предметная область тут неважна. Многие компании практически не используют современные аналитические решения на благо повседневной трудовой деятельности. Причин тому много, но сегодня речь о другом. Наиболее типичные ситуации, это сверка данных при миграции данных или выгрузка большого объема данных из системы с целью последующей обработки в MS Excel. В 99% случаев будут именно такие задачи.

Вроде бы что сложного в выгрузке данных из отчета в системе? Совершенно ничего, когда мы говорим о паре десятков или сотен строк. Если речь идет о десятках тысяч строк или сотен тысяч строк, то мировоззрение начинает меняться. Попробуйте в ваших системах запустить оперативный запрос с даты старта SAP по паре инфотипов. А потом все это выгрузите и нарисуйте несколько формул рядом.

Исходя из моего опыта, могу дать некоторые базовые советы.

Совет 1. Выгрузка в MS Excel может быть осуществлена множеством способов. Даже нажимая одну кнопочку выгрузки разные системы обрабатывают событие по-разному. В ALV отчетах есть две возможность выгрузить данные в файл.

Левая кнопочка  зависимости от версии системы либо откроет MS Excel Inplace (то есть внутри системы откроется XLS файл). Очень неудобно, мелко, но достаточно для просмотра пары записей. Файл можно сохранить. В другом случае система спросит, в каком формате желаете выгрузить данные.

По умолчанию у всех стоит первый вариант — MHTML. И не дай вам чебурашке выгружать тысячи записей в этом формате. Система внутри готовит данные, потом запускает XLST трансформацию и вываливает все это в страшненький полу-HTML код. Это занимает очень много памяти на сервере и часто приводит к дампам. При открытии такого файла Excel наоборот производит конвертацию из XML файла в свой XLS формат, что, по сути, дублирует работу. Если выгружать сразу в Excel XLS/XLSX формате, то лишние действия не производятся, файл выгружается существенно быстрее.

Если вы нажимаете вторую кнопочку в панели инструментов, то открывается вот такое окно:

Здесь выбираем ‘Text with Tabs». Это единственный правильный вариант выгрузки данных без каких-либо преобразований. Это самый быстрый вариант. Данные вылетают пулей, ложатся в плоский текстовый файл и не жужжат. У подхода есть один недостаток — надо открыть файл ручками, удалить саповский кривой заголовок с названием отчета/транзакции и даты запуска. После этого такой файл легко импортируется в Excel/Access/MySQL/SQLite или еще куда. Сохраняется все оригинальное форматирование из базы данных. И это БЫСТРО, ОЧЕНЬ быстро.

Совет 2. Допустим вы открыли мегафайл. Сделали колонку с парой функций внутри и протянули на все тысячи строк. Все, «давай, до-свидания». Глупый Excel начнет проявлять клиенто-ориентированность и будет сразу все обсчитывать. Каждая новая колонка будет увеличивать время обработки данных. Чтобы избежать таких инсенуаций, нужно перед началом работы с файлом отключить автоматический обсчет формул. Это делается на закладке «Формулы». На английском это Calculation Options. После этого спокойно пишем формулы, по кнопочке F9 тестируем результат. Практикуемся на небольшом объеме данных. Когда все отладили, протягиваем, нажимаем F9 и идем за кофе. Результат будет достигнут в разы быстрее.

Совет 3. Если мы уже в Excel сделали много формул, а дальше хотим развивать мысль, то рекомендуется сделать копию файла и заменить все формулы на значения. Копируем колонку/строку и вставляем на саму себя с опцией «Как значения». Это заменит все формулы на уже посчитанные значения, а значит системе не нужно пересчитывать все миллионы комбинаций при каждом изменении данных или формул.

Совет 4. Если вам нужно что-то удалить на больших данных, отфильтровать и удалить, то всегда сначала сортируйте данные, а потом включайте фильтр или производите удаление. На сортированных данных фильтрация и удаления происходят раза в два быстрее.

Совет 5. Если вам нужно обрабатывать всякие меппинги, справочники, то выгружать данные нужно по второму варианту из совета 2 в текстовый файл. Это сохранит все форматирование «как было». Плюс, при импорте данных выделите все столбцы и укажите тип «Текст». Это запретит Excel думать и преобразовывать данные на свой манер. Так, для справочника значение «01» останется как «01», а не 1. При сравнениях это очень сильно вредит.

Совет 6. Ключевые вещи, которые должен знать каждый консультант: Pivot table, INDEX, MATCH, VLOOKUP, SUMIF, IFNA, IF, VALUE, REPLACE, Named Ranges, Data Validation, Data Analyses.

В своей статье Дэвид Данкомб описывает использование класса вывода данных внутренних таблиц для динамической генерации форматированного представления хранимых данных во время выполнения программы с поддержкой вывода данных в рабочую книгу Microsoft Excel. В результате пользователи получают более естественный способ форматирования выбранных данных.

Ключевое понятие

Библиотека iXML представляет собой API с базовыми сервисами Extensible Markup Language (XML). Эти сервисы могут использоваться для создания документов в формате XML в целях дальнейшего представления таких данных в рабочей книге Microsoft Excel.

В своей первой статье, посвященной созданию класса по форматированному представлению данных таблиц, автор описал возможность динамической генерации форматированного представления внутренней таблицы во время выполнения программы с поддержкой последующего вывода таких данных в разных форматах. Теперь рассмотрим расширение данного класса. Это расширение создается на основе исходной реализации путем предоставления поддержки вывода данных в рабочую книгу Microsoft Excel.

Рассмотрим, почему этот дополнительный формат вывода в рабочую книгу Microsoft Excel так полезен, а затем кратко сравним оба доступных варианта экспорта данных в Microsoft Excel из среды SAP NetWeaver. Далее в статье будет описана демонстрационная программа, основное внимание будет удалено новым возможностям класса. Кроме того, уделим внимание изменениям в реализации для класса. Внесенные изменения используются для предоставления расширенной функциональности.

Примечание.
Первая статья автора Generate a Formatted Representation of Internal Tables for Output (Динамическое создание форматированного представления внутренних таблиц) содержит подробные данные по реализации исходного класса, выполняющего форматированное представление данных таблицы. Поскольку основное внимание в этой статье уделено необходимым изменениям к исходной реализации, читателям важно иметь правильное представление об исходной реализации. Поэтому перед чтением данной статьи рекомендуется изучить первую статью автора, если вы этого еще не сделали.

Код реализованных программ можно получить по следующим ссылкам:

Нажмите здесь, чтобы просмотреть код для программы z_introspector_load_text, формирующей тестовую таблицу с длинным текстами.

Нажмите здесь, чтобы просмотреть исходный код для демонстрационной программы z_introspector_excel_demo, выгружающей тестовую таблицу с длинными текстами в формате Microsoft Excel.

Нажмите здесь, чтобы просмотреть исходный код для класса, выводящего данные внутренней таблицы в различных форматах представления zcl_bc_table_introspector_source.

Нажмите здесь, чтобы просмотреть общий файл описания (Readme) по реализации класса вывода таблиц в различных форматах.

Экспорт данных в Microsoft Excel

Распространенным бизнес-требованием является доступность вывода данных из SAP-системы в виде файла Microsoft Excel. Причины таких запросов различны. Некоторым пользователям просто удобнее работать в приложении для электронных таблиц. Другие предпочитают расширенные опции форматирования или обработки, которые доступны только в приложении для электронных таблиц. Например, многим пользователям требуется возможность сортировки данных или применения условного форматирования на основе каких-либо формул.

Во многих случаях эти разнообразные требования можно удовлетворить, предоставив функцию вывода данных в текстовые файлы с разделителем, например запятой (так называемый формат CSV). Формат файла CSV широко используется, данные в таком файле содержат произвольное количество записей, разделенных символами перевода строки или иногда двумя символами: перевод строки и возврат каретки. Каждая запись, в свою очередь, делится на поля, разделенные, как правило, символами табуляции или запятыми. После вывода данных в файле CSV этот файл можно открыть в приложении для электронных таблиц. Далее пользователь может обработать данные с применением расширенных функций.

Однако в некоторых ситуациях выполнить требования пользователей посредством простого файла CSV трудно или даже невозможно. Одним из наиболее распространенных требований, которое затруднительно удовлетворить с помощью файла CSV, является вывод данных подробных текстов. Несмотря на то, что представить подробный текст в формате CSV возможно, работать с таким текстом, занимающим большое число строк, попросту неудобно. В этом случае желательно представить данные в виде электронной таблицы, поскольку концепция ячеек позволяет хранить такой текст в удобном для представления и обработки виде.

Необходимость представлять данные подробных текстов является основной причиной расширения класса, описанного в первой статье. После добавления нового типа вывода для представления данных в виде рабочей книги Microsoft Excel вы сможете с легкостью работать с длинными текстами, находящимися в системе. Кроме того, новый тип вывода позволяет использовать другие возможности, доступные только в формате электронной таблицы. Эти функции рассматриваются ниже в соответствующих разделах данной статьи.

В следующих разделах кратко описаны некоторые доступные опции для создания файлов, которые могут использовать возможности форматирования и обработки Microsoft Excel. Всеобъемлющее описание релевантных опций выходит за рамки данной статьи. Для получения дополнительной информации о всех возможностях технологий SAP посетите веб-сайт http://help.sap.com.

Object Linking and Embedding Automation (OLE)

Технология OLE разработана в компании Microsoft для упрощения обмена данными между процессами. Этот механизм предоставляет сервер автоматизации для экспорта объектов автоматизации, которые далее могут быть обработаны клиентами автоматизации посредством свойств и методов. Таким образом, настольные приложения (в том числе Microsoft Excel) могут выступать в роли сервера автоматизации для предоставления своих функций сторонним приложениям.

Технология OLE поддерживается в ABAP с помощью набора специфичных для OLE языковых элементов. В этот набор входят команды CREATE OBJECT, CALL METHOD, GET PROPERTY, SET PROPERTY и FREE OBJECT. Для каждой команды необходимо выполнить мэппинг модулей OLE в SAPGUI, для вызова которых используется техники Remote Function Call (RFC). Таким образом, SAPGUI в данном случае представляет собой клиент автоматизации и может работать как промежуточное звено при обмене данными между ABAP-программой и сервером автоматизации.

Обратите внимание на то, что поскольку технология OLE работает на базе подключений из ABAP-программы к GUI-фронтэнду (где находятся клиент и сервер автоматизации), выполнить программу в фоновом рабочем процессе невозможно. Во многих случаях это может быть серьезным недостатком.

Desktop Office Integration (DOI)

Технология DOI предоставляет объектно-ориентированную оболочку для технологии автоматизации OLE. На высоком уровне в качестве промежуточных звеньев при обмене данными между SAP-системой и настольным приложением используются два специальных средства контроля. SAP Document Container Control находится в SAPGUI и осуществляет коммуникацию с настольным приложением посредством интерфейса OLE. SAP Data Provider отвечает за буферизацию данных SAP, которые можно вставить в документы с использованием ссылок.

Обработка на базе XML

Extensible Markup Language (XML) – это метаязык, предназначенный для моделирования произвольных форматов документов. Правила кодирования документов можно найти в схеме XML, которая отвечает за формальное определение ограничений по структуре и содержимому документов. Несмотря на то, что XML является, возможно, самым известным форматом для обмена данными по сети Интернет, он, помимо этого, используется во многих других приложениях. В частности, он используется во многих пакетах офисных программ для представления данных в форматах файлов документов.

Форматы XML Microsoft Office 2003 предлагают новый способ представления документов в Microsoft Office. Общедоступность схем дает разработчикам возможность воспользоваться преимуществами нового формата на базе XML для создания документов на лету. SpreadsheetML – это схема XML, которая используется в Microsoft Excel 2003.

С версии Microsoft Office 2007 используется формат файлов Office Open XML (OOXML). В отличие от более ранних схем, в которых форматы XML хранились в виде отдельных монолитных XML-файлов, OOXML хранит данные и метаданные в многокомпонентном архиве. Стандарт OOXML обеспечивает повышенную надежность, эффективность и безопасность.

По сравнению с технологиями OLE и DOI обработка на базе XML имеет ряд преимуществ:

  • обработку можно выполнять с использованием фоновых рабочих процессов;
  • можно оптимизировать производительность обработки;
  • можно реализовать простой процесс вложения созданных файлов в сообщения электронной почты;
  • доступны опции расширенного форматирования.

Далее рассматриваются некоторые технологии создания XML, подходящие для применения в Microsoft Excel.

iXML

Библиотека iXML предлагает три базовых сервиса:

  • Синтаксический анализатор XML использует XML-документ в качестве ввода и создает в оперативной памяти его представление после проверки правильности синтаксиса. Для получения доступа к представлению используются модули обработки Simple API for XML (SAX) и Document Object Model (DOM).
  • Реализация XML DOM обеспечивает представление структуры и содержимого XML-документа посредством классов и интерфейсов. Программист получает возможность манипулирования элементами, атрибутами и текстовыми данными.
  • Рендерер XML записывает представление XML-документа в оперативной памяти в поток байтов.

Библиотека iXML реализована на C++ и выполняется в ABAP-ядре. Доступ к библиотеке iXML можно получить из версии SAP-базиса 4.6C. Для этой библиотеки определена оболочка, которая реализована в виде ряда классов и интерфейсов ABAP-объектов, что позволяет вызывать эту библиотеку напрямую из ABAP-программы.

Язык XSLT

Язык преобразования стилей XSLT (Extensible Stylesheet Language Transformations) позволяет преобразовать данные исходного объекта в данные целевого объекта, используя заданную таблицу стилей. Объектами данных могут быть XML-документ или структура данных ABAP. Для создания преобразования сначала в виде объекта репозитария создается программа, реализующая обработку XSLT. Далее она вместе с исходным объектом данных используется в качестве ввода для обработчика XSLT, который, в свою очередь, генерирует целевой объект данных. Для запуска программ XSLT в среде ABAP используется оператор преобразования вызовов.

Simple Transformation

Simple Transformation (ST) – собственный язык SAP, предназначенный для упрощения преобразования данных между ABAP и XML. Применяемый подход концептуально аналогичен методике работы с XSLT. Однако ST просто преобразует объекты данных ABAP в XML (и наоборот). Программы на ST являются симметричными: в одной программе закодированы инструкции по сериализации и десериализации. Оператор преобразования вызовов является универсальным и может использоваться для выполнения программ ST (как и программ XSLT).

ABAP2XLSX

ABAP2XLSX – это проект сообщества, который предлагает упрощенную объектно-ориентированную архитектуру для создания документов OOXML напрямую из ABAP. В отличие от предыдущих технологий, которые предоставляют общие возможности обработки XML, ABAP2XLSX ориентирован именно на работу с документами Microsoft Excel. По сути, этот инструмент обеспечивает уровень абстракции, который скрывает подробные данные, обрабатываемые с использованием библиотек нижних уровней. Абстракция упрощает работу с функциями, связанными с электронными таблицами, и снимает проблему внешнего вида рабочих книг XML. Доступны расширенные функции: формулы, множественные листы, условное форматирование, формат ячеек данных и графики.

В пакет распределения для ABAP2XLSX входит набор демонстрационных программ. По коду в этой программе видно, насколько просто создать новую рабочую книгу, определить ее заголовок и затем заполнить ячейки.

На этом обзор опций экспорта данных в формат Excel завершен. Ниже описано создание файла SpreadsheetML расширенным классом вывода данных внутренней таблицы с помощью библиотеки iXML. Формат SpreadsheetML предоставляет многие возможности, доступные в формате OOXML, но предлагает компромисс для упрощения обработки (создается только один файл). С помощью библиотеки iXML можно динамически создавать требуемые XML-элементы из информации, которая становится известной только во время выполнения.

перед тем, как подробно рассказать о реализации, сначала я представлю демонстрационную программу.

Демонстрационная программа для расширенного самоанализа таблиц

Я изменил простую демонстрационную программу, использованную в предыдущей статье, чтобы показать расширенные возможности нового класса вывода данных таблиц. Как и раньше, данные для заполнения внутренней таблицы во время выполнения относятся к универсальной модели данных авиарейсов, которая часто используется в примерах от SAP. Однако поскольку в модели не хранятся подробные тексты, необходимые для демонстрации расширенных возможностей класса, требуется немного дополнить модель.

Основная идея заключается в сохранении обзорного описания каждой авиакомпании в модели. Для этого необходимо создать пользовательский текстовый объект и идентификатор текста. После этого следует загрузить собственно текстовые строки. Перед запуском демонстрационной программы изучите ознакомительный файл описания (Readme) для расширенной утилиты самоанализа таблиц, в котором содержатся инструкции по ее настройке.

Обратите внимание на то, что по сравнению с предыдущей версией демонстрационной программы на экране выбора доступны опции, связанные с новыми функциями, которые предлагает формат SpreadsheetML (Рис. 1). На экране выбора отображаются доступные опции для указания автора документа и имени листа. Кроме того, опция заморозки заголовка позволяет пользователю запросить отображение строки заголовка во время прокрутки остальных разделов листа.

Рис. 1

Экран выбора демонстрационной программы

Основной метод, показанный на Рис. 2, отличается от исходной демонстрационной программы. Несмотря на то, что применяется аналогичная базовая конструкция, требуются изменения в трех основных областях. Во-первых, подробные данные рейсов, извлеченные из базы данных, требуется дополнить подробным текстом, описывающим каждую авиакомпанию. Во-вторых, теперь необходимо передать в стандартный метод другой набор опций для инициализации объекта реализующего класс и получения преимуществ формата SpreadsheetML. В-третьих, необходимо вызвать новый метод-получатель для возврата представления SpreadsheetML для последующего представления данных.

Рис. 2

Демонстрационная программа

Эти изменения более подробно рассматриваются ниже. После создания инстанции локального класса вызовите следующие методы.

1. Первым вызывается метод load_data, который, как и раньше, вызывает функцию BAPI bapi_flight_getlist для заполнения требуемой внутренней таблицы (Рис. 3). Кроме того, данные списка рейсов, возвращенные из функции BAPI, дополняются подробными текстами. Ключ текста создается с использованием объекта текста, идентификатора текста, языка и идентификатора авиакомпании. Этот ключ итерационно передается в метод read_text для возврата строк текста по каждой авиакомпании. Внутренняя таблица сохраняется в виде атрибута инстанции в локальном классе.

Рис. 3

Заполнение внутренней таблицы данными списка рейсов (с текстовыми строками)

2. Второй метод отвечает за инициализацию класса по работе с данными таблицы с использованием соответствующего стандартного метода. Помимо передаваемых в этот метод данных рейсов предоставляются также специфичные для пользователей опции форматирования. Некоторые новые опции связаны с форматированием и важны только при работе с форматом SpreadsheetML. Три из таких опций уже были представлены на экране выбора в демонстрационной программе (см. Рис. 1): «Author» (Автор), «Sheet Name» (Имя листа) и «Freeze Header Line» (Зафиксировать строку заголовка). Эти опции относятся к параметрам стандартного метода im_author, im_sheet_name и im_freeze_header соответственно.

Помимо этих опций существует еще три полезных для программиста опции на нижнем уровне. Параметр im_header_color устанавливает цвет строки заголовка в соответствии с перечислимой константой. Параметр im_string_cell_width устанавливает ширину символа для ячейки строки. Параметр im_points_factor устанавливает число точек на отображаемый символ.

После завершения работы метода класса объект обработки таблицы возвращается и сохраняется в качестве атрибута инстанции локального класса. Подробно это можно представить в виде кода, показанного на Рис. 4.

Рис. 4

Вызов класса вывода данных внутренних таблиц

3. Третий вызов метода относится к методу выгрузки. К этому этапу выполнения программы уже проделана большая работа по анализу прочитанных данных, и теперь требуется только вызвать соответствующий метод-получатель. В данном случае требуется выгрузить файл на диск с использованием формата SpreadsheetML. Просто вызовите метод-получатель get_xml_rendition. Таблица, возвращаемая после этого вызова, подходит для немедленной передачи в стандартный метод cl_gui_frontend_services=>gui_download (Рис. 5).

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

Зарегистрироваться

У вас уже есть учетная запись?

Войти

Понравилась статья? Поделить с друзьями:
  • Sap отчеты в excel
  • Sap нет выгрузки в excel
  • Sap выгрузка в excel с заголовком
  • Sap to excel macro
  • Sap pdf to word