本地文件
excel
导入
ALSM_EXCEL_TO_INTERNAL_TABLE
本质是OLE 通过区域获取剪切板数据。使用到OLE就有下面两个问题
问题一 ,是当我使用这个时读取后的文件无法实现同时打开文件的效果。
CALL METHOD OF workbook 'SAVEAS'
EXPORTING #1 = p_file #2 = 1. " 将 EXCEL 文件保存
CALL METHOD OF workbook 'CLOSE' . " 将 EXCEL 关闭 这样打开就不会说打开一个空白了。(这个问题即使你释放了资源也是一样的)
问题二,弹窗是否保存更改的提示
GET PROPERTY OF lv_excel 'ACTIVEWORKBOOK' = workbook.
SET PROPERTY OF lv_excel 'DisplayAlerts' = 'false'. “不跳出提示
"默认保存,当保存同名的文件已打开的情况下保存在工作薄一中。
问题三 , 单元格长度255 需要扩展
ZALSM_EXCEL_TO_INTERNAL_TABLE 就是把原有的ALSM_EXCEL_TO_INTERNAL_TABLE
扩展 senderline中结构 line 长度。无论是通过PERFORM 还是 FUNCTION复制都一样的。
下面是可以用的源码。
*"----------------------------------------------------------------------"
*"*"本地接口:
*" IMPORTING
*" REFERENCE(FILENAME) TYPE RLGRAP-FILENAME
*" REFERENCE(I_BEGIN_COL) TYPE I
*" REFERENCE(I_BEGIN_ROW) TYPE I
*" REFERENCE(I_END_COL) TYPE I
*" REFERENCE(I_END_ROW) TYPE I
*" TABLES
*" INTERN STRUCTURE ZALSMEX_TABLINE
*" EXCEPTIONS
*" INCONSISTENT_PARAMETERS
*" UPLOAD_OLE
*"----------------------------------------------------------------------
TYPE-POOLS: ole2.
* value of excel-cell
TYPES: ty_d_itabvalue TYPE zalsmex_tabline-value,
* internal table containing the excel data
ty_t_itab TYPE zalsmex_tabline OCCURS 0,
* line type of sender table
BEGIN OF ty_s_senderline,
line(4096) TYPE c,
END OF ty_s_senderline,
* sender table
ty_t_sender TYPE ty_s_senderline OCCURS 0.
*
CONSTANTS: gc_esc VALUE '"'.
*"FUNCTION ZALSM_EXCEL_TO_INTERNAL_TABLE .
*"--------------------------------------------------------------------"
*"*"局部接口:
*" IMPORTING
*" REFERENCE(FILENAME) TYPE RLGRAP-FILENAME
*" REFERENCE(I_BEGIN_COL) TYPE I
*" REFERENCE(I_BEGIN_ROW) TYPE I
*" REFERENCE(I_END_COL) TYPE I
*" REFERENCE(I_END_ROW) TYPE I
*" TABLES
*" INTERN STRUCTURE ZALSMEX_TABLINE
*" EXCEPTIONS
*" INCONSISTENT_PARAMETERS
*" UPLOAD_OLE
*"--------------------------------------------------------------------
DATA: excel_tab TYPE ty_t_sender.
DATA: ld_separator TYPE c.
DATA: application TYPE ole2_object,
workbook TYPE ole2_object,
range TYPE ole2_object,
worksheet TYPE ole2_object.
DATA: h_cell TYPE ole2_object,
h_cell1 TYPE ole2_object.
DATA:
ld_rc TYPE i.
* Rückgabewert der Methode "clipboard_export "
* Makro für Fehlerbehandlung der Methods
DEFINE m_message.
CASE sy-subrc.
WHEN 0.
WHEN 1.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
WHEN OTHERS. RAISE upload_ole.
ENDCASE.
END-OF-DEFINITION.
* check parameters
IF i_begin_row > i_end_row. RAISE inconsistent_parameters. ENDIF.
IF i_begin_col > i_end_col. RAISE inconsistent_parameters. ENDIF.
* Get TAB-sign for separation of fields
CLASS cl_abap_char_utilities DEFINITION LOAD.
ld_separator = cl_abap_char_utilities=>horizontal_tab.
* open file in Excel
IF application-header = space OR application-handle = -1.
CREATE OBJECT application 'Excel.Application'.
m_message.
ENDIF.
CALL METHOD OF application 'Workbooks' = workbook.
m_message.
CALL METHOD OF workbook 'Open' EXPORTING #1 = filename.
m_message.
* set property of application 'Visible' = 1.
* m_message.
GET PROPERTY OF application 'ACTIVESHEET' = worksheet.
m_message.
* mark whole spread sheet
CALL METHOD OF worksheet 'Cells' = h_cell
EXPORTING #1 = i_begin_row #2 = i_begin_col.
m_message.
CALL METHOD OF worksheet 'Cells' = h_cell1
EXPORTING #1 = i_end_row #2 = i_end_col.
m_message.
CALL METHOD OF worksheet 'RANGE' = range
EXPORTING #1 = h_cell #2 = h_cell1.
m_message.
CALL METHOD OF range 'SELECT'.
m_message.
* copy marked area (whole spread sheet) into Clippboard
CALL METHOD OF range 'COPY'.
m_message.
* read clipboard into ABAP
CALL METHOD cl_gui_frontend_services=>clipboard_import
IMPORTING
data = excel_tab
EXCEPTIONS
cntl_error = 1
* ERROR_NO_GUI = 2
* NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE a037(alsmex).
ENDIF.
PERFORM separated_to_intern_convert TABLES excel_tab intern
USING ld_separator.
* clear clipboard
REFRESH excel_tab.
CALL METHOD cl_gui_frontend_services=>clipboard_export
IMPORTING
data = excel_tab
CHANGING
rc = ld_rc
EXCEPTIONS
cntl_error = 1
* ERROR_NO_GUI = 2
* NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
* quit Excel and free ABAP Object - unfortunately, this does not kill
* the Excel process
CALL METHOD OF application 'QUIT'.
m_message.
* >>>>> Begin of change note 575877
* to kill the Excel process it's necessary to free all used objects'
FREE OBJECT h_cell. m_message.
FREE OBJECT h_cell1. m_message.
FREE OBJECT range. m_message.
FREE OBJECT worksheet. m_message.
FREE OBJECT workbook. m_message.
FREE OBJECT application. m_message.
* <<<<< End of change note 575877
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form separated_to_intern_convert
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_TAB text
* -->I_INTERN text
* -->I_SEPARATOR text
*----------------------------------------------------------------------*
FORM separated_to_intern_convert TABLES i_tab TYPE ty_t_sender
i_intern TYPE ty_t_itab
USING i_separator TYPE c.
DATA: l_sic_tabix LIKE sy-tabix,
l_sic_col TYPE kcd_ex_col.
DATA: l_fdpos LIKE sy-fdpos.
REFRESH i_intern.
LOOP AT i_tab.
l_sic_tabix = sy-tabix.
l_sic_col = 0.
WHILE i_tab CA i_separator.
l_fdpos = sy-fdpos.
l_sic_col = l_sic_col + 1.
PERFORM line_to_cell_separat TABLES i_intern
USING i_tab l_sic_tabix l_sic_col
i_separator l_fdpos.
ENDWHILE.
IF i_tab <> space.
CLEAR i_intern.
i_intern-row = l_sic_tabix.
i_intern-col = l_sic_col + 1.
i_intern-value = i_tab.
APPEND i_intern.
ENDIF.
ENDLOOP.
ENDFORM. " SEPARATED_TO_INTERN_CONVERT"
*&---------------------------------------------------------------------*
*& Form line_to_cell_separat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_INTERN text
* -->I_LINE text
* -->I_ROW text
* -->CH_CELL_COL text
* -->I_SEPARATOR text
* -->I_FDPOS text
*----------------------------------------------------------------------*
FORM line_to_cell_separat TABLES i_intern TYPE ty_t_itab
USING i_line
i_row LIKE sy-tabix
ch_cell_col TYPE kcd_ex_col
i_separator TYPE c
i_fdpos LIKE sy-fdpos.
DATA: l_string TYPE ty_s_senderline.
DATA l_sic_int TYPE i.
CLEAR i_intern.
l_sic_int = i_fdpos.
i_intern-row = i_row.
l_string = i_line.
i_intern-col = ch_cell_col.
* csv Dateien mit separator in Zelle: --> ;"abc;cd";
IF ( i_separator = ';' OR i_separator = ',' ) AND
l_string(1) = gc_esc.
PERFORM line_to_cell_esc_sep USING l_string
l_sic_int
i_separator
i_intern-value.
ELSE.
IF l_sic_int > 0.
i_intern-value = i_line(l_sic_int).
ENDIF.
ENDIF.
IF l_sic_int > 0.
APPEND i_intern.
ENDIF.
l_sic_int = l_sic_int + 1.
i_line = i_line+l_sic_int.
ENDFORM. "line_to_cell_separat
*---------------------------------------------------------------------"
FORM line_to_cell_esc_sep USING i_string
i_sic_int TYPE i
i_separator TYPE c
i_intern_value TYPE ty_d_itabvalue.
DATA: l_int TYPE i,
l_cell_end(2).
FIELD-SYMBOLS: <l_cell>.
l_cell_end = gc_esc.
l_cell_end+1 = i_separator .
IF i_string CS gc_esc.
i_string = i_string+1.
IF i_string CS l_cell_end.
l_int = sy-fdpos.
ASSIGN i_string(l_int) TO <l_cell>.
i_intern_value = <l_cell>.
l_int = l_int + 2.
i_sic_int = l_int.
i_string = i_string+l_int.
ELSEIF i_string CS gc_esc.
* letzte Celle
l_int = sy-fdpos.
ASSIGN i_string(l_int) TO <l_cell>.
i_intern_value = <l_cell>.
l_int = l_int + 1.
i_sic_int = l_int.
i_string = i_string+l_int.
l_int = strlen( i_string ).
IF l_int > 0 . MESSAGE x001(kx) . ENDIF.
ELSE.
MESSAGE x001(kx) . "was ist mit csv-Format
ENDIF.
ENDIF.
ENDFORM. "line_to_cell_esc_sep
导出
ABAP内表导出为EXCEL格式的几种方法 - 氢氦 - 博客园 (cnblogs.com)
文本
GUI_UPLOAD
注意 filetype ,CODEPAGE
filetype有3种ASC BIN和DAT,指定filetype意味着它再上传或者下载过程中每个colomn之间会以什么分割,用得最多的是DAT类型,这种类型指定了分割符为tab。
BIN类型用得比较少,16进制文件会用到。
ASC类型,要求定义文件字符紧密,并且要指定固定的放在table每列的长度,否则会出问题。
codepage用来指定存取文件过程中的编码或者解码方式,8400代表GBK,可以通过SCP_CODEPAGE_BY_EXTERNAL_NAME函数去检索对应的编码的编号
服务器文件
获取文件
文本
1.在应用服务器中打开文件OPEN DATASET [options]此语句打开文件,如果不指定任何模式选项,则文件将按照二进制模式打开。如果系统不能打开文件,则将系统字段设置为8,否则SY-SUBRC返回0。
2.打开文件读取OPEN DATASET FOR INPUT IN TEXT MODE ENCODING DEFAULT.(以TXT文件打开)
3.打开文件写入OPEN DATASET FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.(以TXT文件打开写入,这种是打开文件完全重写)
4.打开文件追加OPEN DATASET FOR APPENDING IN TEXT MODE ENCODING DEFAULT.(以TXT文件打开写入,这种是打开文件追加记录)
5.关闭应用服务器上的文件 CLOSE DATASET.
6.删除应用服务器上的文件 DELETE DATASET.
7.向应用服务器上的文件写入数据TRANSFER TO [地址].
8.从应用服务器上文件读取数据 READ DATASET INTO [LENGTH].
获取服务器上面的其他文件,例如EXCEL
ABAP随笔-关于ECC后台server读取Excel方案的想法 - 腾讯云开发者社区-腾讯云 (tencent.com)