从ERP系统中导出的excel文件使用office2010打开速度慢

根源:ERP系统生成的excel文件结构不完整,未使用excel默认的共享字符串表而导致的解析性能问题

问题表现

从ERP系统中通过网页的形式下载的excel文件,使用excel2010打开速度很慢,使用其他高版本例如excel2016或office365则打开速度正常
尝试将文件放在其他位置再打开,无效
尝试切换计算机本地账号,无效
将文件重新另存一份,或进行任意编辑后保存,则打开速度正常,且文件体积变大,判断为原始文件中有部分内容office2010读取异常

处理过程

咨询deepseek

一个excel文件,使用office2016这种较高的版本打开速度正常,但是使用office2010打开速度很慢。如果将该文件另存成一个新的文件(使用office2016或2010均可),则使用office2010打开该新文件速度正常,并且这个新文件的大小相比于原文件变大了。检查过原文件没有宏命令。这种情况可能的原因是什么?

deepseek回复最可能的原因是原文件中包含了一些Office 2010不兼容的高版本特性,另存为操作去除了这些特性,从而提高了在2010中的打开速度,但同时由于去除了压缩优化或增加了兼容性数据,导致文件变大。

deepseek提供的可能的原因分析:

  1. 文件格式和兼容性问题
  2. 工作簿中的不可见内容或格式
  3. 缓存和计算模式
  4. 文件结构问题
  5. 版本特定的功能
  6. 文件压缩
  7. 打印机设置
  8. 外部数据链接
  9. 自定义视图或分组
  10. 条件格式或数据验证的范围
  11. 格式累积和冗余数据
  12. 计算链和依赖关系
  13. 格式缓存问题

第一次分析

由于文件是从ERP系统中导出,里面没有宏命令、自定义视图、打印机设置、多次编辑导致的冗余数据、数据依赖关系等内容
使用以下方式检查
使用office2016(或更高版本)打开文件,文件 → 信息 → 检查问题 → (检查文档、检查辅助功能、检查兼容性)
检查无兼容性问题
检查辅助功能无异常
检查文档中,有部分项目:a)注释中有批注信息、b)文档属性和个人信息中有作者及工作部的绝对路径信息、c)隐藏的行和列信息
依次分别删除不同的问题项后保存,使用office2010来分别测试打开这些删除内容后的文件能否正常打开。结果,无论删除哪一项,保存后的文件都可以使用office2010打开,并且保存后的文件都比原文件大,因此怀疑并非这三项所造成的而是保存的动作本身执行了某些行为导致文件可以被打开。实测,打开原文件后,执行任意编辑动作(例如在某个单元格中写一个空格再删除空格)后保存文件,文件变大了,并且可以被office2010正常打开,确认了这一猜测。由此,原因分析指向了文件本身而非office版本差异,猜测为ERP的导出代码执行逻辑的问题。

再次咨询deepseek

将信息反馈给deepseek,回复如下:
这种问题的根本原因是文件内部状态机没有正确初始化,您的"空格编辑"测试完美地证实了这一点。

deepseek可能的原因分析
由于文件是从ERP系统通过网页下载,很可能ERP系统使用的是第三方库生成Excel文件,这些库可能在某些方面生成的文件不够优化,尤其是在处理空白单元格、默认格式等方面。

另外,Excel文件(.xlsx)是一个ZIP压缩包,里面包含多个XML文件。我们可以通过解压原文件和编辑后的文件,比较内部XML的差异,来进一步确定原因。
假设我们有两个文件:原文件(慢)和编辑后文件(快)。我们可以:
步骤1:将两个文件的扩展名改为.zip。
步骤2:解压这两个ZIP文件到两个文件夹。
步骤3:比较两个文件夹中的XML文件,特别是:
xl/workbook.xml
xl/worksheets/sheet1.xml(或其他工作表)
xl/sharedStrings.xml(如果存在)
xl/styles.xml

可能发现的差异:
共享字符串表:原文件可能没有使用共享字符串表,而是将字符串内联在每个单元格中,这会导致文件变大且解析慢。编辑后保存的文件可能优化为使用共享字符串表,或者相反,原文件共享字符串表存在异常,编辑后重建。
样式数量:原文件可能定义了大量的样式,但实际并未使用,或者样式定义重复。编辑后保存时,Excel会清理未使用的样式。
单元格格式:原文件可能为每个单元格都单独指定了格式,而不是使用默认格式。编辑后保存可能优化了格式的应用。
文件结构:原文件可能包含一些不可见的对象或损坏的XML结构,编辑保存后被修复。

或者,编辑后保存的文件包含了更多的元数据、缓存数据或重新生成了共享字符串表等,这些增加了文件大小。
请注意,共享字符串表的设计是为了减少重复字符串的存储,如果字符串很多且不重复,使用共享字符串表可能反而增加大小,但通常解析时会更快,因为字符串被集中存储,只需解析一次。
由于我们没有实际文件,只能推测。不过,根据经验,这类问题通常与共享字符串表和样式定义有关。

deepseek回答完毕

进一步分析

实际检查发现,根据deepseek的提示,将原文件和另存后的文件解压,对比检查以下几个文件
xl\workbook.xml
xl\worksheets\sheet1.xml(或其他工作表)
xl\sharedStrings.xml文件(如果存在)
xl\styles.xml
发现,文件有较大差异,尤其是xl\sharedStrings.xml文件及xl\worksheets\sheet1.xml。原文件的sharedStrings.xml只有一小部分数据,sheet1.xml中包含有直接的字符串数据;另存后文件的sharedStrings.xml有大量数据,sheet1.xml中没有直接的字符串数据而是都是一些单元格的地址。
根据excel默认的存储逻辑,excel默认使用共享字符串表的方式存储字符串数据,然后在sheet的单元格中使用地址引用的方式来引用字符串表中的字符串数据。进一步检查发现,另存后的文件符合这一方式,即,在sharedStrings.xml中存储字符串信息,在xl\worksheets\sheet1.xml中使用地址引用这些信息。而原文件中sharedStrings.xml只有很少一部分数据(检查为sheet2的数据),而在xl\worksheets\sheet1.xml中没有使用共享字符串表引用地址,而是直接内联在单元格中(即使用<v>标签直接存储字符串)

结果总结

以上,基本验证了deepseek的猜测,即,ERP开发团队未使用正确的Excel生成库,excel文件的导出代码不完善,生成的文件结构并不完全符合Excel的标准。ERP系统生成的"伪Excel"没有正确使用共享字符串表,而是将字符串直接内联在单元格中。而Office 2016可能对这两种方式都支持得很好,但Office 2010可能对内联字符串的处理不够高效,尤其是当数据量较大时。

处理方式

建议ERP开发团队检查导出代码
错误的做法 - 直接输出HTML表格
正确的做法 - 使用专业库
Apache POI (Java)
EPPlus (.NET)
openpyxl (Python)

方法一:更新ERP的数据导出方式

方法二:使用高版本中转
使用高版本office打开文件后另存一份新文件,或做任意编辑后保存
(文件结构重组,使其恢复为系统默认的共享字符串表的方式)

方法三:更新用户的office版本

提示:无论另存还是在原文件上编辑后重新保存,其MD5值均会发生改变,如果有程序需要校验文件指纹,需要注意这一点

技术细节解释

为什么纯文本文件会有这种问题?

根源在于文件容器本身的结构完整性,而不是内容复杂性。

text
原始文件(从ERP下载):
├── 基本表格数据 ✓
├── 不完整的文件结构 ✗
├── 缺少计算引擎标志 ✗
└── 未初始化的缓存指针 ✗

编辑后文件:
├── 表格数据 ✓
├── 完整的文件结构 ✓
├── 正确的计算引擎标志 ✓
└── 初始化的缓存指针 ✓

关于sharedStrings.xml文件的说明

这个文件在Excel中用于存储共享字符串。Excel为了节省空间,会将单元格中的字符串集中存储在这个文件中,然后在单元格中通过索引引用。
原文件中的sharedStrings.xml只有2KB,说明原文件中的字符串很少,或者根本没有使用共享字符串。
另存后变为898KB,说明另存后的文件将字符串都存储到了共享字符串表中。这可能是因为原文件可能没有使用共享字符串表,而是直接内联在单元格中(即使用<v>标签直接存储字符串),而另存为操作将字符串移动到了共享字符串表。

为什么原文件在Office 2010中打开慢?

可能的原因:Office 2010处理内联字符串的方式效率较低,尤其是当数据量很大时。另外,注释的存在也可能加重了负担。

为什么另存后的文件变大了?

因为引入了共享字符串表,而且这个共享字符串表可能包含了所有的字符串,导致sharedStrings.xml变得很大(898KB)。

为什么原文件从ERP下载时没有使用共享字符串表?

可能是因为ERP系统为了简化生成过程,直接生成了内联字符串的格式。而Office 2016对这两种格式都处理得很好,所以打开速度快。

为什么执行任意编辑然后保存,文件变大且打开速度正常?

这个编辑操作可能触发了Excel重新组织文件结构,将内联字符串转换为共享字符串表,并可能丢弃了注释。

excel文件中数据的存放位置?

解压excel后,找到xl\worksheets,里面有各个sheet的内容
默认情况下,excel使用共享字符串表的方式来使用字符串内容。即,将单元格中的字符串集中存储在xl\sharedStrings.xml这个文件中,然后在xl\worksheets里的sheet表中,单元格中通过索引单元格地址的方式引用sharedStrings.xml的数据

posted on 2025-10-22 14:49  越野兔  阅读(13)  评论(0)    收藏  举报

导航