Мы у себя применяем обработку функцией ПЕЧСИМВ файлов Excel из ABAP. Ниже я надергал иллюстрирующих фрагментов. Законченный пример предоставить не могу - по техническим и этическим причинам. Но эти фрагменты кода вполне успешно работают в продуктиве и по ним вполне можно освоиться с подходом.
Общая схема такова. Есть файл Excel с данными, которые надо загрузить в SAP. В первой строке файла находятся технические имена полей. Список полей (столбцов), которые надо подвергнуть обработке функцией ПЕЧСИМВ, задается внутренней таблицей gt_cleanedfields. В цикле бежим по этой таблице, находим по имени колонку на листе Excel и выполняем для нее VB-процедуру processColumn. Выполняем при помощи ActiveX MSScriptControl (просьба самостоятельно погуглить по форуму - я уже выкладывал несколько законченных примеров на эту тему). Все эти манипуляции делаются перед собственно передачей данных из Excel в ABAP.
Code:
======================================================
ФРАГМЕНТ 1. Инициализация MSScriptControl
======================================================
"общая часть для двух обработок
IF LINES( gt_fields2revival ) > 0 OR
LINES( gt_cleanedfields ) > 0.
"поднимаем скрипт-контрол для выполнения ПЕЧСИМВ или оживления
CREATE OBJECT sc 'MSScriptControl.ScriptControl' NO FLUSH.
SET PROPERTY OF sc 'Language' = 'vbscript' no flush.
CALL METHOD cl_gui_cfw=>flush.
"загружаем код VB
PERFORM build_vbcode.
CALL METHOD OF sc 'AddCode' NO FLUSH
EXPORTING #1 = vbcode.
CALL METHOD cl_gui_cfw=>flush.
rnga1 =
zclut=>cm( obj = wks
m1 = 'Range' p11 = 'A1' ). "для указания 2-го параметра поиска
rng =
zclut=>cm( obj = wks
m1 = 'Range' p11 = '1:1' ). "первая строка - строка заголовков
ENDIF.
======================================================
ФРАГМЕНТ 2. Цикл перебора полей, для которых ЭТО надо
======================================================
"блок применения функции ПЕЧСИМВ -----------------------------------
"для обработки текстовых полей,
"к которым в файле Excel применяется функция ПЕЧСИМВ
"(для удаления непечатных символов)
IF LINES( gt_cleanedfields ) > 0.
LOOP AT gt_cleanedfields INTO gs_cleanedfields.
rngfnd =
zclut=>cm( obj = rng
m1 = 'Find' p11 = gs_cleanedfields-namef
p12 = rnga1 "ActiveCell
p13 = -4163 "xlValues
p14 = 1 "xlWhole
). "ищем...
IF sy-subrc = 0.
"проигрываем" код VB
CALL METHOD OF sc 'Run' NO FLUSH
EXPORTING #1 = 'processColumn'
#2 = rngfnd.
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDLOOP.
ENDIF.
======================================================
ФРАГМЕНТ 3. Код VB c процедурой processColumn
======================================================
FORM build_vbcode.
CONCATENATE
`Option Explicit`
`Public Sub processColumn(rngfnd)`
` Dim rng 'As Range`
` Dim col 'As Integer`
` Dim varr 'As Variant`
` Dim i 'As Integer`
` col = rngfnd.Column`
` With rngfnd.Parent`
` Set rng = .Range(.Cells(1, col), .Cells(.Rows.Count, col).End(-4162))`
"-4162 = xlUp
` End With`
` varr = rng.Value`
` For i = LBound(varr) + 1 To UBound(varr)`
` If Not IsEmpty(varr(i, 1)) Then`
` varr(i, 1) = "'" & _`
` rng.Application.WorksheetFunction.Clean( _`
` rng.Application.WorksheetFunction.Trim( _`
` Replace(Replace(Replace( _`
` varr(i, 1), _`
` vbTab, Chr(32)), vbCr, Chr(32)), vbLf, Chr(32))))`
` End If`
` Next`
` rng.Value = varr`
`End Sub`
INTO vbcode
SEPARATED BY cl_abap_char_utilities=>cr_lf.
ENDFORM. "build_vbcode
======================================================
ФРАГМЕНТ 4. Статический метод CM класса утилит ZCLUT
======================================================
METHOD cm.
* ----- Имитатор "многоточечного" CALL METHOD OF для объектов OLE ----
* НАЗНАЧЕНИЕ:
* предназначен для быстрой и наглядной перекладки кода VBA в код ABAP
* без использования многочисленных утомительных CALL METHOD OF и SET PROPERTY OF
* под "многоточечным" понимается оператор VBA примерно следующего вида
* Application.Workbooks(1).Worksheets(3).Range("B2:D4").Interior.ColorIndex = 6
* ОГРАНИЧЕНИЯ:
* 1. помимо ведущего объекта - не более 6 вложенных методов
* (в примере выше их 4, ColorIndex это свойство)
* и не более 4 параметров у каждого метода
* 2. при вызове параметры p... должны заполняться без "пустот",
* т.е. например нельзя указать у метода m1 параметры только p11 и p14 без указания промежуточных p12 и p13
* ПРИМЕР ИСПОЛЬЗОВАНИЯ И ОФОРМЛЕНИЯ КОДА:
* ----------------------------------------
* REPORT ....
* INCLUDE ole2incl.
* DATA: xlapp TYPE ole2_object, "Excel.Application
* wks TYPE ole2_object. "Worksheet
* START-OF-SELECTION.
*
* CREATE OBJECT xlapp 'Excel.Application'.
*
* zclut=>cm( obj = xlapp
* prp = 'Visible' val = 'true ' ). "эквивалент VBA-оператора: xlapp.Visible = True
*
* zclut=>cm( obj = xlapp
* m1 = 'Workbooks'
* m2 = 'Add' ). "эквивалент VBA-оператора: xlapp.Workbooks.Add
*
* zclut=>cm( obj = xlapp
* m1 = 'Range' p11 = 'A10:E20'
* m2 = 'Select' ). "эквивалент VBA-оператора: xlapp.Range("A10:E20").Select
*
* zclut=>cm( obj = xlapp
* m1 = 'Selection'
* m2 = 'Interior'
* prp = 'ColorIndex' val = 6 ). "эквивалент VBA-оператора: xlapp.Selection.Interior.ColorIndex = 6
*
* wks =
* zclut=>cm( obj = xlapp
* m1 = 'Worksheets' p11 = 2 ). "эквивалент VBA-оператора: Set wks = xlapp.Worksheets(2)
*
* zclut=>cm( obj = wks
* prp = 'Name' val = 'ВторойЛист' )."эквивалент VBA-оператора: wks.Name = "ВторойЛист"
* ------------------------------------------
* ЗАМЕЧАНИЕ: c NO FLUSH этот метод не захотел работать
* sy-subrc не проверяется, поэтому все передаваемые конструкции следует заранее отладить в VBA
ret = obj.
IF m1 IS SUPPLIED.
IF p14 IS SUPPLIED.
CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12 #3 = p13 #4 = p14.
ELSEIF p13 IS SUPPLIED.
CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12 #3 = p13.
ELSEIF p12 IS SUPPLIED.
CALL METHOD OF ret m1 = ret EXPORTING #1 = p11 #2 = p12.
ELSEIF p11 IS SUPPLIED.
CALL METHOD OF ret m1 = ret EXPORTING #1 = p11.
ELSE.
CALL METHOD OF ret m1 = ret.
ENDIF.
ENDIF.
IF m2 IS SUPPLIED.
IF p24 IS SUPPLIED.
CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22 #3 = p23 #4 = p24.
ELSEIF p23 IS SUPPLIED.
CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22 #3 = p23.
ELSEIF p22 IS SUPPLIED.
CALL METHOD OF ret m2 = ret EXPORTING #1 = p21 #2 = p22.
ELSEIF p21 IS SUPPLIED.
CALL METHOD OF ret m2 = ret EXPORTING #1 = p21.
ELSE.
CALL METHOD OF ret m2 = ret.
ENDIF.
ENDIF.
IF m3 IS SUPPLIED.
IF p34 IS SUPPLIED.
CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32 #3 = p33 #4 = p34.
ELSEIF p33 IS SUPPLIED.
CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32 #3 = p33.
ELSEIF p32 IS SUPPLIED.
CALL METHOD OF ret m3 = ret EXPORTING #1 = p31 #2 = p32.
ELSEIF p31 IS SUPPLIED.
CALL METHOD OF ret m3 = ret EXPORTING #1 = p31.
ELSE.
CALL METHOD OF ret m3 = ret.
ENDIF.
ENDIF.
IF m4 IS SUPPLIED.
IF p44 IS SUPPLIED.
CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42 #3 = p43 #4 = p44.
ELSEIF p43 IS SUPPLIED.
CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42 #3 = p43.
ELSEIF p42 IS SUPPLIED.
CALL METHOD OF ret m4 = ret EXPORTING #1 = p41 #2 = p42.
ELSEIF p41 IS SUPPLIED.
CALL METHOD OF ret m4 = ret EXPORTING #1 = p41.
ELSE.
CALL METHOD OF ret m4 = ret.
ENDIF.
ENDIF.
IF m5 IS SUPPLIED.
IF p54 IS SUPPLIED.
CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52 #3 = p53 #4 = p54.
ELSEIF p53 IS SUPPLIED.
CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52 #3 = p53.
ELSEIF p52 IS SUPPLIED.
CALL METHOD OF ret m5 = ret EXPORTING #1 = p51 #2 = p52.
ELSEIF p51 IS SUPPLIED.
CALL METHOD OF ret m5 = ret EXPORTING #1 = p51.
ELSE.
CALL METHOD OF ret m5 = ret.
ENDIF.
ENDIF.
IF m6 IS SUPPLIED.
IF p64 IS SUPPLIED.
CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62 #3 = p63 #4 = p64.
ELSEIF p63 IS SUPPLIED.
CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62 #3 = p63.
ELSEIF p62 IS SUPPLIED.
CALL METHOD OF ret m6 = ret EXPORTING #1 = p61 #2 = p62.
ELSEIF p61 IS SUPPLIED.
CALL METHOD OF ret m6 = ret EXPORTING #1 = p61.
ELSE.
CALL METHOD OF ret m6 = ret.
ENDIF.
ENDIF.
IF prp IS SUPPLIED AND val IS SUPPLIED.
SET PROPERTY OF ret prp = val.
ENDIF.
ENDMETHOD.