SAP 操作文件

本地文件

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容