Данный вид выгрузки не плохо подойдет, если необходимо выгрузить таблицу огромных размеров. Например, выгрузка пятидесяти тысяч записей в excel проходит за полторы минуты. В принципе данная выгрузка достаточно проста в использовании, имеет шаблонный вид, что очень удобно. Я использую ее по умолчанию, для всех своих разработок, главное что бы были полномочия на транзакцию SMW0, и разрешения на сохранение документа на компьютер пользователя. Данный код можно выделить в отдельный ФМ или подпрограмму, для более удобного использования.
*&---------------------------------------------------------------------*
*& Report Z_UNLOAD_EXCEL
*& Выгрузка в EXCEL ч/з текстовые файлы
*&---------------------------------------------------------------------*
report z_unload_excel.
include ole2incl.
data: lv_file type rlgrap-filename,
formname type wwwdatatab-objid value 'ZMS_EXL3', "имя объекта SMW0
filename type rlgrap-filename,
filenametxt type rlgrap-filename.
"<<< Таблица для примера
data: gt_sflight like sflight occurs 0.
select * from sflight into table gt_sflight.
">>> Таблица для примера
" Запрашиваем имя файла
perform get_file_name changing lv_file.
check not lv_file is initial.
" Выгружаем шаблон
perform download_template using formname lv_file.
" Выгружаем таблицу в текстовый файл
perform download_file using formname gt_sflight changing filenametxt.
" Запускаем макрос
perform run_macros using filenametxt lv_file.
*&---------------------------------------------------------------------*
*& Form run_macros
*&---------------------------------------------------------------------*
form run_macros using p_filenametxt type rlgrap-filename
p_filename type rlgrap-filename.
data: application type ole2_object,
workbooks type ole2_object.
create object application 'EXCEL.APPLICATION'.
if sy-subrc <> 0.
message e011(zst).
endif.
get property of application 'Workbooks' = workbooks.
* Открываем макрос
call method of
workbooks
'Open'
exporting
#1 = p_filename.
free object workbooks.
* Запускаем макрос, указывая имя файла с данными
call method of
application
'Run'
" передоваемые параметры до 12 шт.
exporting
#1 = 'StartExecute'
#2 = p_filenametxt
* #3 = p_3
* #4 = p_4
* #5 = p_5
* #6 = p_6
* #7 = p_7
* #8 = p_8
* #9 = p_9
* #10 = p_10
* #11 = p_11
* #12 = p_12
.
free object application.
* Удаляем макрос с клиента
call function 'WS_FILE_DELETE'
exporting
file = p_filenametxt.
endform. "run_macros
*&---------------------------------------------------------------------*
*& Form download_file
*&---------------------------------------------------------------------*
form download_file using p_formname type wwwdatatab-objid
fp_table type standard table
changing p_filenametxt type rlgrap-filename.
data: tempdir type rlgrap-filename.
call function 'GUI_GET_DESKTOP_INFO'
exporting
type = 4
changing
return = tempdir.
concatenate tempdir '\' p_formname '-' sy-timlo '.txt' into p_filenametxt.
call function 'WS_DOWNLOAD'
exporting
filename = p_filenametxt
filetype = 'DAT'
tables
data_tab = fp_table
exceptions
others = 9.
check sy-subrc ne 0.
set country ''.
* Удаляем фаил-txt с клиента
call function 'GUI_DELETE_FILE'
exporting
file_name = p_filenametxt.
message e129(sy) with p_filenametxt 'WS_DOWNLOAD'.
endform. "f_ws_download
*&---------------------------------------------------------------------*
*& Form download_template
*&---------------------------------------------------------------------*
form download_template using p_formname type wwwdatatab-objid
p_filename type rlgrap-filename.
data: ext(255),
sy_subrc type sy-subrc,
w_key type wwwdatatab.
call function 'WWWPARAMS_READ'
exporting
relid = 'MI'
objid = p_formname
name = 'fileextension'
importing
value = ext
exceptions
others = 1.
if sy-subrc <> 0.
message e000(swww) with p_formname.
stop.
endif.
w_key-relid = 'MI'.
w_key-objid = p_formname.
call function 'DOWNLOAD_WEB_OBJECT'
exporting
key = w_key
destination = p_filename
importing
rc = sy_subrc.
endform. " DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& Form get_file_name
*&---------------------------------------------------------------------*
form get_file_name changing cv_file type rlgrap-filename.
data: lv_fullpath type string,
lv_path type string,
lv_file type string,
lv_return type i.
do.
clear cv_file.
call method cl_gui_frontend_services=>file_save_dialog
exporting
default_extension = 'xls'
default_file_name = lv_file
file_filter = cl_gui_frontend_services=>filetype_excel
initial_directory = lv_path
changing
filename = lv_file
path = lv_path
fullpath = lv_fullpath
user_action = lv_return
exceptions
others = 4.
if sy-subrc <> 0 or lv_return <> 0. exit. endif.
cv_file = lv_fullpath.
if cv_file = lv_fullpath. exit. endif.
message 'Полное имя файла должно быть не более 128 символов!' type 'S' display like 'E'.
enddo.
endform. "get_file_name
Далее, нужно создать шаблон excel-файла, в котором будет запускаться макрос. Макрос будет подгружать данные из текстового файла. Там же можно создать макрос который будет запускать форматирование полученных данных в excel.
Создайте excel-файл. Откройте его и нажмите ALT+F11. Слева в окне Project Explorer нажмите правую кнопку мыши и выберите insert -> module. В открывшемся окне вставьте текст:
Sub StartExecute(ByVal fp_FileTab As String)
Open_File Application.ThisWorkbook, fp_FileTab, 1, "A1"
Application.DisplayAlerts = False
Range("A1").Select
ActiveWorkbook.Save
Application.Visible = True
End Sub
'--------------'
' открытие файла '
'--------------'
Private Sub Open_File(ByVal f_wb As Workbook, _
ByVal f_FileName1 As String, _
ByVal f_Idx As Integer, _
ByVal f_Range As String)
Dim wb As Workbook
Workbooks.OpenText Filename:=f_FileName1, Origin:=xlWindows, DataType:=xlDelimited, _
other:=True, otherchar:="|", Tab:=True
Set wb = Application.ActiveWorkbook
wb.ActiveSheet.UsedRange.Copy (f_wb.Sheets(f_Idx).Range(f_Range))
wb.Close
End Sub
Все шаблон готов, сохраняем и закрываем его. Шаблон excel-файла сохраняем ч/з транзакцию SMW0. Имя объекта для SMW0 выбирайте сами, это не принципиально, в моем случае это ZMS_EXL3. Выгрузка готова, можно пользоваться.
Комментариев нет:
Отправить комментарий