无法从放置在AL11的一个Excel的多个Excel工作表中读取数据

2020-09-08 01:40发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

我无法从多张纸上读取AL11上的excel文件的数据。

该程序对于另一个excel可以正常运行,但是对于此特定的excel表却无法运行。

对于o_spreadsheet-> get_ranges_data方法,它进入无限循环。 调试时,这种情况下对象句柄将变为-1。

这是代码:

数据:lv_len TYPE sy-tabix,
lv_filenamesize TYPE drao-orln,
lv_lines TYPE sy-tabix,
lt_rcgrepfile TYPE STANDARD表,bapiconten,
ls_rcgrepfile TYPE bapiconten, lt_sheet TYPE soi_sheets_table,
lv_top TYPE i VALUE 1,
lt_data1 TYPE soi_generic_table,
lt_data TYPE soi_generic_table,
ls_data TYPE ty_data,
lt_ranges TYPE soi_range_list,
ls_retcode。 类别c_oi_errors定义负载。
*为容器创建实例控件
调用方法c_oi_container_control_creator => get_container_control
IMPORTING
控件= o_control
错误= o_error。

IF o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
type ='E'。
ENDIF。
*建立与GUI控件的连接
调用方法o_control-> init_control
导出
r3_application_name ='Excel文档容器'
inplace_enabled ='X'
父= cl_gui_container => screen0
导入
错误= o_error。

如果o_error-> has_failed ='X'。
呼叫方法o_error-> raise_message
导出
type ='E'。
ENDIF。

*创建文档代理
呼叫方法o_control-> get_document_proxy
导出
document_type = soi_doctype_excel_sheet
导入
document_proxy = o_document
错误= o_error。


如果o_error-> has_failed ='X '。
调用方法o_error-> raise_message
导出
type ='E'。
ENDIF。

TRY。
OPEN DATASET p_file用于在二进制模式下输入。 br> *打开数据集p_file以使用SMART LINEFEED进行默认编码以文本模式输入。
如果sy-subrc =0。
做。
清除lv_len。
清除ls_rcgrepfile。
读取数据集p_file INTO ls_rcgrepfile长度lv_len。
*读取数据集p_file INTO ls_rcgrepfile。
IF sy-subrc <> 0.
IF lv_len> 0.
lv_filenamesize = lv_filenamesize + lv_len。
APPEND TO Ls_rcg 。
ENDIF。
退出。
ENDIF。
lv_filenamesize = lv_filenamesize + lv_len。
附加ls_rcgrepfi le TO lt_rcgrepfile。
ENDDO。
ENDIF。

描述表lt_rcgrepfile线lv_lines。

CLOSE DATASET p_file。


捕获cx_root到g_ex_root。

清除gv_msg。
gv_msg = g_ex_root-> get_text()。

如果gv_msg不是INITIAL。
sy-subrc =4。
ENDIF。

ENDTRY。

*在SAPWORKDIR中打开电子表格
调用方法o_document-> open_document_from_table
导出
document_size = CONV#(lv_filenamesize)
document_table = lt_rcgrepfile []
* document_title = ''
* no_flush =''
open_inplace = abap_true
* open_readonly =''
* protect_document =''
* onsave_macro =''
* startup_macro =``
>导入
错误= o_error。

如果o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
类型='E'。
ENDIF。

*打开电子表格接口
调用方法o_document-> get_spreadsheet_interface
导出
no_flush =''
导入
sheet_interface = o_sp readsheet
错误= o_error。

如果o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
类型='E'。
ENDIF 。

调用方法o_spreadsheet-> get_sheets
*导出
* no_flush =''
*更新= -1
IMPORTING
图纸= lt_sheets
错误= o_error 。

将lt_sheets循环到数据(ls_sheets)。
lv_top =2。
调用方法o_spreadsheet-> select_sheet
导出
名称= ls_sheets-sheet_name
导入
>错误= o_error。
如果o_error-> has_failed ='X'。
退出。
ENDIF。
DO。
调用方法o_spreadsheet-> set_selection
导出
top = lv_top
左= 1
行='5000'
列='3'。

调用方法o_spreadsheet-> insert_range
导出
名称='Test'< br>行='5000'
列='3'
no_flush =''
导入
错误= o_error。
如果o_error-> has_failed ='X'。
退出 。
ENDIF。

刷新lt_data1。

调用方法o_spreadsheet-> get_ranges_data
E XPORTING
全部='X'
导入
内容= lt_data1
错误= o_error
CHANGING
范围= lt_ranges。
如果lv_top =1。
删除lt_data1在哪里 row ='1'。
ENDIF。
读取表lt_data1到DATA(ls_data1)中,其中KEY列='2'
值=空间。
如果sy-subrc =0。" AND ls_data1- 行<1000。
*删除lt_data1值是初始值还是空格=
将lt_data1的行添加到lt_data。
退出。
ENDIF。
*删除lt_data1值是初始值还是OR 值=空间。
在lt_data1到lt_data中追加行。
lv_top = lv_top +5000。
ENDDO。
ENDLOOP。

清除ls_data1。
将lt_data放入LOs_data1 。
案例ls_data1列。
何时1.
将ls_data1值移动到ls_data-banka。
当2.
将ls_data1值移动到ls_data-ifsc。
何时3 。
将ls_data1值移动到ls_data分支。
何时4.
将ls_data1值移动到ls_data地址。
当5.
将ls_data1值移动到ls_data-contact。 br>何时6.
将ls_data1值移至ls_d ata-city。
何时7.
将ls_data1值移动到ls_data-district。
何时8.
将ls_data1值移动到ls_data-state。
附加ls_data到gt_data。
清除ls_data。
在其他情况下。
结束。
ENDLOOP。
*删除gt_data索引1.
在gt_data所在的ifsc =空格处删除。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

我无法从多张纸上读取AL11上的excel文件的数据。

该程序对于另一个excel可以正常运行,但是对于此特定的excel表却无法运行。

对于o_spreadsheet-> get_ranges_data方法,它进入无限循环。 调试时,这种情况下对象句柄将变为-1。

这是代码:

数据:lv_len TYPE sy-tabix,
lv_filenamesize TYPE drao-orln,
lv_lines TYPE sy-tabix,
lt_rcgrepfile TYPE STANDARD表,bapiconten,
ls_rcgrepfile TYPE bapiconten, lt_sheet TYPE soi_sheets_table,
lv_top TYPE i VALUE 1,
lt_data1 TYPE soi_generic_table,
lt_data TYPE soi_generic_table,
ls_data TYPE ty_data,
lt_ranges TYPE soi_range_list,
ls_retcode。 类别c_oi_errors定义负载。
*为容器创建实例控件
调用方法c_oi_container_control_creator => get_container_control
IMPORTING
控件= o_control
错误= o_error。

IF o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
type ='E'。
ENDIF。
*建立与GUI控件的连接
调用方法o_control-> init_control
导出
r3_application_name ='Excel文档容器'
inplace_enabled ='X'
父= cl_gui_container => screen0
导入
错误= o_error。

如果o_error-> has_failed ='X'。
呼叫方法o_error-> raise_message
导出
type ='E'。
ENDIF。

*创建文档代理
呼叫方法o_control-> get_document_proxy
导出
document_type = soi_doctype_excel_sheet
导入
document_proxy = o_document
错误= o_error。


如果o_error-> has_failed ='X '。
调用方法o_error-> raise_message
导出
type ='E'。
ENDIF。

TRY。
OPEN DATASET p_file用于在二进制模式下输入。 br> *打开数据集p_file以使用SMART LINEFEED进行默认编码以文本模式输入。
如果sy-subrc =0。
做。
清除lv_len。
清除ls_rcgrepfile。
读取数据集p_file INTO ls_rcgrepfile长度lv_len。
*读取数据集p_file INTO ls_rcgrepfile。
IF sy-subrc <> 0.
IF lv_len> 0.
lv_filenamesize = lv_filenamesize + lv_len。
APPEND TO Ls_rcg 。
ENDIF。
退出。
ENDIF。
lv_filenamesize = lv_filenamesize + lv_len。
附加ls_rcgrepfi le TO lt_rcgrepfile。
ENDDO。
ENDIF。

描述表lt_rcgrepfile线lv_lines。

CLOSE DATASET p_file。


捕获cx_root到g_ex_root。

清除gv_msg。
gv_msg = g_ex_root-> get_text()。

如果gv_msg不是INITIAL。
sy-subrc =4。
ENDIF。

ENDTRY。

*在SAPWORKDIR中打开电子表格
调用方法o_document-> open_document_from_table
导出
document_size = CONV#(lv_filenamesize)
document_table = lt_rcgrepfile []
* document_title = ''
* no_flush =''
open_inplace = abap_true
* open_readonly =''
* protect_document =''
* onsave_macro =''
* startup_macro =``
>导入
错误= o_error。

如果o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
类型='E'。
ENDIF。

*打开电子表格接口
调用方法o_document-> get_spreadsheet_interface
导出
no_flush =''
导入
sheet_interface = o_sp readsheet
错误= o_error。

如果o_error-> has_failed ='X'。
调用方法o_error-> raise_message
导出
类型='E'。
ENDIF 。

调用方法o_spreadsheet-> get_sheets
*导出
* no_flush =''
*更新= -1
IMPORTING
图纸= lt_sheets
错误= o_error 。

将lt_sheets循环到数据(ls_sheets)。
lv_top =2。
调用方法o_spreadsheet-> select_sheet
导出
名称= ls_sheets-sheet_name
导入
>错误= o_error。
如果o_error-> has_failed ='X'。
退出。
ENDIF。
DO。
调用方法o_spreadsheet-> set_selection
导出
top = lv_top
左= 1
行='5000'
列='3'。

调用方法o_spreadsheet-> insert_range
导出
名称='Test'< br>行='5000'
列='3'
no_flush =''
导入
错误= o_error。
如果o_error-> has_failed ='X'。
退出 。
ENDIF。

刷新lt_data1。

调用方法o_spreadsheet-> get_ranges_data
E XPORTING
全部='X'
导入
内容= lt_data1
错误= o_error
CHANGING
范围= lt_ranges。
如果lv_top =1。
删除lt_data1在哪里 row ='1'。
ENDIF。
读取表lt_data1到DATA(ls_data1)中,其中KEY列='2'
值=空间。
如果sy-subrc =0。" AND ls_data1- 行<1000。
*删除lt_data1值是初始值还是空格=
将lt_data1的行添加到lt_data。
退出。
ENDIF。
*删除lt_data1值是初始值还是OR 值=空间。
在lt_data1到lt_data中追加行。
lv_top = lv_top +5000。
ENDDO。
ENDLOOP。

清除ls_data1。
将lt_data放入LOs_data1 。
案例ls_data1列。
何时1.
将ls_data1值移动到ls_data-banka。
当2.
将ls_data1值移动到ls_data-ifsc。
何时3 。
将ls_data1值移动到ls_data分支。
何时4.
将ls_data1值移动到ls_data地址。
当5.
将ls_data1值移动到ls_data-contact。 br>何时6.
将ls_data1值移至ls_d ata-city。
何时7.
将ls_data1值移动到ls_data-district。
何时8.
将ls_data1值移动到ls_data-state。
附加ls_data到gt_data。
清除ls_data。
在其他情况下。
结束。
ENDLOOP。
*删除gt_data索引1.
在gt_data所在的ifsc =空格处删除。

付费偷看设置
发送
5条回答
CJones
1楼 · 2020-09-08 02:05.采纳回答

在获取范围数据之前,您是否可以尝试先定义范围(并在该方法中排除参数ALL):

 lt_ranges = VALUE#((name ='Test'row = 5000  column = 3))。
骆驼绵羊
2楼-- · 2020-09-08 01:44

如果您在编辑器中使用代码按钮粘贴代码,使代码具有良好的格式和可读性,就更有可能获得帮助。

Bunny_CDM
3楼-- · 2020-09-08 01:52
  • 您并不总是处理返回的错误(例如,在调用set_selection和get_ranges_data时)请处理这些调用并查看错误消息(如果可用)?
  • 您是否已? 一旦将其行添加到第二个内部表中后,忘记刷新由get_ranges_data返回的内部表。
闻人可可
4楼-- · 2020-09-08 01:55

此方法有效,谢谢:)

粗暴的香蕉
5楼-- · 2020-09-08 02:05

Disha ,您已经在某些地方检查(如果o_error-> has_failed ='X'。) 呼叫,那么为什么现在要检查sy-subrc?

一周热门 更多>