Перед разработчиком часто встает задача создания документа WORD. Основная проблема заключается в том, что SAP так и заимел удобного инструмента для данного процесса. И если для создания документа в диалогом режиме можно воспользоваться всем любимыми ФМами ZWWW*, то для создания в фоне зачастую используют трансформации, что является очень не удобным в сопровождении.
На помощь, в данном случае, приходит формат docx. Это, как известно, по сути архив с отдельными файлами, одним из которых является XML документ, который содержит в себе разметку и текст документа. Для работы с DOCX существует специальный класс CL_DOCX_DOCUMENT. При этом сам документ, мы можем хранить в репозитарии как и любой другой шаблон, править его может любой консультант.
рис.1. Документ DOCX, открытый при помощи архиватора
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 |
DATA: lo_document TYPE REF TO cl_docx_document. DATA: lo_main_part TYPE REF TO cl_docx_maindocumentpart. DATA lv_xtext TYPE xstring . DATA lv_text TYPE string . DATA lv_text_out TYPE string. DATA lv_xlm_xstring TYPE xstring. DATA lt_temptable TYPE w3mimetabtype. DATA lv_bin_filesize TYPE i. "Ранее мы прочитали файл CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = '2147483647' IMPORTING buffer = lv_xcontent TABLES binary_tab = lt_content EXCEPTIONS OTHERS = 2. "Получаем текст документа lo_document = cl_docx_document=>load_document( lv_xcontent ). CHECK lo_document IS NOT INITIAL. lo_main_part = lo_document->get_maindocumentpart( ). lv_xtext = lo_main_part->get_data( ). lv_text = cl_openxml_helper=>xstring_to_string( lv_xtext ). |
Заменяем метки в документе. Когда печатаем метки в документе есть одна проблема, хоть при открытии документа WORD мы видим ее одним словом, реально в xml но разбивается по нескольким тегам и REPLACE в данном случае не поможет. Я вставляю метки в документ DOCX предварительно набирая их, например, в блокноте. В таком случае в xml метка не разобьется тегами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"Любая подпрограмма замены меток PERFORM replacement_fields USING lv_text CHANGING lv_text_out. "Собираем документ обратно lv_xtext = cl_openxml_helper=>string_to_xstring( lv_text_out ). lo_main_part->feed_data( lv_xtext ). lv_xlm_xstring = lo_document->get_package_data( ). " Далее можем делать все что захотим. Сохранять, выгружать и т.д. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_xlm_xstring IMPORTING output_length = lv_bin_filesize TABLES binary_tab = lt_temptable. |
Спасибо за статью!
Чтобы не копировать “метки” из блокнота, можно сбросить форматирование текста меток – помогает;)