动态将用户指定的内表的内容通过 Excel 导出

简介: 动态将用户指定的内表的内容通过 Excel 导出
*&---------------------------------------------------------------------*
*& Report  /SF0A0001/TABLE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  /SF0A0001/TABLE.
INCLUDE ole2incl.
DATA:
      gt_title TYPE string_table,
      lr_type_descr type ref to cl_abap_typedescr,
      lr_type_descr2 type ref to cl_abap_structdescr,
      lr_table_descr type ref to cl_abap_tabledescr,
      gv_filename TYPE string,
      gv_path TYPE string,
      lr_table TYPE REF TO data,
      lt_comps type cl_abap_structdescr=>component_table,
      ls_comp like line of lt_comps,
      gv_fullpath TYPE string.
field-symbols: <lt_data> type table.
*&----------------------------------------------------*
*&   SELECTION-SCREEN                                 *
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS: p_file TYPE string LOWER CASE OBLIGATORY,
            p_tab LIKE DD02L-TABNAME DEFAULT '/SF0A0001/REPORT'.
SELECTION-SCREEN END OF BLOCK b1.
*&----------------------------------------------------*
*&  START-OF-SELECTION                                *
*&----------------------------------------------------*
START-OF-SELECTION.
  PERFORM get_titles.
  PERFORM get_data.
  PERFORM create_excel USING p_file 'Flights Info' gt_title.
  WRITE: 'Export is finished successfully!'.
*&----------------------------------------------------*
*& AT SELECTION-SCREEN                                *
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title      = 'Select file'
      default_extension = 'xls'
      file_filter       = '*.xls'
    CHANGING
      filename          = gv_filename
      path              = gv_path
      fullpath          = gv_fullpath.
  IF sy-subrc EQ 0.
    p_file = gv_fullpath.
  ENDIF.
*&----------------------------------------------------*
*&      Macros                                        *
*&----------------------------------------------------*
  DEFINE handle_errors.
    if sy-subrc <> 0.
      write: 'Error in processing Excel file:', lv_step.
      stop.
    endif.
  END-OF-DEFINITION.
*&----------------------------------------------------*
*&      Form  get_titles                              *
*&----------------------------------------------------*
FORM get_titles.
  DATA: i_fieldcat TYPE LVC_T_FCAT.
  FIELD-SYMBOLS: <item> LIKE LINE OF i_fieldcat.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME             = p_tab
    CHANGING
      ct_fieldcat                  = i_fieldcat.
  LOOP AT i_fieldcat ASSIGNING <item>.
    APPEND <item>-FIELDNAME TO gt_title.
  ENDLOOP.
ENDFORM.                    "get_titles
*&----------------------------------------------------*
*&      Form  get_data                                *
*&----------------------------------------------------*
FORM get_data.
  "call method cl_abap_typedescr=>describe_by_name
   CALL METHOD cl_abap_tabledescr=>describe_by_name
    exporting
      p_name         = p_tab
    receiving
      p_descr_ref    = lr_type_descr
    exceptions
      type_not_found = 1
      others         = 99.
  if sy-subrc <> 0.
    message 'dump' type 'X'.
  endif.
  ls_comp-type ?= lr_type_descr.
  ls_comp-as_include = 'X'.
  ls_comp-name = 'DATA'.
  APPEND ls_comp TO lt_comps.
  try.
      lr_type_descr2 = cl_abap_structdescr=>create(
       p_components = lt_comps ).
    catch cx_sy_struct_creation.
      message 'dump' type 'X'.
  endtry.
  try.
      call method cl_abap_tabledescr=>create
        exporting
          p_line_type  = lr_type_descr2
          p_table_kind = cl_abap_tabledescr=>tablekind_std
          p_unique     = abap_false
          p_key_kind   = cl_abap_tabledescr=>keydefkind_default
        receiving
          p_result     = lr_table_descr.
    catch cx_sy_table_creation.
      message 'dump' type 'X'.
  endtry.
  CREATE DATA lr_table TYPE HANDLE lr_table_descr.
  ASSIGN lr_table->* TO <lt_data>.
  ASSERT sy-subrc = 0.
  SELECT * FROM (p_tab) INTO CORRESPONDING FIELDS OF TABLE <lt_data>.
  check SY-SUBRC = 0.
  data: TT type TABLE OF /SF0A0001/REPORT.
  SELECT * FROM /SF0A0001/REPORT INTO CORRESPONDING FIELDS OF TABLE TT.
  CHECK SY-SUBRC = 0.
ENDFORM.                    " get_data
*&----------------------------------------------------*
*&      Form  create_excel                            *
*&----------------------------------------------------*
FORM create_excel USING pv_file TYPE string
                        pv_sheet_name TYPE string
                        pt_title TYPE string_table.
  DATA:
        lv_row TYPE i,
        lv_column TYPE i,
        lv_total_columns TYPE i,
        lv_field TYPE string,
        lv_step TYPE string.
*In a buffered method call (addition: NO FLUSH) of OLE you cannot use local variables at result variables.
*Use global variables or static variables (STATICS) instead.
  STATICS:lh_appl TYPE ole2_object,
          lh_workbook_list TYPE ole2_object,
          lh_workbook TYPE ole2_object,
          lh_sheet TYPE ole2_object,
          lh_columns TYPE ole2_object,
          lh_cell TYPE ole2_object,
          lh_interior TYPE ole2_object,
          lh_font TYPE ole2_object.
  FIELD-SYMBOLS:
         <ls_itab_row> TYPE ANY,
         <ls_title> TYPE string,
         <ls_itab_cell> TYPE ANY.
* We will use 'NO FLUSH' addition in this example:
* Normally, OLE statements are buffered by the ABAP processor and executed at the frontend collectively before
* the first statement which is not of OLE context. Using the 'NO FLUSH' addition prevents this and postpones
* the execution till just before the first non-OLE statement coming after an OLE statement without NO FLUSH
* addition.
* Start application and set it to invisible
  lv_step = 'Starting Excel...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 0
       text             = lv_step
          .
  CREATE OBJECT lh_appl 'Excel.Application' NO FLUSH. " If addition 'NO FLUSH' is used, the return code sy-subrc is not filled so it remains 0.
  SET PROPERTY OF lh_appl 'SheetsInNewWorkbook' = 1 no flush.
  SET PROPERTY OF lh_appl 'Visible' = 0 . "Flush is executed after this OLE statement, so return code sy-subrc will be filled. We evaluate this return code for error handling.
  handle_errors.
* Add new workbook
  lv_step = 'Create workbook...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 10
       text             = lv_step
       .
  GET PROPERTY OF lh_appl 'Workbooks' = lh_workbook_list no flush.
  CALL METHOD OF lh_workbook_list 'Add' = lh_workbook.
  handle_errors.
* Configure the active sheet
  lv_step = 'Configure sheet...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 20
       text             = lv_step
       .
  GET PROPERTY OF lh_appl 'ActiveSheet' = lh_sheet  no flush.
  SET PROPERTY OF lh_sheet 'Name' = pv_sheet_name.
  handle_errors.
  lv_step = 'Writing title...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 30
       text             = lv_step
       .
  LOOP AT pt_title ASSIGNING <ls_title>.
    lv_column = sy-tabix.
    CALL METHOD OF lh_appl 'Cells' = lh_cell NO FLUSH     "Get cell on the active worksheet in the application
      EXPORTING
      #1 = 1
      #2 = lv_column .
    handle_errors.
    SET PROPERTY OF lh_cell 'Value' =  <ls_title> no flush.
    GET PROPERTY OF lh_cell 'Interior' = lh_interior no flush.
    SET PROPERTY OF lh_interior 'ColorIndex' = 35 no flush.
    GET PROPERTY OF lh_cell 'Font' = lh_font no flush.
    SET PROPERTY OF lh_font 'Bold' = 1 no flush.
  ENDLOOP.
  CALL FUNCTION 'FLUSH'  "Trigger the flush explicitly
    EXCEPTIONS
      cntl_system_error = 1
      cntl_error        = 2
      OTHERS            = 3.
  handle_errors.
* Write actual data
  lv_step = 'Writing data...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 40
       text             = lv_step
       .
  lv_total_columns = lv_column.
  lv_row = 1.
  LOOP AT <lt_data> ASSIGNING <ls_itab_row>.
    lv_row = lv_row + 1.
    DO lv_total_columns TIMES.
      lv_column = sy-index.
      CALL METHOD OF lh_appl 'Cells' = lh_cell NO FLUSH  "Get cell on the active worksheet in the application
        EXPORTING
        #1 = lv_row
        #2 = lv_column.
      handle_errors.
      ASSIGN COMPONENT lv_column OF STRUCTURE <ls_itab_row> TO <ls_itab_cell>.
      SET PROPERTY OF lh_cell 'Value' = <ls_itab_cell> no flush.
    ENDDO.
  ENDLOOP.
  CALL FUNCTION 'FLUSH'  "Trigger the flush explicitly
    EXCEPTIONS
      cntl_system_error = 1
      cntl_error        = 2
      OTHERS            = 3.
  handle_errors.
* Set column width
  lv_step = 'Setting column width...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 50
       text             = lv_step
       .
  CALL METHOD OF lh_sheet 'Columns' = lh_columns NO FLUSH.
  CALL METHOD OF lh_columns 'Autofit'.
  handle_errors.
* Save and close
  lv_step = 'Saving and closing workbook...'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "Tell user what is going on
    EXPORTING
       percentage       = 60
       text             = lv_step
       .
  CALL METHOD OF lh_workbook 'SaveAs' NO FLUSH
    EXPORTING
    #1 = pv_file "File name
    .
  CALL METHOD OF lh_workbook 'Close' NO FLUSH.
  CALL METHOD OF lh_appl 'Quit' NO FLUSH.
  FREE OBJECT lh_appl.
  handle_errors.
ENDFORM.                    " create_excel
相关文章
|
2月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
31 0
|
3天前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
12天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
32 2
|
2月前
|
前端开发 JavaScript
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
本文介绍了在Vue项目中使用`xlsx`和`xlsx-style`(或`xlsx-style-vite`)库实现导出具有自定义样式的Excel文件的方法,并提供了详细的示例代码和操作效果截图。
334 1
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
|
2月前
|
前端开发 Python
使用Python+openpyxl实现导出自定义样式的Excel文件
本文介绍了如何使用Python的openpyxl库导出具有自定义样式的Excel文件,包括设置字体、对齐方式、行列宽高、边框和填充等样式,并提供了完整的示例代码和运行效果截图。
40 1
使用Python+openpyxl实现导出自定义样式的Excel文件
|
2月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何直接导出excel文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
224 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
2月前
|
数据管理 数据处理 数据库
分享一个导出数据到 Excel 的解决方案
分享一个导出数据到 Excel 的解决方案
|
2月前
|
SQL
SQL SERVER 查询表结构,导出到Excel 生成代码用
SQL SERVER 查询表结构,导出到Excel 生成代码用
33 0
|
3月前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程
下一篇
无影云桌面