Code:
*&---------------------------------------------------------------------*
*& Include ZCL_DEXCEL_F *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Include zcl_dexcel_F *
*&---------------------------------------------------------------------*
*-оригинал DirectExcel v 1.5
* (с) Oleg A. Rudenko, 2004-05. Moscow, Russia.
* перевод Nicks
* CLASS zcl_dexcel DEFINITION
*&---------------------------------------------------------------------*
CLASS zcl_dexcel DEFINITION.
PUBLIC SECTION.
DATA:
conv_out TYPE REF TO cl_abap_conv_out_ce,
gl_rev TYPE i,
BEGIN OF gs_format,
font(25) TYPE c,
sizef TYPE i,
datform(25) TYPE c,
timeform(25) TYPE c,
locked TYPE i,
border TYPE i,
END OF gs_format,
converter TYPE REF TO cl_abap_conv_obj.
METHODS set_border
IMPORTING
!_rightbor TYPE i
!_rightst TYPE i
!_bottombor TYPE i
!_bottomst TYPE i
!_leftbor TYPE i
!_leftst TYPE i
!_topbor TYPE i
!_topst TYPE i
CHANGING
!borderst TYPE p .
METHODS set_rowhi
IMPORTING
!_row TYPE i
!_height TYPE i
!_indexxf TYPE i .
METHODS set_psetup
IMPORTING
!_options TYPE i
!_papersize TYPE i
!_scale TYPE i
!_pagestart TYPE i
!_wfit TYPE i
!_hfit TYPE i .
METHODS add_fx
IMPORTING
!_fontindex TYPE i
!_formatindex TYPE i
!_extattr TYPE i
!_alignment TYPE i
!_borderline TYPE p
!_fillpattern TYPE i
!_extattr1 TYPE x
!_reqadd TYPE i
CHANGING
!ind_fx TYPE i .
METHODS create_xls
IMPORTING
!f_name TYPE string
!def_font TYPE c
!t_out TYPE c .
METHODS wr_string
IMPORTING
!row TYPE i
!col TYPE i
!_val TYPE c
!_indexxf TYPE i
!_note TYPE c OPTIONAL.
METHODS wr_number
IMPORTING
!row TYPE i
!col TYPE i
!_val TYPE f
!_indexxf TYPE i
!_note TYPE c OPTIONAL.
METHODS wr_blank
IMPORTING
!row TYPE i
!col TYPE i
!_indexxf TYPE i
!_note TYPE c OPTIONAL.
METHODS wr_tab " Вывести таблицу начиная с ячейки
IMPORTING
!col_tab TYPE lvc_t_fcat " шаблон вывода - перечень и порядок
!dat_tab TYPE STANDARD TABLE
!_row TYPE i " строка
!_col TYPE i " столбец
RETURNING
value(tec_row) TYPE i . " возвращаемая текущая строка
METHODS set_defrowhi
IMPORTING
!height TYPE i .
METHODS ins_hpbreak
IMPORTING
!col TYPE i .
METHODS ins_vpbreak
IMPORTING
!row TYPE i .
METHODS set_col_width
IMPORTING
!f_col TYPE i
!e_col TYPE i
!width TYPE n .
METHODS close_xls .
METHODS add_font
IMPORTING
!_fontname TYPE c
!_fontheight TYPE i
!_fontattr TYPE i
!_fontcolor TYPE x
!_add TYPE i
CHANGING
value(ind_font) TYPE i .
METHODS add_format
IMPORTING
!_picture TYPE c .
METHODS protectsheet
IMPORTING
!prot TYPE i .
METHODS get_xldate " перевести дату в формат Excel
IMPORTING
!sapdate TYPE dats
CHANGING
value(xldat) TYPE i .
METHODS get_xltime " перевести время Excel
IMPORTING
!saptime TYPE t
CHANGING
value(xltime) TYPE f .
METHODS get_tabl_inf " сформировать шаблон вывода по структуре
IMPORTING dat_tabl TYPE REF TO data
EXPORTING t_fcat TYPE lvc_t_fcat.
PRIVATE SECTION.
CONSTANTS xlsleftalign TYPE i VALUE 1.
DATA: nint4 TYPE int4
, bufff TYPE xstring
,ret_xstring TYPE xstring
,filename TYPE string VALUE 'D:\test1.xls'
,deffont TYPE i VALUE 0
, defxf(1) TYPE x .
CONSTANTS xlsnumber TYPE i VALUE 1.
CONSTANTS xlstext TYPE i VALUE 2.
CONSTANTS xlsblank TYPE i VALUE 3.
CONSTANTS xlsref TYPE i VALUE 100.
CONSTANTS xlsgeneralalign TYPE i VALUE 0.
CONSTANTS xlscentrealign TYPE i VALUE 2.
CONSTANTS xlsrightalign TYPE i VALUE 3.
CONSTANTS xlsfillcell TYPE i VALUE 4.
CONSTANTS xlsrightborder TYPE i VALUE 16.
CONSTANTS xlsleftborder TYPE i VALUE 8.
CONSTANTS xlstopborder TYPE i VALUE 32.
DATA:
BEGIN OF wa_fontslist,
id TYPE i , " Индекс шрифта
name(100) TYPE c, " Наименование шрифта
size TYPE i VALUE 10, " Размер шрифта
attr TYPE i , " Аттрибут шрифта
color TYPE i , " Цвет шрифта
END OF wa_fontslist .
DATA:
tb_fontslist LIKE TABLE OF wa_fontslist .
DATA:
BEGIN OF wa_xflist,
id TYPE i , " Индекс стиля
fontndx(1) TYPE x , " Индекс шрифта
fmtndx(1) TYPE x , " Индекс формата вывода
extattr(2) TYPE x , " Дополнительные аттрибуты
extattr1(1) TYPE x , " Дополнительные аттрибуты
alignment(1) TYPE x , " Выравнивание
borderstyle(2) TYPE x , " Стиль окантовки
fillpattern(4) TYPE x , " Стиль закрашивания
END OF wa_xflist .
DATA:
tb_xflist LIKE TABLE OF wa_xflist .
DATA:
BEGIN OF wa_formatslist,
id(1) TYPE x ," Индекс формата
picture(50) TYPE c ," Сам формат
END OF wa_formatslist .
CONSTANTS: xlsfont0 TYPE i VALUE 0.
DATA: tb_formatslist LIKE TABLE OF wa_formatslist .
DATA:
BEGIN OF wa_pbreaks,
position TYPE i ," Позиция (колонка или строка)
END OF wa_pbreaks .
DATA: s_fcat TYPE lvc_s_fcat.
DATA: hp_breaks LIKE TABLE OF wa_pbreaks .
DATA: vp_breaks LIKE TABLE OF wa_pbreaks .
* DATA writetable_break TYPE i VALUE -1 .
DATA isopen TYPE i .
DATA: tfontlist LIKE TABLE OF wa_fontslist ,
txflist LIKE TABLE OF wa_xflist ,
tfmtlist LIKE TABLE OF wa_formatslist,
lt_fcat TYPE lvc_t_fcat ,
deffontname(30) TYPE c .
DATA:
BEGIN OF wa_frm ,
nfr TYPE i,
nfrm(36) TYPE c,
END OF wa_frm .
DATA: tb_frm LIKE TABLE OF wa_frm .
DATA: BEGIN OF wa_fx ,
nfx TYPE i,
nst TYPE i,
END OF wa_fx .
DATA: tb_fx LIKE TABLE OF wa_fx .
DATA: typeout(2) TYPE c ,
rowcurrent TYPE i ,
nfr TYPE c .
METHODS get_borderline
IMPORTING
!_border TYPE p
CHANGING
!borderxeh TYPE x .
METHODS cellnote
IMPORTING
!_col TYPE i
!_row TYPE i
!_note TYPE c .
METHODS add_string
IMPORTING
!adtext TYPE c .
METHODS add_number
IMPORTING
!adnumb TYPE f .
METHODS donl_file
IMPORTING
!app_mode TYPE char01 .
METHODS wr_def_formats .
METHODS inttohex
IMPORTING
!ilen TYPE i
CHANGING
!value(chex) TYPE x .
ENDCLASS. "zcl_dexcel DEFINITION
*----------------------------------------------------------------------*
* CLASS zcl_dexcel IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zcl_dexcel IMPLEMENTATION.
METHOD add_font .
DATA: BEGIN OF font_data,
opcode(2) TYPE x VALUE '3102',
length(2) TYPE x VALUE '1000',
fontheight(2) TYPE x VALUE '2000', "! 1/20
fontattr(2) TYPE x ," VALUE fontattr-faauto,
fontcolor(2) TYPE x ," VALUE fontcolor-fcauto,
fontnamelen(1) TYPE x,
END OF font_data,
loc_fontname TYPE string,
loc_font LIKE tb_fontslist,
lc_tmp TYPE xstring,
loc_tmp TYPE int4,
loc_rec TYPE i.
FIELD-SYMBOLS: <lc_fs> TYPE x.
IF _fontname IS NOT INITIAL.
loc_fontname = _fontname.
ELSE.
loc_fontname = deffontname.
ENDIF.
wa_fontslist-name = loc_fontname.
IF _fontheight IS NOT INITIAL.
wa_fontslist-size = _fontheight.
ELSE.
wa_fontslist-size = 10.
ENDIF.
IF _fontattr IS NOT INITIAL .
wa_fontslist-attr = _fontattr.
nint4 = wa_fontslist-attr.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = font_data-fontattr.
ENDIF.
IF _fontcolor IS NOT INITIAL .
font_data-fontcolor = _fontcolor.
ENDIF.
READ TABLE tb_fontslist INTO wa_fontslist WITH KEY name = loc_fontname size =
_fontheight attr = _fontattr
color = _fontcolor BINARY SEARCH.
IF sy-subrc NE 0 OR _add = 1 .
DESCRIBE TABLE tb_fontslist LINES loc_rec.
IF loc_rec = 255 .
ELSE.
nint4 = STRLEN( wa_fontslist-name ).
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = font_data-fontnamelen.
nint4 = 7 + nint4.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = font_data-length.
nint4 = wa_fontslist-size * 20.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = font_data-fontheight.
ASSIGN font_data TO <lc_fs> CASTING.
CONCATENATE bufff <lc_fs> INTO bufff IN BYTE MODE.
nint4 = STRLEN( loc_fontname ).
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = loc_fontname
IMPORTING
buffer = ret_xstring "* MIMETYPE = ' '
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
CONCATENATE bufff ret_xstring INTO bufff IN BYTE MODE.
IF loc_rec < 5.
ELSE.
loc_rec = loc_rec + 1.
ENDIF.
wa_fontslist-id = loc_rec.
ind_font = loc_rec.
APPEND wa_fontslist TO tb_fontslist.
ENDIF.
ELSE.
ind_font = wa_fontslist-id .
ENDIF.
ENDMETHOD. "add_font
METHOD add_format .
DATA: BEGIN OF format_data,
opcode(2) TYPE x VALUE '1E04',
length(2) TYPE x VALUE '0300',
formatindex(2) TYPE x VALUE '0000',
formatlen(1) TYPE x,
END OF format_data,
i TYPE i,
l_addsize TYPE i VALUE 3,
l_saverec(1000) .
FIELD-SYMBOLS: <lc_fs> TYPE x,
<it_rc> TYPE x.
CLEAR wa_formatslist.
IF _picture NE space.
READ TABLE tb_formatslist INTO wa_formatslist WITH KEY picture = _picture .
IF sy-subrc NE 0 ."OR tb_formatslist IS INITIAL .
DESCRIBE TABLE tb_formatslist LINES i.
IF i = 255.
ELSE.
wa_formatslist-id = i.
format_data-formatlen = STRLEN( _picture ).
nint4 = format_data-formatlen + l_addsize.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = format_data-length.
ASSIGN format_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ASSIGN _picture TO <lc_fs> CASTING TYPE x. " Перевод в HEX вид
CONCATENATE bufff <lc_fs> INTO bufff IN BYTE MODE.
wa_formatslist-picture = _picture .
APPEND wa_formatslist TO tb_formatslist.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD. "ADD_FORMAT
METHOD add_number .
DATA: lc TYPE i,
oct TYPE i,
re_dat(8) TYPE x.
FIELD-SYMBOLS <fs> TYPE x.
ASSIGN adnumb TO <fs> CASTING TYPE x.
CLEAR: re_dat.
DO 8 TIMES.
lc = 8 - sy-index. " читать от конца
oct = sy-index - 1. " писать от начала
re_dat+oct(1) = <fs>+lc(1).
ENDDO.
CONCATENATE bufff re_dat INTO bufff IN BYTE MODE.
ENDMETHOD. "ADD_NUMBER
METHOD add_string .
DATA: lc TYPE i,
buffer TYPE xstring,
s_string TYPE string,
x_string TYPE xstring.
FIELD-SYMBOLS: <ctext> TYPE c.
CLEAR buffer.
s_string = adtext.
CALL METHOD converter->convert
EXPORTING
inbuff = s_string
inbufflg = 0
outbufflg = 0
IMPORTING
outbuff = ret_xstring
EXCEPTIONS
internal_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
WHEN 2.
ENDCASE.
ENDIF.
CONCATENATE bufff ret_xstring INTO bufff IN BYTE MODE.
ENDMETHOD. "ADD_STRING
METHOD add_fx .
DATA: BEGIN OF xf_data,
opcode(2) TYPE x VALUE '4304',
length(2) TYPE x VALUE '0C',
fontindex(1) TYPE x VALUE '',
formatindex(1) TYPE x VALUE '',
extattr(2) TYPE x VALUE '01',
alignment(1) TYPE x VALUE '20',
extattr1(1) TYPE x VALUE '00',
fillpattern(2) TYPE x VALUE '00CE',
borderstyle(4) TYPE x,
END OF xf_data,
countrec TYPE i,
fillpattern(2) TYPE x,
loc_patt(2) TYPE x,
style(2) TYPE x,
fillcolor(2) TYPE x,
patterncolor(2) TYPE x,
nlenhex TYPE i,
pos_from TYPE i,
pos_to TYPE i,
pos_col TYPE i,
loc_borderstyle(3) TYPE x,
loc_xf LIKE wa_xflist.
FIELD-SYMBOLS: <lc_fs> TYPE x.
IF isopen IS NOT INITIAL. " OR (Self.XFList &= Null)
MOVE _fillpattern TO fillpattern.
MOVE fillpattern+1(1) TO pos_to .
IF pos_to > 1.
loc_patt = '07C0'.
fillcolor = fillpattern BIT-AND loc_patt.
IF fillcolor EQ '0000'.
fillcolor = '0640'.
ENDIF.
MOVE fillcolor TO pos_from .
loc_patt = 'F800'.
patterncolor = fillpattern BIT-AND loc_patt.
MOVE patterncolor TO pos_col.
IF patterncolor EQ '0000'.
patterncolor = '00C0'.
ENDIF.
pos_from = pos_from * 32.
pos_col = pos_col / 32.
nint4 = pos_to + pos_from + pos_col.
MOVE nint4 TO loc_patt.
loc_xf-fillpattern+0(1) = loc_patt+1(1).
loc_xf-fillpattern+1(1) = loc_patt+0(1).
ENDIF.
ENDIF.
nint4 = _fontindex.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_xf-fontndx.
nint4 = _formatindex.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_xf-fmtndx.
nint4 = _extattr.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_xf-extattr.
IF _alignment IS NOT INITIAL.
nint4 = _alignment.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_xf-alignment.
ELSE.
loc_xf-alignment = '20'.
ENDIF.
loc_xf-extattr1 = _extattr1 .
READ TABLE txflist INTO wa_xflist WITH KEY fontndx = loc_xf-fontndx fmtndx = loc_xf-fmtndx
extattr = loc_xf-extattr extattr1 = loc_xf-extattr1 alignment = loc_xf-alignment
borderstyle = loc_xf-borderstyle fillpattern = loc_xf-fillpattern. " BINARY SEARCH.
IF sy-subrc NE 0 OR _reqadd = 1 .
DESCRIBE TABLE txflist LINES countrec.
CLEAR wa_xflist.
wa_xflist-fontndx = loc_xf-fontndx.
wa_xflist-fmtndx = loc_xf-fmtndx.
wa_xflist-extattr = loc_xf-extattr.
wa_xflist-extattr1 = loc_xf-extattr1.
wa_xflist-alignment = loc_xf-alignment.
wa_xflist-borderstyle = loc_xf-borderstyle.
xf_data-fillpattern = loc_xf-fillpattern.
xf_data-fontindex = loc_xf-fontndx.
xf_data-formatindex = loc_xf-fmtndx.
xf_data-extattr = loc_xf-extattr.
xf_data-extattr1 = loc_xf-extattr1.
xf_data-alignment = loc_xf-alignment.
IF _borderline NE 0.
CALL METHOD get_borderline
EXPORTING
_border = _borderline
CHANGING
borderxeh = xf_data-borderstyle.
ELSE.
xf_data-borderstyle = loc_xf-borderstyle.
ENDIF.
ASSIGN xf_data TO <lc_fs> CASTING.
CONCATENATE bufff <lc_fs> INTO bufff IN BYTE MODE.
ind_fx = countrec.
wa_xflist-id = countrec.
APPEND wa_xflist TO txflist.
ELSE.
ind_fx = wa_xflist-id.
ENDIF.
ENDMETHOD. "add_fx
METHOD cellnote .
DATA: BEGIN OF cellnote_data,
opcode(2) TYPE x VALUE 'C001',
length(2) TYPE x VALUE '0600',
row(2) TYPE x ,
col(2) TYPE x ,
notelen(2) TYPE x ,
END OF cellnote_data.
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = 28.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = cellnote_data-opcode.
nint4 = _row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = cellnote_data-row.
nint4 = _col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = cellnote_data-col.
nint4 = 6 + STRLEN( _note ).
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = cellnote_data-length.
nint4 = STRLEN( _note ).
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = cellnote_data-notelen.
ASSIGN cellnote_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CALL METHOD add_string( _note ) .
ENDMETHOD. "cellnote
METHOD close_xls .
DATA: BEGIN OF end_file_data,
opcode(2) TYPE x VALUE '0A',
length(2) TYPE x VALUE '00',
END OF end_file_data,
BEGIN OF v_breaks,
opcode(2) TYPE x VALUE '1A',
length(2) TYPE x ,
pages(2) TYPE x ,
END OF v_breaks,
BEGIN OF h_breaks,
opcode(2) TYPE x VALUE '1B',
length(2) TYPE x VALUE '02',
pages(2) TYPE x ,
END OF h_breaks,
h_length TYPE i VALUE 2,
num_breaks TYPE i VALUE 0,
t_short(2) TYPE x,
t_len TYPE i ,
pagesarray TYPE xstring.
FIELD-SYMBOLS: <it_rc> TYPE x.
DESCRIBE TABLE hp_breaks LINES num_breaks.
IF num_breaks NE 0 AND isopen NE 0 .
nint4 = num_breaks.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = h_breaks-pages.
LOOP AT hp_breaks INTO wa_pbreaks.
nint4 = wa_pbreaks-position.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = t_short.
CONCATENATE pagesarray t_short INTO pagesarray IN BYTE MODE.
t_len = t_len + 2.
ENDLOOP.
h_length = h_length + num_breaks * 2.
nint4 = h_length.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = h_breaks-length.
ASSIGN h_breaks TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CONCATENATE bufff pagesarray INTO bufff IN BYTE MODE.
ENDIF .
DESCRIBE TABLE vp_breaks LINES num_breaks.
IF num_breaks NE 0 AND isopen NE 0 .
t_len = 0.
h_length = 2.
CLEAR pagesarray.
SORT vp_breaks BY position.
nint4 = num_breaks.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = v_breaks-pages.
LOOP AT vp_breaks INTO wa_pbreaks.
nint4 = wa_pbreaks-position.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = t_short.
CONCATENATE pagesarray t_short INTO pagesarray IN BYTE MODE.
t_len = t_len + 2.
ENDLOOP.
h_length = h_length + num_breaks * 2.
nint4 = h_length.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = v_breaks-length.
ASSIGN v_breaks TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CONCATENATE bufff pagesarray INTO bufff IN BYTE MODE.
ENDIF .
ASSIGN end_file_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CALL METHOD donl_file
EXPORTING
app_mode = 'X'.
IF typeout = 'AC'. " Выгрузка на AP сервер
CLOSE DATASET filename .
ENDIF.
ENDMETHOD. "close_xls
METHOD create_xls .
DATA:
lc_tx(2) TYPE c,
def_fonth TYPE i,
def_fontst(30) TYPE c,
hkey_current_user TYPE i VALUE 1,
BEGIN OF beg_file_data,
opcode(2) TYPE x VALUE '0904',
length(2) TYPE x VALUE '0600',
version(2) TYPE x VALUE '0000',
subtype(2) TYPE x VALUE '1000',
buildid(2) TYPE x VALUE '5E1F',
END OF beg_file_data,
BEGIN OF codepage_data,
opcode(2) TYPE x VALUE '4200',
length(2) TYPE x VALUE '0200',
codepage(2) TYPE x VALUE 'E304',
END OF codepage_data,
BEGIN OF calc_mode_data,
opcode(2) TYPE x VALUE '0D00',
length(2) TYPE x VALUE '0200',
calcmode(2) TYPE x VALUE '0100',
END OF calc_mode_data,
BEGIN OF wind_data,
opcode(2) TYPE x VALUE '3D00',
length(2) TYPE x VALUE '0A00',
xpos(2) TYPE x VALUE '0000',
ypos(2) TYPE x VALUE '0000',
width(2) TYPE x VALUE '0000',
height(2) TYPE x VALUE '0000',
hidden(2) TYPE x VALUE '0',
END OF wind_data,
BEGIN OF stdstyle_data,
opcode(2) TYPE x VALUE '3029',
length(2) TYPE x VALUE '4000',
indexxf(2) TYPE x VALUE '0008',
buildnum(2) TYPE x VALUE '0FF0',
END OF stdstyle_data,
lc TYPE i.
FIELD-SYMBOLS: <it_rc> TYPE x.
lc = 4660.
ASSIGN lc TO <it_rc> CASTING.
CASE <it_rc>+0(1).
WHEN '00'. " 00
gl_rev = 1 .
WHEN OTHERS.
gl_rev = 2.
ENDCASE.
lc = 0.
CLEAR <it_rc>.
CLEAR deffontname.
isopen = 1.
CLEAR: bufff.
ASSIGN beg_file_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ASSIGN codepage_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ASSIGN calc_mode_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ASSIGN wind_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
FREE tfontlist.
CLEAR wa_fontslist.
IF def_font IS NOT INITIAL.
wa_fontslist-name = def_font.
ELSE.
CALL FUNCTION 'GUI_GET_REGVALUE'
EXPORTING
root = hkey_current_user
key = 'Software\Microsoft\Office\11.0\Excel\Options'
value_name = 'Font'
CHANGING
string = def_fontst
EXCEPTIONS
registry_error = 1.
CONDENSE def_fontst.
def_fonth = STRLEN( def_fontst ).
IF sy-subrc = 0 AND def_fonth > 0.
SPLIT def_fontst AT ',' INTO wa_fontslist-name lc_tx .
CONDENSE wa_fontslist-name.
CONDENSE lc_tx .
def_fonth = lc_tx .
ELSE.
wa_fontslist-name = 'Arial Cyr'.
def_fonth = 10.
ENDIF.
ENDIF.
DO 5 TIMES.
CALL METHOD add_font
EXPORTING
_fontname = wa_fontslist-name
_fontheight = def_fonth
_fontattr = 0
_fontcolor = '0000'
_add = 1
CHANGING
ind_font = lc.
ENDDO.
IF f_name IS NOT INITIAL.
filename = f_name.
ENDIF .
typeout = t_out.
CALL METHOD wr_def_formats.
IF typeout = 'AC'. " Выгрузка на AP сервер
OPEN DATASET filename FOR OUTPUT IN BINARY MODE.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
FREE vp_breaks.
FREE hp_breaks.
DATA: prc_conv TYPE REF TO cl_abap_conv_out_ce,
prc_xstr_no TYPE xstring,
prc_i_no TYPE i,
prc_sapno TYPE cpcharno,
prc_space TYPE string.
TRY.
CALL METHOD cl_abap_conv_out_ce=>create
EXPORTING
encoding = '4000'
RECEIVING
conv = prc_conv.
CATCH cx_parameter_invalid_range .
CATCH cx_sy_codepage_converter_init .
ENDTRY.
TRY.
CALL METHOD prc_conv->write
EXPORTING
data = '#'.
CATCH cx_sy_codepage_converter_init.
CATCH cx_sy_conversion_codepage.
CATCH cx_parameter_invalid_type.
CATCH cx_parameter_invalid_range.
ENDTRY.
TRY.
CALL METHOD prc_conv->get_buffer
RECEIVING
buffer = prc_xstr_no.
ENDTRY.
prc_i_no = prc_xstr_no.
prc_sapno = prc_i_no.
DATA: par_encoding TYPE abap_encoding VALUE '1504',
prc_codepage(4) TYPE n,
prc_miss TYPE c,
prc_broken TYPE c.
prc_miss = '.'.
prc_broken = '.'.
prc_codepage = par_encoding.
CREATE OBJECT converter
EXPORTING
outcode = prc_codepage
miss = prc_miss
broken = prc_broken
use_f1 = 'X'
substc = prc_sapno
EXCEPTIONS
invalid_codepage = 1
internal_error = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
WHEN 2.
ENDCASE.
ENDIF.
ENDMETHOD. "create_xls
METHOD donl_file .
DATA: len TYPE i,
xlsfsize TYPE i,
pos TYPE i.
xlsfsize = XSTRLEN( bufff ).
IF typeout = 'AC'. " Выгрузка на AP сервер
TRANSFER bufff TO filename LENGTH xlsfsize.
ELSE.
DATA: lc_bin TYPE sdok_sdatx,
l_graphic_conv TYPE i,
xlsbuffer LIKE STANDARD TABLE OF lc_bin,
l_graphic_offs TYPE i.
CHECK xlsfsize > 0.
l_graphic_conv = xlsfsize.
l_graphic_offs = 0.
WHILE l_graphic_conv > 1022.
lc_bin = bufff+l_graphic_offs(1022).
APPEND lc_bin TO xlsbuffer.
l_graphic_offs = l_graphic_offs + 1022.
l_graphic_conv = l_graphic_conv - 1022.
ENDWHILE.
lc_bin = bufff+l_graphic_offs(l_graphic_conv).
APPEND lc_bin TO xlsbuffer.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = xlsfsize
filename = filename
filetype = 'BIN'
append = ' '
TABLES
data_tab = xlsbuffer
EXCEPTIONS
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
REFRESH xlsbuffer.
CLEAR: xlsbuffer, xlsfsize , bufff.
ENDMETHOD. "donl_file
METHOD set_border .
DATA lc_int TYPE i.
lc_int = _rightbor + _rightst.
IF lc_int > 200.
lc_int = 195.
ENDIF.
borderst = borderst + lc_int.
lc_int = _bottombor + _bottomst.
IF lc_int > 200.
lc_int = 195.
ENDIF.
borderst = borderst + lc_int * 256 .
lc_int = _leftbor + _leftst.
IF lc_int > 200.
lc_int = 195.
ENDIF.
borderst = borderst + lc_int * 256 * 256 .
lc_int = _topbor + _topst.
IF lc_int > 200.
lc_int = 195.
ENDIF.
borderst = borderst + lc_int * 256 * 256 * 256.
ENDMETHOD. "set_border
METHOD set_col_width .
DATA : BEGIN OF colwidth,
opcode(2) TYPE x VALUE '2400',
length(2) TYPE x VALUE '0400',
col1(1) TYPE x,
col2(1) TYPE x,
colwidth(2) TYPE x,
END OF colwidth.
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = f_col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = colwidth-col1.
nint4 = f_col + e_col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = colwidth-col2.
nint4 = width * 256.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = colwidth-colwidth.
ASSIGN colwidth TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "SET_COL_WIDTH
METHOD set_defrowhi .
DATA : BEGIN OF defheight,
opcode(2) TYPE x VALUE '2500',
length(2) TYPE x VALUE '0200',
rowheight(2) TYPE x ,
END OF defheight.
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = height * 20.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = defheight-rowheight.
ASSIGN defheight TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "SET_DEFROWHI
METHOD set_psetup .
DATA:
BEGIN OF ps_data,
opcode(2) TYPE x VALUE 'A100',
length(2) TYPE x VALUE '2200',
papersize(2) TYPE x VALUE '0900', " Размер (тип', страницы
scale(2) TYPE x VALUE '6400', " Масштаб
pagestart(2) TYPE x VALUE '0100', " Номер стартовой страницы
fitwidth(2) TYPE x VALUE '0100', " Кол-во страниц в ширину
fitheight(2) TYPE x VALUE '0100', " Кол-во страниц в высоту
options(2) TYPE x VALUE '0200', " Доп.битовые флажки свойств
hres(2) TYPE x VALUE '6801', " '0168'Горизонтальное разрешение принтера
vres(2) TYPE x VALUE '6801', " Вертикальное разрешение принтера
END OF ps_data,
headermargin TYPE f VALUE '0.5' , " Размещение верхнего колонтитула, дюймы
footermargin TYPE f VALUE '0.5' ," Размещение нижнего колонтитула, дюймы
copies(2) TYPE x VALUE '0100'. " Кол-во копий
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = _papersize.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-papersize.
nint4 = _scale.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-scale.
nint4 = _pagestart.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-pagestart.
nint4 = _wfit.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-fitwidth.
nint4 = _hfit.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-fitheight.
nint4 = _options.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = ps_data-options.
ASSIGN ps_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CALL METHOD add_number( headermargin ).
CALL METHOD add_number( footermargin ).
ASSIGN copies TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "set_psetup
METHOD set_rowhi .
DATA:
BEGIN OF row_data , " ! Запись об аттрибутах строки
opcode(2) TYPE x VALUE '0802' ,")
length(2) TYPE x VALUE '1000',
rownum(2) TYPE x ,
firstcol(2) TYPE x VALUE '0000',
lastcol(2) TYPE x VALUE '0000',
height(2) TYPE x ,
reserved1(2) TYPE x VALUE '0000',"
reserved2(2) TYPE x VALUE '0000',"
optionflag(2) TYPE x VALUE 'C001',
indexxf(2) TYPE x VALUE 'F000',") ! 0-based
END OF row_data.
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = _row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = row_data-rownum.
nint4 = _height * 20.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = row_data-height.
IF _indexxf NE 0.
nint4 = _indexxf.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = row_data-indexxf.
ENDIF.
ASSIGN row_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "set_rowhi
METHOD get_borderline .
DATA: lc_bord TYPE p,
lc_pos TYPE i,
lc_hex(1) TYPE x.
CLEAR:lc_hex , lc_bord , lc_pos .
lc_bord = _border.
DO 4 TIMES.
nint4 = FLOOR( lc_bord / 256 ** ( 4 - sy-index ) ).
lc_bord = lc_bord - nint4 * ( 256 ** ( 4 - sy-index ) ).
CLEAR lc_hex .
IF nint4 > 0.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = lc_hex.
ENDIF.
borderxeh+lc_pos(1) = lc_hex.
lc_pos = lc_pos + 1.
ENDDO.
ENDMETHOD. "get_borderline
METHOD ins_hpbreak .
IF isopen NE 0 .
READ TABLE hp_breaks INTO wa_pbreaks WITH KEY position = col.
IF sy-subrc NE 0.
wa_pbreaks-position = col.
APPEND wa_pbreaks TO hp_breaks .
ENDIF.
ENDIF.
ENDMETHOD. "ins_hpbreak
METHOD ins_vpbreak .
IF isopen NE 0 .
READ TABLE vp_breaks INTO wa_pbreaks WITH KEY position = row.
IF sy-subrc NE 0.
wa_pbreaks-position = row.
APPEND wa_pbreaks TO vp_breaks .
ENDIF.
ENDIF.
ENDMETHOD. "ins_vpbreak
METHOD inttohex .
DATA: " nflagint TYPE i,
pos_from TYPE i,
lc_xstr TYPE xstring,
pos_to TYPE i,
nlenhex TYPE i.
FIELD-SYMBOLS <fs> TYPE x.
CLEAR chex.
nlenhex = 4.
ASSIGN nint4 TO <fs> CASTING.
CASE gl_rev.
WHEN 1. " 00001234 " инвертировать
DO ilen TIMES.
pos_from = nlenhex - sy-index. " читать от конца
pos_to = sy-index - 1. " писать от начала
chex+pos_to(1) = <fs>+pos_from(1).
ENDDO.
WHEN 2. " 34120000 " взять iLen байт
chex = <fs>+0(ilen).
WHEN OTHERS.
ENDCASE.
ENDMETHOD. "INTTOHEX
METHOD protectsheet .
DATA: BEGIN OF pr_sheet_record ,
opcode(2) TYPE x VALUE '1200',
length(2) TYPE x VALUE '0200',
protect(2) TYPE x VALUE '0000',
END OF pr_sheet_record.
FIELD-SYMBOLS: <it_rc> TYPE x.
IF prot NE 0.
pr_sheet_record-protect = '0100' .
ENDIF.
ASSIGN pr_sheet_record TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "protectsheet
METHOD wr_blank .
DATA: BEGIN OF label_data,
opcode(2) TYPE x VALUE '0102',
length(2) TYPE x VALUE '0600',
row(2) TYPE x ,
col(2) TYPE x ,
indexxf(2) TYPE x VALUE '0F00',
END OF label_data.
FIELD-SYMBOLS: <it_rc> TYPE x.
IF _indexxf IS NOT INITIAL.
nint4 = _indexxf.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = label_data-indexxf.
ENDIF.
nint4 = row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = label_data-row.
nint4 = col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = label_data-col.
ASSIGN label_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
IF _note IS NOT INITIAL.
CALL METHOD cellnote( _col = col _row = row _note = _note ).
ENDIF.
ENDMETHOD. "wr_blank
METHOD wr_def_formats .
DATA ifx TYPE i VALUE 0.
DATA: BEGIN OF stdstyle_data,
opcode(2) TYPE x VALUE '9302',
length(2) TYPE x VALUE '0400',
indexxf(2) TYPE x VALUE '0080' ,
buildnum(2) TYPE x VALUE '00FF' ,
END OF stdstyle_data.
FIELD-SYMBOLS: <it_rc> TYPE x.
CLEAR wa_formatslist.
REFRESH tb_formatslist.
CALL METHOD add_format( 'General' ). " 0
CALL METHOD add_format( '0;-0' ). " 1
CALL METHOD add_format( '0.00;-0.00' ). " 2
CALL METHOD add_format( '#,##0;-#,##0' ). " 3
CALL METHOD add_format( '#,##0.00;-#,##0.00' ). " 4
CALL METHOD add_format( '#,##0\ "$";\-#,##0\ "$"' )." 5
CALL METHOD add_format( '#,##0\ "$";[Red]\-#,##0\ "$"' ). " 6
CALL METHOD add_format( '#,##0.00\ "$";\-#,##0.00\ "$"' ). " 7
CALL METHOD add_format( '#,##0.00\ "$";[Red]\-#,##0.00\ "$"' )."8
CALL METHOD add_format( '0%' ). " 9
CALL METHOD add_format( '0.00%' ). " 10
CALL METHOD add_format( '0.00E+00' ). " 11
CALL METHOD add_format( 'dd/mm/yy' ). " 12
CALL METHOD add_format( 'dd/\ mmm\ yy' ). " 13
CALL METHOD add_format( 'dd/\ mmm' ). " 14
CALL METHOD add_format( 'mmm\ yy' ). " 15
CALL METHOD add_format( 'h:mm\ AM/PM' ). " 16
CALL METHOD add_format( 'h:mm:ss\ AM/PM' ). " 17
CALL METHOD add_format( 'hh:mm' ). " 18
CALL METHOD add_format( 'hh:mm:ss' ). " 19
CALL METHOD add_format( 'dd/mm/yy\ hh:mm' ). " 20
CALL METHOD add_format( '##0.0E+0' ). " 21
CALL METHOD add_format( 'mm:ss' ). "' 22
CALL METHOD add_format( '@' ). " 23
CALL METHOD add_format( 'dd/mm/yyyy' ). " 24
CALL METHOD add_format( '0.0;-0.0' ). " 25
CALL METHOD add_format( '0.000;-0.000' ). " 26
CALL METHOD add_format( '0.0000;-0.0000' ). " 27
CALL METHOD add_format( '$#,##0.00;-$#,##0.00' ). " 28
CALL METHOD add_format( '#,##0.00\ "р.";\-#,##0.00\ "р."' ). " 29
CALL METHOD add_format( '#,##0.00\ "E";\-#,##0.00\ "E"' ). " 30
CALL METHOD add_format( '#\ ##0;-#\ ##0' ). " 31
CALL METHOD add_format( '#\ ##0.00;-#\ ##0.00' ). " 32
FREE txflist.
CALL METHOD add_fx
EXPORTING
_fontindex = 0
_formatindex = 0
_extattr = 65525
_alignment = 0
_borderline = 0
_fillpattern = 0
_extattr1 = '00'
_reqadd = 1
CHANGING
ind_fx = ifx.
DO 2 TIMES.
CALL METHOD add_fx
EXPORTING
_fontindex = 1
_formatindex = 0
_extattr = 65525
_alignment = 0
_borderline = 0
_fillpattern = 0
_extattr1 = 'F4'
_reqadd = 1
CHANGING
ind_fx = ifx.
ENDDO.
DO 2 TIMES.
CALL METHOD add_fx
EXPORTING
_fontindex = 2
_formatindex = 0
_extattr = 65525
_alignment = 0
_borderline = 0
_fillpattern = 0
_extattr1 = 'F4'
_reqadd = 1
CHANGING
ind_fx = ifx.
ENDDO.
DO 10 TIMES.
CALL METHOD add_fx
EXPORTING
_fontindex = 0
_formatindex = 0
_extattr = 65525
_alignment = 0
_borderline = 0
_fillpattern = 0
_extattr1 = 'F4'
_reqadd = 1
CHANGING
ind_fx = ifx.
ENDDO.
CALL METHOD add_fx
EXPORTING
_fontindex = 0
_formatindex = 0
_extattr = 1
_alignment = 0
_borderline = 0
_fillpattern = 0
_extattr1
='00'
_reqadd = 1
CHANGING
ind_fx = ifx.
ASSIGN stdstyle_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDMETHOD. "wr_def_formats
METHOD wr_number .
DATA: BEGIN OF label_data,
opcode(2) TYPE x VALUE '0302',
length(2) TYPE x VALUE '0E00',
row(2) TYPE x ,
col(2) TYPE x ,
indexxf(2) TYPE x VALUE '0F00',
END OF label_data,
lc_float TYPE f.
FIELD-SYMBOLS: <it_rc> TYPE x.
nint4 = row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = label_data-row.
nint4 = col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = label_data-col.
IF _indexxf IS NOT INITIAL.
nint4 = _indexxf.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = label_data-indexxf.
ENDIF.
ASSIGN label_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
lc_float = _val.
CALL METHOD add_number
EXPORTING
adnumb = lc_float.
IF _note IS NOT INITIAL.
CALL METHOD cellnote( _col = col _row = row _note = _note ).
ENDIF.
ENDMETHOD. "wr_number
METHOD wr_string .
DATA: BEGIN OF label_data,
opcode(2) TYPE x VALUE '0402', "'204',
length(2) TYPE x VALUE '0800',
row(2) TYPE x ,
col(2) TYPE x ,
indexxf(2) TYPE x VALUE '0F00', "! 0-based
END OF label_data,
BEGIN OF rstring_data,
opcode(2) TYPE x VALUE 'D600',
length(2) TYPE x VALUE '0800',
row(2) TYPE x ,
col(2) TYPE x ,
indexxf(2) TYPE x VALUE '0F', " ! 0-based
strlen(2) TYPE x ,
END OF rstring_data,
lc_length TYPE i,
lc_text(20) TYPE c ,
lc_text1(5) TYPE c ,
lc_text2(5) TYPE c ,
razd(1) TYPE c,
loc_strlen(2) TYPE x,
lc_data(1) TYPE x,
loc_mfinfo TYPE i VALUE 0,
lc_mfinfo TYPE xstring,
ilen TYPE i VALUE 0,
beglen TYPE i VALUE 0,
ipos TYPE i VALUE 0,
ichar TYPE i VALUE 0,
lenpoz TYPE i VALUE 0.
FIELD-SYMBOLS: <it_rc> TYPE x.
IF _val IS INITIAL.
CALL METHOD wr_blank( row = row col = col
_indexxf = _indexxf _note = _note ).
ELSE.
loc_mfinfo = 0.
nint4 = TRUNC( ichar / 2 ) .
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = lc_data.
lc_length = 8 + STRLEN( _val ) .
nint4 = STRLEN( _val ).
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_strlen.
nint4 = lc_length.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = label_data-length.
nint4 = row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = label_data-row.
nint4 = col - 1.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = label_data-col.
IF _indexxf IS NOT INITIAL.
nint4 = _indexxf.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = label_data-indexxf.
ENDIF.
ASSIGN label_data TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ASSIGN loc_strlen TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CALL METHOD add_string
EXPORTING
adtext = _val.
IF _note IS NOT INITIAL.
CALL METHOD cellnote( _col = col _row = row _note = _note ).
ENDIF.
ENDIF.
ENDMETHOD. "wr_string
METHOD wr_tab .
DATA:
bl_opcode(2) TYPE x VALUE '0102',
bl_length(2) TYPE x VALUE '0600',
n_opcode(2) TYPE x VALUE '0302',
n_length(2) TYPE x VALUE '0E00',
st_opcode(2) TYPE x VALUE '0402',
st_length(2) TYPE x VALUE '0800',
loc_strlen(2) TYPE x,
* h_row(2) TYPE x,
lctb_col1 TYPE lvc_t_fcat.
DATA: BEGIN OF mrc_st,
opcode(2) TYPE x ,
length(2) TYPE x ,
row(2) TYPE x ,
col(2) TYPE x ,
indexxf(2) TYPE x ,
END OF mrc_st ,
lc_border TYPE p.
DATA: wa_cols TYPE lvc_s_fcat,
lc_align TYPE i,
alborder TYPE i,
topborder TYPE i,
douborder TYPE i,
lc_date TYPE d,
ret_date TYPE i,
lc_time TYPE t,
lc_fmtindex TYPE i,
ret_time TYPE f.
DATA: prc_lines_count TYPE i,
* prc_column_idx TYPE i,
loc_col TYPE i,
dat_row TYPE i,
lc_val TYPE i,
lc_len TYPE i,
cnt_prc TYPE i,
procent_prc TYPE i,
wr_string TYPE c,
lc_fx TYPE i,
ts_string(225) TYPE c,
wr_numb TYPE f,
ref_tab1 TYPE REF TO data.
FIELD-SYMBOLS: " <l_table1> TYPE STANDARD TABLE,
<it_rc> TYPE x,
<field_from> TYPE ANY,
<rec_val> TYPE ANY.
DESCRIBE TABLE dat_tab LINES dat_row .
prc_lines_count = dat_row .
tec_row = _row.
loc_col = _col.
IF col_tab IS INITIAL.
GET REFERENCE OF dat_tab INTO ref_tab1.
CALL METHOD me->get_tabl_inf( EXPORTING dat_tabl = ref_tab1 IMPORTING t_fcat = lctb_col1 ).
ELSE.
MOVE col_tab[] TO lctb_col1[].
ENDIF.
loc_col = 0.
LOOP AT lctb_col1 INTO wa_cols.
nint4 = loc_col.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = wa_cols-style.
MODIFY lctb_col1 FROM wa_cols.
loc_col = loc_col + 1.
ENDLOOP.
loc_col = _col.
LOOP AT dat_tab ASSIGNING <rec_val> .
IF sy-batch IS INITIAL. " покажем индикатор выполнения
IF dat_row > 100.
cnt_prc = dat_row.
procent_prc = cnt_prc DIV 10.
cnt_prc = sy-tabix MOD procent_prc.
IF cnt_prc = 1.
ENDIF.
ENDIF.
ENDIF.
**********************************************************************
nint4 = tec_row - 1.
CALL METHOD inttohex
EXPORTING
ilen = 2
CHANGING
chex = mrc_st-row.
**********************************************************************
loc_col = _col.
LOOP AT lctb_col1 INTO wa_cols.
CHECK loc_col < 255.
CHECK tec_row < 64000.
IF wa_cols-col_pos IS NOT INITIAL.
ASSIGN COMPONENT wa_cols-fieldname OF STRUCTURE <rec_val> TO <field_from> .
IF sy-subrc = 0.
CASE wa_cols-inttype.
WHEN 'C' OR 'X'.
lc_val = 2.
WHEN 'P' OR 'N' OR 'I' OR 'F' OR 'D' OR 'T'.
lc_val = 1.
ENDCASE.
ELSE.
lc_val = xlsblank.
ENDIF.
ELSE.
lc_val = xlsblank.
ENDIF.
mrc_st-col = wa_cols-style.
mrc_st-indexxf = '0F00'.
IF wa_cols-inttype = 'D' AND lc_val = xlsnumber.
lc_date = <field_from>.
CALL METHOD: me->get_xldate
EXPORTING
sapdate = lc_date
CHANGING
xldat = ret_date.
ASSIGN ret_date TO <field_from> .
ENDIF.
IF lc_val = xlsnumber AND wa_cols-inttype = 'T'.
lc_time = <field_from>.
CALL METHOD: me->get_xltime
EXPORTING
saptime = lc_time
CHANGING
xltime = ret_time.
ASSIGN ret_time TO <field_from> .
ENDIF.
IF <field_from> IS INITIAL.
lc_val = xlsblank.
ENDIF.
mrc_st-col = wa_cols-style+0(2) .
CASE lc_val.
WHEN xlsnumber.
mrc_st-opcode = n_opcode.
mrc_st-length = n_length.
* ASSIGN mrc_st TO <it_rc> CASTING.
* IF lc_val = xlsnumber.
* CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
* ENDIF.
WHEN xlsblank.
mrc_st-opcode = bl_opcode.
mrc_st-length = bl_length.
* ASSIGN mrc_st TO <it_rc> CASTING.
* IF lc_val NE xlsnumber.
* CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
* ENDIF.
WHEN xlstext.
ts_string = <field_from>.
SHIFT ts_string RIGHT DELETING TRAILING ' '.
TRANSLATE ts_string USING ' 0'.
IF ts_string CO '1234567890'.
lc_val = xlsnumber.
wr_numb = <field_from>.
mrc_st-opcode = n_opcode.
mrc_st-length = n_length.
ELSE.
wr_string = <field_from>.
lc_len = STRLEN( wr_string ).
nint4 = lc_len + 8.
mrc_st-opcode = st_opcode.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = mrc_st-length.
ENDIF.
ASSIGN mrc_st TO <it_rc> CASTING.
IF lc_val NE xlsnumber.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDIF.
ENDCASE.
CASE lc_val.
WHEN xlstext.
nint4 = lc_len.
CALL METHOD inttohex
EXPORTING
ilen = 1
CHANGING
chex = loc_strlen.
CONCATENATE bufff loc_strlen INTO bufff IN BYTE MODE.
CALL METHOD add_string
EXPORTING
adtext = wr_string.
WHEN xlsnumber.
MOVE <field_from> TO wr_numb .
* CALL METHOD: me->wr_number( _val = wr_numb col = loc_col row = tec_row _indexxf = 0 ).
ASSIGN mrc_st TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
CALL METHOD add_number
EXPORTING
adnumb = wr_numb.
WHEN xlsblank.
mrc_st-opcode = bl_opcode.
mrc_st-length = bl_length.
ASSIGN mrc_st TO <it_rc> CASTING.
CONCATENATE bufff <it_rc> INTO bufff IN BYTE MODE.
ENDCASE.
loc_col = loc_col + 1.
ENDLOOP.
tec_row = tec_row + 1 .
ENDLOOP.
loc_col = _col.
LOOP AT lctb_col1 INTO wa_cols.
IF wa_cols-outputlen NE 0.
set_col_width( f_col = loc_col e_col = loc_col width = wa_cols-outputlen ).
ENDIF.
loc_col = loc_col + 1.
ENDLOOP.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 100
text = 'Выгрузка закончена'.
ENDMETHOD. "write_tab
METHOD get_xldate.
DATA: deltdate TYPE dats VALUE '18991230'.
CLEAR xldat.
IF sapdate IS NOT INITIAL.
xldat = sapdate - deltdate.
ELSE.
xldat = sapdate .
ENDIF.
ENDMETHOD. "get_xldate
METHOD get_xltime.
DATA: "hh TYPE i,
ofs TYPE i,
del TYPE i VALUE 24 .
CLEAR: ofs ,xltime .
IF saptime IS NOT INITIAL.
DO 3 TIMES.
xltime = xltime + saptime+ofs(2) / del.
ofs = ofs + 2.
del = del * 60 .
ENDDO.
ELSE.
xltime = saptime.
ENDIF.
ENDMETHOD. "get_xltime
METHOD get_tabl_inf .
DATA: lcl_table_descr TYPE REF TO cl_abap_tabledescr,
lcl_struc_descr TYPE REF TO cl_abap_structdescr,
lcl_f_descr TYPE REF TO cl_abap_elemdescr, "CL_ABAP_DATADESCR,
ret_components TYPE abap_compdescr_tab,
components TYPE abap_compdescr_tab,
ls_dd04t TYPE dd04t,
ls_field_list TYPE dfies,
lc_tabix TYPE i VALUE 1,
p_field_list TYPE TABLE OF dfies,
lt_dd04t TYPE STANDARD TABLE OF dd04t ,
lt_fcatalog TYPE lvc_t_fcat,
ls_fcatalog TYPE lvc_s_fcat,
wa_ret_components TYPE LINE OF abap_compdescr_tab.
CLEAR: lcl_table_descr , lcl_struc_descr , ret_components ,
ls_field_list, wa_ret_components .
REFRESH: lt_dd04t[], components[], p_field_list[].
DATA: new_line1 TYPE REF TO data, rel_name TYPE ddobjname.
FIELD-SYMBOLS:
<fs> TYPE STANDARD TABLE,
<l_line1> TYPE ANY,
<fls> TYPE ANY.
ASSIGN dat_tabl->* TO <fs>.
CREATE DATA new_line1 LIKE LINE OF <fs>.
ASSIGN new_line1->* TO <l_line1>.
lcl_table_descr ?= cl_abap_typedescr=>describe_by_data_ref( dat_tabl ).
lcl_struc_descr ?= lcl_table_descr->get_table_line_type( ).
ls_fcatalog-rollname = lcl_struc_descr->get_relative_name( ).
IF lcl_struc_descr->is_ddic_type( ) = abap_true OR ls_fcatalog-rollname IS NOT INITIAL.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = ls_fcatalog-rollname
CHANGING
ct_fieldcat = t_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
ELSE.
ret_components = lcl_struc_descr->components.
LOOP AT ret_components INTO wa_ret_components .
CLEAR ls_fcatalog.
ls_fcatalog-fieldname = wa_ret_components-name.
ASSIGN COMPONENT wa_ret_components-name OF STRUCTURE <l_line1> TO <fls> .
lcl_f_descr ?= cl_abap_elemdescr=>describe_by_data( <fls> ).
ls_fcatalog-rollname = lcl_f_descr->get_relative_name( ).
ls_fcatalog-col_pos = lc_tabix.
**********************************************************************
ls_fcatalog-decimals = wa_ret_components-decimals.
ls_fcatalog-inttype = wa_ret_components-type_kind.
APPEND ls_fcatalog TO t_fcat.
CLEAR ls_fcatalog.
lc_tabix = lc_tabix + 1 .
ENDLOOP.
CHECK t_fcat[] IS NOT INITIAL.
SELECT * FROM dd04t INTO TABLE lt_dd04t
FOR ALL ENTRIES IN t_fcat
WHERE rollname = t_fcat-rollname " <-- !!!
AND ddlanguage = sy-langu.
SORT lt_dd04t BY rollname.
LOOP AT t_fcat INTO ls_fcatalog.
READ TABLE lt_dd04t INTO ls_dd04t WITH KEY rollname = ls_fcatalog-rollname BINARY SEARCH.
IF sy-subrc = 0.
ls_fcatalog-reptext = ls_dd04t-reptext.
ls_fcatalog-scrtext_s = ls_dd04t-scrtext_s.
ls_fcatalog-scrtext_m = ls_dd04t-scrtext_m.
ls_fcatalog-scrtext_l = ls_dd04t-scrtext_l.
ENDIF.
MODIFY t_fcat FROM ls_fcatalog.
ENDLOOP.
ENDIF.
ENDMETHOD. "REFRESH_param
ENDCLASS. "zcl_dexcel IMPLEMENTA