среда, 17 июля 2013 г.

Выгрузка в Excel через текстовые файлы.

    Данный вид выгрузки не плохо подойдет, если необходимо выгрузить таблицу огромных размеров. Например, выгрузка пятидесяти тысяч записей в excel проходит за полторы минуты. В принципе данная выгрузка достаточно проста в использовании, имеет шаблонный вид, что очень удобно. Я использую ее по умолчанию, для всех своих разработок, главное что бы были полномочия на транзакцию SMW0, и разрешения на сохранение документа на компьютер пользователя. Данный код можно выделить в отдельный ФМ или подпрограмму, для более удобного использования.

*&---------------------------------------------------------------------*
*& Report  Z_UNLOAD_EXCEL
*& Выгрузка в EXCEL ч/з текстовые файлы
*&---------------------------------------------------------------------*
report  z_unload_excel.
include ole2incl.
datalv_file type rlgrap-filename,
      formname 
type wwwdatatab-objid value 'ZMS_EXL3'"имя объекта SMW0
      filename 
type rlgrap-filename,
      filenametxt 
type rlgrap-filename.
"<<< Таблица для примера
datagt_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.

  
dataapplication 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.

  
datatempdir 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(sywith 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.
  
dataext(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(swwwwith 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.
  
datalv_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 <> or lv_return <> 0exitendif.
    cv_file 
lv_fullpath.
    
if cv_file lv_fullpathexitendif.
    
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. Выгрузка готова, можно пользоваться.

Комментариев нет:

Отправить комментарий