Есть возможность сделать то же самое, только с помощью ФМ?
Проблемка. Потому что при двойном вызове EXCEL_OLE_STANDARD_DAT (имена файла, и листов указаны) происходит следующее - первый вызов открывает excel и экспортирует в указанный файл указанный лист, при втором вызове создается новый временный файл с другим указанным листом.
Если я вас правильно понял, то Вы хотите чтобы создался второй лист в существующем файле. Этот функциональный модуль не предназначен для этого. Симптомы, которую Вы описали, как раз говорят о том, что Вы пытаетесь открыть экземпляр Excel, когда в памяти находится незакрытый Excel.
Можно попробовать, но не факт, что это получится, сначала загрузить первый Лист, сохранить и закрыть Excel, чтобы он не висел в процессах, и попробовать загрузить вторую таблицу в другой Лист уже существующего файла.
Если это не получится, то используйте алгоритм, описанный в теме
http://www.sapnet.ru/viewtopic.php?t=107
Проблема как раз в том, что не хочется столько кода OLE писать для ерундовой задачки, вот и вопрос ЕСТЬ ЛИ ФУНКЦИОНАЛЬНЫЕ МОДУЛИ для этого. Я их в интернете не нашел, да и по ходу их и не существует для этого. А закрывать процесс, это конечно решение, но понимаю, что не идеальное. Остается использовать похожий алгоритм, указанный по ссылке, и на нем свой ФМ сделать.
Как правило Все разработчики имеют готовый универсальный шаблон для таких типовых операций, как вывод в Excel/ALV.
Можете использовать готовый ФМ для выгрузки данных в WORD, EXCEL автора Parazit, в нем реализована работа с листами в Excel
http://viktorov.narod.ru/programming/myprograms/index.htm
Или же взять оттуда идеи.
Хочу выразть свое субъективное мнение по поводу метода описанного здесь http://www.sapnet.ru/viewtopic.php?t=107. Данные копируются из клипбоарда и соответсвенно не форматируются, то есть поле записи внутренней табличке не взаимоднозначны с ячейками в экселе.
Программисты SAP в ФМ 'EXCEL_OLE_STANDARD_DAT' использовали метод копирования внутренней таблицы во временный файл. Далее из файла данные копируются в Excel. Видимо к такому не совсем хорошему методу привело отсутствие соответствующего инструментария, более того если у вас файл называется system.xls и в той же директории находиться system.dat, то ФМ вам не поможет - будет вызвано исключение. В этом же дефолтном ФМ кроются недостатки двойного вызова.
Вот было бы просто прекрасно, если бы можно было форматировать clipboard данные для вставки в Excel, либо форматировать непосредственно при Paste.
Как это возможно в методе Excel MS Basic - Application.Workbooks.Open(filename,..)
Вот было бы просто прекрасно, если бы можно было форматировать clipboard данные для вставки в Excel, либо форматировать непосредственно при Paste.
Как это возможно в методе Excel MS Basic - Application.Workbooks.Open(filename,..)
К сожалению формат у Excel закрытый, поэтому такие форматирования все равно бы пришлось делать через вызов OLE2 методов, а это будет медленно.
Так что советую обратить внимание на I_OI_SPREADSHEET интерфейс.
Да, спасибо, это нужная библиотека для моего случая. Но как назло табличка не копируется в лист
Code:
* используем interface I_OI_SPREADSHEET и I_OI_DOCUMENT_PROXY
DATA control TYPE REF TO i_oi_container_control.
DATA document TYPE REF TO i_oi_document_proxy.
DATA container TYPE REF TO cl_gui_custom_container.
DATA link_server TYPE REF TO i_oi_link_server.
DATA document_type TYPE soi_document_type
VALUE SOI_DOCTYPE_EXCEL_SHEET.
DATA error TYPE REF TO I_OI_ERROR.
DATA retcode TYPE SOI_RET_STRING.
DATA spreadsheet TYPE REF TO i_oi_spreadsheet.
DATA document_url(256) TYPE c.
DATA range_name(5) TYPE c VALUE 'Range'.
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING control = control
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING type = 'E'.
CALL METHOD c_oi_errors=>show_message
EXPORTING type = 'E'.
Метод insert_one_table просто ничего не делает. Внутри ошибок не происходит. Lt_Fieldnames заполняю полностью кроме имени таблицы так как она динамическая. Пробовал подставлять вместо динамической таблицы <xls_table> статический вариант, также никаких реакций. Все что я вижу это открытый пустой лист экселя с выделенной областью, которая выделяется сразу после set_selection. Так что вопрос остается открытым. Теперь уже на счет метода insert_one_table. Перепробовал разные варианты c использованием Range и без него, разные варианты параметры updating. ничего не помогает.
Все, аллелуйя!! Наконец-то получилось. В моем коде выше необходимо добавить непосредственно перед вызовом insert_one_table следующее:
Code:
REFRESH lt_fieldnames. " я заполнял ее в ручную, поэтому пишу Refresh
call function 'DP_GET_FIELDS_FROM_TABLE'
tables
data = <xls_table>[]
fields = lt_fieldnames[].
Таким образом, все работает. Единственное теперь потребуется проформатировать вставленную табличку - длина столбцов шрифт и т д.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.