首先,没有什么是绝对好或绝对不好。
(1/4)导入导出方式
Excel数据导入导出方式,不外乎下面几种:
1、剪贴板
2、OLE
3、DOI
4、ZABAP2XLSX
5、ZXLSX_WORKBENCH
6、STRANS
(2/4)原理
下面介绍一下各种导入导出方式的原理。
1、剪贴板
导入:用户打开Excel -> 自行复制数据 -> 在SAP中读取剪贴板数据
导出:SAP将数据发送到剪贴板 -> 用户打开Excel -> 自行粘贴数据
剪贴板操作的方法为:CL_GUI_FRONTEND_SERVICES类中的CLIPBOARD_EXPORT和CLIPBOARD_IMPORT
2、OLE
导入:创建Excel.Application或ET.Application(WPS),通过函数ALSM_EXCEL_TO_INTERNAL_TABLE或类似的自己写的OLE代码,导入数据
导出:创建同样的Application,通过OLE代码导出数据
网上有很多OLE相关的代码,这里不再赘述。
要了解更多OLE相关知识,请查看《OLE那些事》。
要了解更多Excel及VBA相关知识,请查看VBA从零学习系列,或点击文章开头的话题标签。
3、DOI
导入:通过TEXT_CONVERT_XLS_TO_SAP或类似的DOI代码,导入数据。
导出:通过DOI代码导出数据。
网上有很多DOI相关的代码,这里也不再赘述。
4、ZABAP2XLSX
Office自2007以后,推出了xlsx、docx、pptx等新的文件格式,这些新的文件格式统称为openxml格式。
我们可以把“工作簿1.xlsx”重命名为“工作簿1.xlsx.zip”,然后尝试解压缩,可以得到若干个xml文件。
作为知名的ABAP与Excel的项目的代表,ZABAP2XLSX就是将数据按照openxml的规则,生成若干xml文件,然后通过CL_ABAP_GZIP进行文件压缩打包,进而得到xlsx文件的。
5、ZXLSX_WORKBENCH
其中提供了包括上述2、3、4三种方式的组合代码的程序,是一个比较强大的工作台。在它的代码中,你可以找到CALL METHOD OF、i_oi_spreadsheet、if_ixml_element等分别代表OLE、DOI、OPENXML代码特征的使用痕迹。
所以,不要迷信ZXLSX_WORKBENCH就一定最好,别的导入导出方式存在的缺点,它一样存在。而且它还存在更多的学习成本、项目交接成本、运维成本等。
6、STRANS
通过Transformation进行XML转换
(3/4)优缺点
说完了各种导入导出方式的原理,下面说一下各种导入导出方式的优缺点。
1、剪贴板
优点:
1) 无视客户端Excel的版本,不管用户装的是Excel 2007还是2019,或是老掉牙的2003,还是奇异的Office 365
缺点:
1)导入数据时,我们可能都遇到过数据串行的问题。这是因为单元格中的内容出现了“回车+换行”的字符。正常情况下,我们在Excel单元格中输入ALT+回车换行输入,Excel中的字符是换行字符。但某些第三方软件,比如某友某蝶等,在导出Excel文件时,可能会在单元格写入“回车+换行”的字符实现单元格内容的换行。这样的文件在通过SAP剪贴板导入系统时,就会导致数据串行。
2)无法满足用户多Sheet页读取、多Sheet页导出的需求。
3)用户体验不好,除非项目团队比较强势,否则用户一般不会买单。
4)导出数据时,如果数据发送到剪贴板时,其中某些字段以双引号开头,会导致导出的数据出现数据错乱的情况,需要在发送剪贴板前对数据做特殊处理。
5)工作表列数较多,总长度超出4096时无法导入、导出。因为SAP的剪贴板支持的最大长度为4096。
缺点4截图如下图:
2、OLE
优点:
1)功能强大,支持几乎所有VBA的命令,进而可以支持几乎Excel所有的功能,比如公式、图表、筛选、条件格式、打印缩放、保护工作表、另存为PDF等等等等
2)可以处理剪贴板导入时无法处理的“回车+换行”的问题。即在文件打开后,执行一下OLE命令,将“回车+换行”字符替换为“换行”字符
3)导出大量数据时,通过粘贴的方式处理,非常快。【不要上来就质疑OLE慢,可以先想象一下我们复制几万行数据从一个Sheet到另外一个Sheet的时候快不快!导出大量数据时,只是SAP将数据发送到剪贴板稍微有点慢。】
4)具备一定VBA基础时,使用非常方便
5)支持按R1C1的形式写单元格公式(具体请百度Excel R1C1),这个很强大
6)相较于ZABAP2XLSX,可以得到公式单元格的计算结果,而不是得到其公式
缺点:
1)执行导入时,如果数据量不大,打开和关闭文件需要占用一定时间,不如ZABAP2XLSX快
2)对用户版本有依赖。Office 365对某些OLE命令支持的不好。WPS和MS OFFICE依赖的OLE命令大致一样,但需要创建不同的Application
3)用户程序激活过期或文件被操作系统认为不安全时,会有文件无法打开的问题
4)多工作表导入或导出,在选择工作表时,可能会遇到工作表无法被选择的情况。比如工作表“销售月报XXX”明明是存在的,但就是无法通过OLE命令选择,但改一下工作表名可能就好了。这可能跟程序底层字符编码的转换有一定关系。
5)同剪贴板导出的缺点4,但是可以通过代码解决。
6)同剪贴板导出的缺点5,但是可以通过代码解决。
7)标准函数“ALSM_EXCEL_TO_INTERNAL_TABLE”支持的功能太少,需要自己开发并封装比较多的功能。
8)很多不太懂OLE操作的开发,经常按单元格逐个逐个的写入内容,速度太慢。
9)操作不当会导致存在Excel进程未关闭的情况,需要储备充足的VBA知识
10)操作系统依赖,不支持Mac os。
3、DOI
优点:
1)一般不挑用户本地的Excel版本,但也不尽然,特别是用户本地既有WPS又有MS Office的版本,甚至既有2007又有2010等多个Office版本的时候。
缺点:
1)导入数据时,每一次最多导入9999行,如果要导入更多的数据,需要再次调用
2)使用难度较大,进行许多操作之前,都要先定义一个range name,有点反人类
3)出现报错之后,不好调试解决
4)对于某些特定版本的操作系统,只支持xls格式文件的导入,比如我曾经遇到过神州网信zf版的操作系统,就是这样
5)数据量较小时,在效率上与OLE比无差别。数据量较大时,也没有优点。
6)不清楚是否支持Mac os,手头没有Mac系统,无法测试。
4、ZABAP2XLSX
优点:
1)提供了相对友好的OO实现方式,但ABAP的OO用起来还是别扭,所以勉强算是优点吧
2)提供了相对丰富的功能,满足基本的日常需要
3)数据量较小时,比如5000行、20列以内,导出速度还可以
4)支持Mac os
5)没有Excel进程关闭与否的忧虑
缺点:
1)数据量大时,该程序需要将大量的数据拼成XML。XML形成的过程非常慢。可以想象一下导出几万行ALV数据到本地XLSX格式的时候,是不是很慢。ALV数据导出本地XLSX,也是OPENXML的方式。
2)读取单元格数据时,如果单元格是公式,ZABAP2XLSX无法读取到它的结果
3)导入Excel一个区域的数据到内表,或导出内表到Excel的一个区域时,提供的方法不够友好,而且存在较大的性能问题。可以分析其代码并进行优化
4)导出数据时,会清除文件中的条件格式、打印设置等。因为它并没有封装XLSX的所有XML文件的功能。同样,当Excel有更新的版本时,ZABAP2XLSX理论上就需要进行更新。而OLE不会有此问题。
5)不支持删除列等操作,有REMOVE方法,但删除列时,试验失败。该条类似于上一条,它无法支持所有的Excel功能,除非投入巨大的精力去写生成功能完备的XML的代码。
5、ZXLSX_WORKBENCH
功能比较多,需要结合具体的功能进行分析,看它采用的是哪种基本的技术形式实现的,就会遇到哪种基本的技术形式所拥有的优点和缺点。
6、STRANS
优点:
1)不依赖于操作系统
缺点:
1)调整维护比较复杂,功能单一
(4/4)其他
对于很多人关心的后台导出的问题,这里需要提一下。
1、后台导出,意味着是服务器后台自行运行程序,不需要用户前端程序的支持。这种情况下,剪贴板、OLE、DOI都是不可行的,而ZABAP2XLSX以及STRANS是可行的。
2、后台导出,因为没有前端,所以文件只能输出到以下类型的位置:Dataset、FTP、某HTTP服务地址、其他文档服务器。
我们可以这样理解后台导出:把服务器想象成一台PC,给它一个定时任务,让它在固定的时间导出一个文件。这个服务器上没有装Excel,只能用ZABAP2XLSX或STRANS的方式导出Excel文件。它现在不是服务器,只是一个PC客户端,它要把文件放到一个服务器上去。这个服务器可以是它自己提供的DataSet,也可以是FTP,也可以是某HTTP服务地址或其他文档服务器。
最后
我在上个项目上,用的是OLE,后来在OLE的基础上加了DOI,封装了一个类。支持用户在SU3中自行设置Excel的交互方式,是选择Excel还是WPS还是DOI。
在现在的项目上,用的是ZABAP2XLSX,在它的基础上,又封装了一个外壳,使ZABAP2XLSX的使用更方便简单。
OLE、DOI的使用方式有很大差异,能封装到一起,并提供统一的一套对外的调用方法(这样ABAPer就可以一套代码实现,差异的地方全通过用户在SU3中设置的参数来决定),已经很难了。而ZABAP2XLSX的使用更是差异巨大,没办法再和OLE、DOI封装到一起并提供统一对外的使用方式了。
每个方式都有自己的优缺点,我们只能结合实际情况,选择适合的方式。
适合的,就是最优的。
ABAP文章汇总:
https://mp.weixin.qq.com/s/djmMeM0qfDxPPwxbjuJABA
Excel文章汇总:
https://mp.weixin.qq.com/s/NwJ0SzIrn9hVmaCMo-UYyA
网盘永久链接:
https://mp.weixin.qq.com/s/f_WwKZdwM-vPEstTjjz_eQ
关注公众号,点下方菜单打开上面的链接,更方便哦。
笔者微信:286503700(QQ同号)
如果喜欢,谢谢转发。