月初给客户做物料需求汇总(MD07)的导入操作,用户那边一上午连着三个电话,都是同一个问题:WPS做的Excel传到SAP里,系统提示“文档中不包含数据”,换个文件又提示“程序正在运行中”。这两条报错在SAP日常操作里实在太典型了,尤其是国产办公软件WPS在终端大面积替代微软Office之后,类似的问题出现频率明显上升。这篇就把我在实际处理中积累的排查思路和解决办法完整梳理一遍,供遇到同样情况的顾问、IT运维和相关岗位的朋友参考。
先说结论:这两条提示虽然都是“文件上传失败”的表现,但本质上是两条完全不同的故障链。“文档中不包含数据”基本可以锁定在文件格式和文件内容层面,跟SAP本身的关系不大;“程序正在运行中”则多半是本地进程冲突、SAP GUI卡死或系统锁表。把它俩当成一个问题去查,越查越乱。下面按这两条线分别展开,每一步我会把操作原因和判断逻辑也写出来,方便你们带到现场直接套用。
1. 先搞清楚两个报错的本质区别
1.1 “文档中不包含数据”到底在说什么
SAP前端上传Excel文件,走的不是直观的“打开文件然后读内容”那么简单。无论是ALV GRID自带的“导入”功能,还是各类报表程序调用的上传控件,本质都是把用户本地的文件作为一个数据源,通过SAP GUI内部的解析组件读取单元格值、行数、列数和数据类型,再映射到ABAP内部表里。
这里就出现了一个特别关键的环节:SAP读取Excel文件依赖的是文件内部结构和注册表关联的组件。WPS做的Excel文件,在多数情况下扩展名也是.xlsx或.xls,看着跟微软Office做出来的一样,但文件内部的meta信息、样式节点、文档属性往往有差异。如果用户在WPS里对文件做过再保存、转格式、从网页复制数据后另存,文件可能已经不是一个“纯正的”Excel文件了。
系统提示“文档中不包含数据”,通俗点说就是SAP解析完这个文件后,发现一个有效数据单元格都没有。我见过最离谱的一次,用户把网页表格直接复制进WPS,保存时选了“网页(*.htm)”格式,然后把扩展名手工改成.xls,再传到SAP里,系统能读出一个单元格都没有。所以这个报错的实际含义不是“文件是空的”,而是“SAP读不出任何有效数据”。
1.2 “程序正在运行中”其实不是文件的问题
“程序正在运行中”这个提示,多数人会误以为是SAP自己程序卡了或者报错了,但实际触发的场景通常是这样的:用户点击了上传按钮之后,SAP GUI需要在本机调用Excel/WPS的COM组件去解析文件,或者需要访问正在被其他进程占用的文件。这时候SAP GUI的界面已经发出了一个等待指令,但Excel/WPS组件没有及时返回,界面左上角就出现了“程序正在运行中”的提示,鼠标状态也可能变成忙碌。
这个提示在某种意义上是SAP GUI的“假死通知”,真正卡住的是前台本地组件,而不是SAP后台。处理的关键是找出什么占了文件、什么占用了进程,而不是在SAP端反复重试。另外,如果用户之前上传任务没有正常结束,对应的数据表被锁住、更新进程还挂着,也可能导致下一次上传的时候直接回这个提示。
2. 处理“文档中不包含数据”的完整步骤
2.1 第一步:检查文件后缀和真实格式
不要上来就让用户重做,先花两分钟检查文件。在Windows资源管理器里把“文件扩展名”显示打开,具体方法是:打开资源管理器,点顶部菜单“查看”,在“显示/隐藏”区域勾选“文件扩展名”。这时候能看到文件完整名称,比如“库存数据.xlsx”或“库存报表.xls”。
接下来用一个更硬核的办法验证文件到底是真Excel还是假Excel:右键文件,用记事本打开。注意这里不是让你去改内容,只是用记事本看文件开头区域的字符。
- 如果文件开头出现一串乱码,二进制里能看到类似
D0 CF 11 E0 A1 B1 1A E1的头部,这是真正的旧版Excel文件(OLE2复合文档格式)。 - 如果文件开头显示
PK两个字符,说明这是一个ZIP压缩包,真正的xlsx新版Excel文件就是这种结构。 - 如果文件开头直接是
<html、<table、<tr、<td之类的标签,这个文件十有八九就是网页伪装成Excel,SAP当然读不出数据。这是“文档中不包含数据”的第一大元凶。
之所以用记事本,是因为它可以读取文件二进制头部信息,而且操作门槛低。让终端用户拿来检查,他们也能轻松执行。
2.2 第二步:用WPS另存为标准Excel格式
如果发现文件格式不对,或者用户自己也说不清是怎么做的,最稳妥的处理办法就是让用户打开WPS表格,按F12或者点左上角“文件”→“另存为”,在“保存类型”下拉框里选择“Excel 97-2003 工作簿(.xls)”或者“Microsoft Excel 工作簿(.xlsx)”,重新保存到一个新的文件名,再上传。
这里要特意强调:保存类型一定不能选“WPS表格(.et)”,也不能选“网页(.htm)”。在WPS的另存为界面里,“网页”类型的文字和图标都比较有迷惑性,用户稍不留神就选错了。我在现场培训的时候,反复跟用户说一句话:“不要看保存类型列表里哪个名字长,只看扩展名是不是xls或xlsx。只要不是这两个,这个文件SAP就有可能不认。”
另外还有一个细节:如果用户的WPS里同时登录了云账号,另存为时默认位置会弹到云盘目录。保存到云盘的文件,有时下载回来之后格式属性也会变化。建议让用户直接保存到本地磁盘比如桌面或者“我的文档”,再从那个位置上传,能规避不少隐性坑。
2.3 第三步:检查表格内容和首行首列
格式没问题还报“文档中不包含数据”的话,问题就出在数据区域本身。SAP上传Excel通常默认读取第一个工作表,并且要求数据从某个单元格开始(绝大多数是从A1开始)。但如果用户做的表格里,前面几行是标题、说明文字、空行,或者第一列是空列,SAP扫描数据区域的时候会误判为“有效区域不存在”,继而报“文档中不包含数据”。
打开文件后,先按Ctrl+Home看看光标是否跳到了A1单元格。如果发现前几行有“XX单位库存统计”、“填表人:张三”之类的说明文字,把这些行整体删除,或者把数据区域剪切到A1开头。另外,单元格里如果存在大量由公式生成的结果,而用户只复制了公式没复制值,SAP标准上传接口默认不计算公式只读取缓存值,那么也会读出空数据。这种情况建议用户在WPS里先全选数据区域,用“复制”→“选择性粘贴”→“只保留数值”的方式,把公式结果固化成纯文本数据,再保存上传。
还有个小检查项:工作表名字也不要太另类。少数后台程序和上传控件会按固定Sheet名去定位工作表,如果用户把Sheet名改成了“数据汇总”还好,改成了空字符或者带特殊符号的名称,也会出现读取异常。最稳妥的做法是保持默认的Sheet1,或者只保留一个工作表,数据都放那一个里面。
2.4 第四步:处理WPS的锁文件和临时文件
WPS在打开文档时,会在同目录下生成一个临时的锁文件,名字通常是~$开头,和源文件类似,比如~$库存数据.xlsx。这个文件平时默认是隐藏的,但它是真实存在的。如果SAP在上传的时候,WPS还在后台开着那个文件,SAP前端组件尝试打开同一个文件时,可能会被这个锁文件干扰,表现出来就是读取不到有效数据,偶尔也会触发“程序正在运行中”。
处理办法是:先把WPS表格完全关闭,然后打开文件所在目录,把隐藏的~$开头文件删除。如果看不到,在资源管理器“查看”里勾选“隐藏的项目”,就能看到了。删除之后再重新上传一次。
如果文件所在目录里没有锁文件,可以再看一下WPS的自动备份目录:%AppData%\Kingsoft\WPS Office这个路径下经常有大量备份文件。如果用户是通过备份恢复得到的文件,建议另存成全新的Excel文件再用,避免备份文件带的一些内部标识导致SAP解析异常。
2.5 补充:SAP版本和前台导入组件对xlsx的支持
新版的SAP GUI 7.60、7.70,配合S/4HANA或者较新的ECC环境,对xlsx的支持已经比较成熟,直接上传基本没问题。但如果客户用的是ECC 6.0早期版本,或者SAP GUI版本还在7.40以下,那么对一些由WPS生成的xlsx文件,解析失败的概率确实会上升。
遇到这种情况,最快的方法是让用户把文件另存为xls(Excel 97-2003格式)再上传。xls格式是老牌格式,SAP各版本的兼容性普遍较好。其次是看SAP GUI的版本和补丁,让IT把SAP GUI升级到7.60以上,同时打上最新的GUI补丁,很多解析问题就消失了。
从我这边观察到的数据看,因为WPS特殊格式传入SAP导致读取失败的咨询,占这个报错总数的六成以上;剩下的才是流程操作上的问题,比如文件没保存就上传、文件还在编辑中被占用。所以处理这类问题,优先检查文件本身永远是排在最前面的。
3. 处理“程序正在运行中”的排查路径
3.1 第一步:先别急着重试,检查本机WPS残留进程
用户遇到“程序正在运行中”时,第一反应是“再点一次”,这个操作不建议。反复点击不仅不会让SAP响应过来,还可能在SAP GUI里堆积多个等待线程,越搞越卡。
正确做法是打开Windows任务管理器(Ctrl+Shift+Esc),在“进程”或“详细信息”选项卡里,找到所有带 WPS 字样的进程,包括wps.exe、wpscloudsvr.exe、wpscenter.exe、wpspdf.exe等,全部结束进程。尤其要留意wpscloudsvr.exe,这个进程是WPS的后台云服务,它会一直驻留内存,并且可能占用文件句柄。结束之后,再回到SAP GUI上传一次。
这个方法适用于绝大多数“点了上传以后SAP GUI一直显示程序正在运行中”的场景。原因在于SAP GUI读取文件时,需要获得文件的独占读权限,如果WPS后台进程先占用了这个文件或者文件所在目录的句柄,SAP就只能在那边无限等待。
如果结束进程之后还是卡,就把SAP GUI整个退出,重新登录一次。这一步能清掉SAP GUI本地缓存和临时占用。
3.2 第二步:检查SM12锁对象和SM37后台作业
有一种情况是:上传操作确实已经进入SAP后台,但因为某些原因没有正常结束,比如批量输入会话(BDC)卡住了,或者更新进程(Update)没有跑完,导致数据表在这台终端用户对应的进程里被加了锁。这时候其他终端再上传同一个事务的数据,SAP就会提示“程序正在运行中”或者类似的系统占用信息。
排查方法很固定:用事务码SM12查看当前系统中的锁对象。筛选条件填上用户ID、事务代码或者表名,重点看有没有残留的E类型排他锁。如果发现锁条目是上个上传操作留下的,且对应的更新请求已经不存在了,可以选中这条锁记录直接删除。
再用事务码SM37看一下后台作业列表,确认有没有“Released”或“Active”状态的作业卡在那儿。特别是在月末、月初做数据导入高峰期,用户经常会有意或无意地重复提交同一个上传作业,上一个还没跑完,下一个又开始了,两个作业同时抢一张表的锁,系统表现就是客户端一直“程序正在运行中”。如果判断作业是重复残留且无业务影响,可以在SM37里把它取消掉再重新上传。
3.3 第三步:切换会话和GUI优化设置
如果排查了进程和后台锁都没有问题,那可以试着换一个SAP GUI会话窗口继续操作。在SAP GUI的菜单栏“会话”里打开一个新会话,或者直接在命令框输入/o回车,会弹出一个新会话列表,从中选一个事务再进去。这个操作能绕开当前会话里可能存在的不可见阻塞状态。
另外一个值得养成的习惯是:在上传大文件之前,先在SAP GUI命令框输入/i删除当前会话,重新开一个新会话登录。这相当于一个“软化重启”,很多本地组件和GUI界面的残留状态会被清理掉,上传成功率会更高。
如果SAP GUI经常在上传文件时卡顿,可以在SAP GUI的“自定义”——“交互设计”里把“视觉设计”调成经典模式,部分高分辨率缩放设置会拖慢本地文件对话框的响应速度。这个是锦上添花的做法,遇到卡顿明显的时候效果还不错。
3.4 常见的前台组件和关联引用冲突
WPS安装后,非常喜欢接管系统里所有Office相关文件的关联。也就是说,双击.xlsx文件默认打开的是WPS,而非微软Excel。SAP GUI在后台解析xlsx文件时,也会读Windows注册表中.xlsx的关联配置。如果注册表里关联指向了WPS,但SAP GUI调用的COM组件又是微软Excel的,两者就会互相抢,最终界面卡在“程序正在运行中”。
这种关联冲突有时候很隐蔽,因为用户本机可能既装了WPS,又装了Office,或者装过WPS后来又卸载了,但注册表没有清理干净。解决办法是让IT在用户机器上重新指定文件关联,或者在WPS的“配置工具”里选择“恢复默认关联设置”。如果公司允许,也可以考虑把WPS的文件关联只限定在.et格式上,把.xls、.xlsx的关联交还给微软Excel或使用SAP GUI的独立解析通道。这个做法能明显减少上传时的本地冲突,但具体是否执行要看各公司的软件管理策略,我不会强烈推荐,只能说目前实测下来效果稳定。
4. 案例复盘和避坑清单
4.1 案例一:MD07上传库存时提示文档中不包含数据
客户那边月初要上传物料库存数据,用的是WPS做好的“.xlsx”文件,打开看内容完全正常,几百行库存记录都在。但在MD07里选择本地文件上传后,系统直接弹出“文档中不包含数据”。
现场排查过程是这样的:
- 先按前面提到的方法,用记事本打开该xlsx文件,看到的是
PK开头,说明确实是标准的ZIP结构,不是HTML伪装。 - 再在WPS里按
Ctrl+Home检查数据起点,发现数据从第1行开始,没问题。 - 继续排查发现,用户这个工作簿有3个工作表,第一个工作表名字叫“目录”,里面只有几行链接文字,真正数据在第二个工作表里。SAP上传默认读第一个工作表,所以读不到数据。
- 让用户把第二个工作表移到第一个位置,或者删除前面那个空白工作表,保存后重新上传,问题解决。
这个案例说明,类似报错的判断路径如果按部就班走,很快就能定位到问题源。关键是不要一上来就怀疑系统或文件损坏,从最简单的“SAP到底读了哪张表”出发。
4.2 案例二:导入过程假死提示程序正在运行中
另一个客户是在用事务码FB50批量做凭证头数据导入的时候,点了上传按钮,SAP GUI界面上显示“程序正在运行中”,鼠标变成沙漏,等了十分钟也不动。
我处理的步骤是:
- 打开任务管理器,发现WPS表格的
wps.exe进程确实存在,而且那个待上传的Excel文件正被WPS打开着。 - 结束WPS所有进程。
- 回到SAP GUI,发现界面恢复了,上传操作自动继续执行,最后正常导入成功。
这是一个很典型的“文件被本地进程占用”导致SAP GUI等待的例子。如果当时没有查进程,而是直接杀掉SAP GUI重启,上传操作会丢失,用户还得重新整理数据,白白多耗时间。
同时注意到公司这批PC都安装的是WPS,且开启了WPS云同步,wpscloudsvr.exe会常驻后台,所以类似卡顿现象不是个例。后来给用户定的规范是:上传SAP前,先关掉WPS里打开的Excel文件,再传。
4.3 避坑清单(按操作先后排列)
| 顺序 | 操作项 | 目的 |
|---|---|---|
| 1 | 显示文件扩展名,确认是xls/xlsx | 排除ET、HTML伪Excel等格式问题 |
| 2 | 用记事本查看文件头 | 判断文件是否为HTML伪装,只看开头几个字符即可 |
| 3 | 在WPS中打开,Ctrl+Home检查数据起始位置 | 排除前几行空行、说明行导致的读取失败 |
| 4 | 检查工作表名和位置 | 确保有效数据在第一个Sheet |
| 5 | 清除WPS锁文件和备份文件 | 防止文件被锁或读取到异常副本 |
| 6 | 关闭WPS进程后在任务管理器确认 | 避免SAP GUI等待文件释放 |
| 7 | 上传前在SAP GUI命令框输入 /i 重新登录 | 清理当前会话阻塞 |
| 8 | 仍报错时查SM12、SM37 | 排查后台锁和重复作业 |
这张清单我打印出来贴在客户IT办公桌前过,他们现在遇到类似问题的解决效率明显高了不少,至少能区分“是文件的事”还是“是系统的事”。
5. 一些个人心得
处理这类问题多了,我有一个很深的感受:SAP和WPS之间的兼容问题,绝大多数都不是什么高深的技术难题,而是细节性问题。文件格式、文件关联、进程占用、Sheet定位,任何一个环节没对齐,就会弹出系统提示把用户打懵。
从我个人的角度看,公司如果正处在Office向WPS切换的阶段,IT部门值得做三件事:一是给所有需要上传Excel到SAP的岗位统一下发一个固定模板文件,模板里数据区域固定从A1开始,Sheet名字固定;二是在WPS里把云同步和后台驻留进程尽量关掉,至少在上传操作时不要有WPS进程干扰;三是把SAP GUI统一升级到较新版本,这能减少很多隐藏的格式解析问题。这三件事做完,相关报错至少能减少八成。
最后分享一个小技巧:在让用户重做文件之前,可以先把出问题的文件用WPS打开,随便在一个空白单元格里输入一个数字,保存,再重新上传试试。这个操作会触发WPS重写文件内部结构,有时候就能把SAP无法识别的内部属性洗掉。这个方法不一定每次都灵,但胜在操作简单,值得一试。