◆◆0通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件。

这个功能很方便,因为下载的结果和ALV中看到的是一样的。

debug研究了一下标准代码,发现是将需要下载的内表先转换成XML stream,然后再通过gui_download的BIN模式将xml stream下载成.xlsx文件。

写了一个简单的程序供大家参考

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

REPORT ztest_alv_download.

DATA:git_vbap TYPE STANDARD TABLE OF vbap.

DATA:git_fcat   TYPE lvc_t_fcat,

gwa_layout TYPE lvc_s_layo.

DATA: l_path     TYPE string,

l_filename TYPE string.

START-OF-SELECTION.

SELECT *

INTO TABLE git_vbap

FROM vbap

UP TO 100 ROWS.

CALL FUNCTION ‘LVC_FIELDCATALOG_MERGE‘

EXPORTING

i_structure_name       = ‘VBAP‘

CHANGING

ct_fieldcat            = git_fcat "生成下载excel文件的头--reptext字段

EXCEPTIONS

inconsistent_interface = 1

program_error          = 2

OTHERS                 = 3.

gwa_layout-zebra = ‘X‘.

gwa_layout-sel_mode = ‘A‘.

gwa_layout-cwidth_opt = ‘X‘.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC‘

EXPORTING

i_callback_program       = sy-repid

i_callback_pf_status_set = ‘FRM_STATUS_SET‘

i_callback_user_command  = ‘FRM_USER_COMMAND‘

is_layout_lvc            = gwa_layout

it_fieldcat_lvc          = git_fcat

TABLES

t_outtab                 = git_vbap[]

EXCEPTIONS

program_error            = 1

OTHERS                   = 2.

IF sy-subrc <> 0.

* Implement suitable error handling here

ENDIF.

FORM frm_status_set  USING rt_extab  TYPE slis_t_extab.

SET PF-STATUS ‘S0001‘.

ENDFORM.                    "frm_status_set

FORM frm_user_command USING r_ucomm TYPE sy-ucomm

rs_selfield TYPE slis_selfield.

* Local Variable Declare

DATA: l_filename TYPE string.

IF r_ucomm = ‘DOWN‘.

*   get file name

PERFORM frm_get_directory CHANGING l_filename.

*   download

PERFORM export_to_excel USING l_filename.

ENDIF.

ENDFORM.

FORM frm_get_directory  CHANGING c_filename TYPE string.

DATA : l_title    TYPE string,

l_filename TYPE string,                         "file name

l_path     TYPE string VALUE ‘C:\TEMP‘,         "path

l_fullpath TYPE string,                         "full path

l_result   TYPE i.                              "result return

l_title = ‘Save as...‘.

CALL METHOD cl_gui_frontend_services=>file_save_dialog

EXPORTING

window_title         = l_title

default_extension    = ‘XLSX‘

default_file_name    = ‘Download.XLSX‘

*     with_encoding        =

*     file_filter          =

initial_directory    = l_path

prompt_on_overwrite  = ‘X‘

CHANGING

filename             = l_filename

path                 = l_path

fullpath             = l_fullpath

user_action          = l_result

*     file_encoding        =

EXCEPTIONS

cntl_error           = 1

error_no_gui         = 2

not_supported_by_gui = 3

OTHERS               = 4.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ELSE.

c_filename     = l_filename.  "l_path.

ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  EXPORT_TO_EXCEL

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_L_FILENAME  text

*----------------------------------------------------------------------*

FORM export_to_excel  USING i_filename.

DATA: l_length     TYPE i,

l_xml_stream TYPE xml_rawdata,

l_flavour    TYPE string,

l_version    TYPE string.

DATA: lr_alv_new_data TYPE REF TO data,

lr_result_data  TYPE REF TO cl_salv_ex_result_data_table.

DATA: ls_xml_choice TYPE if_salv_bs_xml=>s_type_xml_choice,

xml           TYPE xstring.

GET REFERENCE OF git_vbap INTO lr_alv_new_data.

lr_result_data = cl_salv_ex_util=>factory_result_data_table(

*        t_selected_rows             = lt_lvc_row

*        t_selected_columns          = lt_sel_cols

*        t_selected_cells            = lt_sel_cells

r_data                      = lr_alv_new_data

*      s_layout                    = lr_grid->m_cl_variant->ms_layout

t_fieldcatalog              = git_fcat

*      t_sort                      = lr_grid->m_cl_variant->mt_sort

*      t_filter                    = lr_grid->m_cl_variant->mt_filter

*      t_hyperlinks                = lr_grid->mt_hyperlinks

*        s_current_cell              = ls_cur_cell

*        hyperlink_entry_column      = ls_hyper_entry

*        dropdown_entry_column       = ls_dropdown_entry

*        r_top_of_list               = lr_top_of_list

*        r_end_of_list               = lr_end_of_list

*        t_dropdown_values           = lt_drdn

).

CASE cl_salv_bs_a_xml_base=>get_version( ).

WHEN if_salv_bs_xml=>version_25.

l_version = if_salv_bs_xml=>version_25.

WHEN if_salv_bs_xml=>version_26.

l_version = if_salv_bs_xml=>version_26. " = 2.6

ENDCASE.

l_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export. "Flavor for Complete ALV XML

CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform

EXPORTING

xml_type      = if_salv_bs_xml=>c_type_xlsx  "XLSX

xml_version   = l_version

r_result_data = lr_result_data

xml_flavour   = l_flavour

gui_type      = if_salv_bs_xml=>c_gui_type_gui  "Y6DK066330

IMPORTING

xml           = xml.

IF NOT i_filename IS INITIAL.

CALL FUNCTION ‘SCMS_XSTRING_TO_BINARY‘

EXPORTING

buffer        = xml

IMPORTING

output_length = l_length

TABLES

binary_tab    = l_xml_stream.

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

bin_filesize = l_length

filetype     = ‘BIN‘

filename     = i_filename

CHANGING

data_tab     = l_xml_stream

EXCEPTIONS

OTHERS       = 1.

IF sy-subrc <> 0.

*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDIF.

ENDFORM.

在status上加了两个按钮,一个是标准的spreadsheet按钮(&XXL),一个是自定义的按钮(DOWN),供下载结果对比使用。

代码简单说明:

1) cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform是用来指定下载的excel格式的,也就是模拟了标准按钮的那个format选择步骤,这个类方法中用到了接口if_salv_bs_xml中的一些属性,10就标识是下载成.xlsx格式的文件。

2) SCMS_XSTRING_TO_BINARY可以将Xtring转化成二进制格式并保存到内表中

以上。

原文地址:https://www.cnblogs.com/lvdong18847870057/p/12544104.html

时间: 2024-08-03 15:47:15

◆◆0通过XML转换下载.xlsx格式的excel文件的相关文章

通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件. &lt;img class="alignnone size-full wp-image-2802" src="http://www.baidusap.com/wp-content/uploads/2017-02-04_15-28-29.png"

c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable

1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用 WindowsBase  ---直接在项目里加入引用 2.方法: /// <summary> /// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄 /// </summary> /// <param name="filePath">文件路径 如 D:\\excel1.xls</param> ///

RHEL 6.4 64bit kettle5.01导入xlsx格式的excel时报错

环境:RHEL 6.4 64bit : kettle5.01:xlsx格式的excel 创建的job,在spoon里面运行都没有问题(Linux和windows) 在windows的命令行运行也没有问题,但是在Linux的命令行运行就有问题了报[[email protected] data-integration]$ ./kitchen.sh -rep:"rui_test_repository" -job:"job_one" -dir:/ -user:admin -

利用PHPExcel将数据导出到xls格式的excel文件

在开发某地的经营许可证管理系统的时候需要将数据导出打excel文件,虽然一年前做某集团的ERP的时候用到过一次导入和导出,但是那时候太忙没时间写博客,一年过去了我也忘的差不多了,所以趁着今天将此次的使用写到博客中,作为以后开发的一个参考,免得再次使用的时候需要导出找资料,也给其他同行一个参考.作者:DragonDean,博客地址:http://www.cnblogs.com/dragondean/ 什么是PHPExcel? PHPExcel 是用来操作Office Excel 文档的一个PHP类

[PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件

工作中的一点心得,拿出来分享一下. 用 PHP 生成 Excel 文件早已不是什么难题了,但若生成的 Excel 文件没有格式(边框线.居中.字体等),其实就是生成文本文件再用 Excel 打开而已.在 Windows 平台下,可能用 COM 组件可以做到这点,但在 Unix 类系统环境下就没这么幸运了. 首先看一下当时这个新闻吧:http://bbs.chinaunix.net/viewthread.php?tid=204738&highlight=excel [微软发Office免费许可 开

nodejs中间件xlsx.js导出excel文件使用方法封装(原创)

之前的项目一直使用的是nodejs的node-xlsx.js中间件,最近的项目部署时不能使用外网,而node-xlsx.js的路径太长不能U盘复制,现在改用xlsx.js中间件. 现在把自己封装的使用方法分享出来,和大家一起学习. 代码很简单,轻喷. /** * Created by Administrator on 2016/11/17. * 使用xlsx中间件,传入表头[数组],表内数据[对象数组],文件名[string] //var header=["姓名",'年龄','性别']

用ajax下载字节流形式的excel文件

原因:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的.文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件. 解决方法:使用form表单提交实现文件下载 1,后台代码实现方法: // 生成excel文件 @RequestMapping(value = "/study", method = RequestMethod.POST) public void study(@RequestBody ParamVO

C# xml转换成ini格式

最近一直在写一个关于自动转换文件格式的代码,一点小心得. 目标xml文件内容,我的命名是data2.xml <?xml version="1.0" encoding="utf-8"?> <User> <name>xuwei</name> <sex>male</sex> <age>25</age> </User> 生成的目标格式如下: 代码如下: class P

【转】java将excel文件转换成txt格式文件

在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文件中,数据以分隔符逗号","隔开. excel文件如图所示: 转换后的txt文件: 需要依赖4个jar包: package com.xuan.excel; import java.io.BufferedWriter; import java.io.File; import java.io.