(写在前面:这个问题似乎还没有研究完)

就在本周,同事跟我说了个非常神奇的现象,之前做的表格在公司的电脑上打开没有任何问题,但是到了自己的笔记本上打开反而非常卡,卡到连工作表都切不动,随便动一下就程序未响应,于是找我说了下这个事情。

我要他把有问题的文档发给我我看下,同时我们确认了两台电脑环境差异和文件异常的地方:
1、公司的电脑是Excel2007,同事自己的笔记本是Excel2019
2、文件体积相比同类型文件大了至少三倍
3、Excel2007打开以后操作非常流畅,但是到了Excel2019就非常卡顿
4、笔记本上甚至连点这个文件右键菜单都要转一下才出来
5、公司的PC配置非常老,运行效率低下,同事的笔记本是新买的,4800H+固态,打开其他文件非常迅速

因为是xlsx文档,所以就直接改成zip看文档内容到底有什么了:

乍一看好像没啥不对,但是点开drawings之后就发现问题了。。

drawings文件夹记录的是Excel文档的绘图形状,然而据同事说表里根本不可能有绘图形状之类的东西,所以暂且认为drawings文件夹是多余的,但是为了保险起见还是强行点开了文件看里面是不是有大量不可见的绘图形状

结果,还真有。。。在非常不起眼的角落发现了难以察觉的绘图形状

那么接下来就是想办法删掉这部分绘图形状了,三个办法:

一是换2007(你这不等于没说吗!)

二是直接在压缩包里删掉drawings文件夹,由于删掉drawings文件夹后会导致文件缺失,Excel在打开的时候会修复文档,同时删除不存在的绘图形状组件

如果能正常修复完,文件再另存为其实就已经和之前的文件没什么两样了。
但是这种粗暴的方法对于2010以后版本的Excel又是灾难性的,因为Excel2010以后的版本在很多电脑上很可能都没开始修复就崩溃了,所以如果这种方法导致了电脑崩溃,请往后看。

三是通过vba解决,在工作簿标签上点右键打开查看代码输入下面的代码就可以删掉所有绘图形状了(虽然可以用,但是有副作用,因为是删除对象,而对象又不止绘图形状,图表好像也属于对象,同时如果确实有要用的绘图形状既不能用方法一也不能用方法二而是只能老老实实换Excel2007挨个看)

Sub a()
Dim draw As Object
For i = 1 To Sheets.CountSheets(i).SelectOn Error Resume NextFor Each draw In ActiveSheet.Shapesdraw.DeleteNext draw
Next
End Sub

当删除掉所有对象后,一般的表格这个时候就应该恢复正常了,不管怎样操作都和之前在Excel2007一样

当然以上三种办法无论哪一种,都是直接删除掉所有对象,如果有要保留的对象,就要考虑选择性删除了。

关于被忽略掉的部分:

实际上,还没完。

在之前的文档里,我们发现除了绘图形状以外,还有一个文件夹——ctrlProps

后来发现,这个文件夹的文件居然高达49000+个,即便压缩过后也为文件增加了不小的体积

目前猜测是这部分文件应该是兼容性检查后留下的信息,每当一个单元格的公式或者格式会有兼容性问题,就会被记录一个文件保存在ctrProps,然而诡异的是只有xlsx保存为xls才会有兼容性问题,xls保存为xlsx后由于不存在兼容性问题,兼容性检查的信息会被清空掉,为什么在这个xlsx文件里依然有这部分信息呢?难以理解。

要清理掉这部分文件也很简单,由于前面的步骤已经清理了drawings下的文件了,绘图形状已经没有了,因此只要重新将文件另存为xls,再另存为xlsx就可以了

关于实际文件读写层面的处理:(12月1日更新

实际上上述情况产生文件体积过大和卡顿的根本原因只有两个——多余的兼容性检查信息和多余的绘图形状

在前面我说过,方法二是直接删除drawings文件夹,有人可能会问,为什么ctrlProps不能这样?

这点我无法解答,实际上从Excel修复来看,两种组件的修复逻辑是不一样的,drawings在修复的时候看的是文档里有没有记录drawing的相关信息,如果没有,就在[Content_Types].xml里直接删掉组件与主文档的关联

而ctrlProps就不一样,就算删掉了文件夹,由于[Content_Types].xml有该部分组件与主文档的关联,Excel会试着尝试重新检查兼容性,但是由于Excel尝试修复的次数是有上限的,因此修复完成的文档你会发现这部分兼容性信息又回来了,而更多的情况可能是因为超过修复次数上限导致修复失败认为文件已损坏

是的,完全不一样

drawings其实跟[Content_Types].xml一点关系也没有

drawings在文件里确实是保存在xl路径下的,但是与文档的关联并不在[Content_Types].xml,而是在xl\worksheets\下每一个sheet*.xml文件里

(sheet*.xml里部分drawing信息)

这也就是为什么直接删掉drawings文件夹后,Excel在修复时会直接删掉所有绘图形状。因为对应的信息没有了,Excel认为这部分数据完全丢失无法复原了,因此直接删掉了绘图形状

这个修复逻辑像极了批注的修复逻辑

然而ctrlProps不一样

文档的兼容性信息是写进[Content_Types].xml里的,如果丢失了会强制修复,因此这部分信息暴力删除不可取,只能以另存为的方法得到干净的[Content_Types].xml后替换原有的[Content_Types].xml,再删除ctrlProps才能顺利删掉这部分多余的信息

关于部分Excel文档在Excel2007能正常打开但在Excel2013以后的版本打开异常卡顿问题的研究相关推荐

  1. 怎么批量提取多个 Excel 文档中的图片

    概要:批量提取 Excel 文档图片.批量提取 xlsx 文档图片.无损提取 Excel 图片.Excel 图片导出.批量提取图片.文档图片提取.批量导出文档图片 Excel 文档中可以插入文本.图片 ...

  2. 如何批量将 Excel 文档转为 Csv 格式

    概要:CSV 称为逗号分隔值,其文件以纯文本形式存储表格数据(数字和文本),而熟悉 Excel 的小伙伴应该也知道 Excel 也是存储表格数据,只不过 Excel 不仅支持文本,还支持图片.视频等多 ...

  3. Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串

    做企业级应用,跟office打交道是少不了的.这里的Office不仅仅局限于微软的Office,还有第三方的Open Office之类..Net传统的Office操作方法(比如OleDB,OWC之类) ...

  4. html5设置单元格行高,单元格的行高怎么设置 EXCEL文档怎么统一设置行高

    我要把有几行设置为同样的高度,可是一行一行的拉,太慢了. 在Excel中,如何设置表格最合适的行高.列宽? EXCEL中的单元格行高不够怎么调整可以自动调整,根据字的内容来调整: 请问怎么统一设置EX ...

  5. php 导出excel2003,PHPExcel导出2003和2007的excel文档功能示例

    本文实例讲述了PHPExcel导出2003和2007的excel文档功能.分享给大家供大家参考,具体如下:require_once "common/excel/PHPExcel.php&qu ...

  6. Python openpyxl 之 Excel 文档简单操作

    背景:生活中常常因日常工作,在记录统计方面需频繁处理较多 Excel 表格,这部分工作虽可由人工完成,但这样会显得有些繁琐且可能存在偏差,遂闲时查阅了是否有相关基于python处理Excel表格的学习 ...

  7. 用 Python 帮运营妹纸快速搞定 Excel 文档

    Microsoft Office 被广泛用于商务和运营分析中, 其中 Excel 尤其受欢迎.Excel 可以用于存储表格数据.创建报告.图形趋势等.在深入研究用 Python 处理 Excel 文档 ...

  8. 使用XML创建Excel文档

    使用XML创建Excel文档            原例子使用VB.Net写的,以下的用C#改写的代码 原文代码: http://www.gotdotnet.com/Community/UserSam ...

  9. 如何将Revit明细表导出为Excel文档

    Revit软件没有将明细表直接导出为Excel电子表格的功能,Revit只能将明细表导出为TXT格式,但是这种TXT文件用EXCEL处理软件打开然后另存为XLS格式即可,以Revit2013版自带的建 ...

最新文章

  1. K3ERP连接数据库问题
  2. 热烈欢迎乔丹入驻博客园
  3. Zend Studio实现移动程序开发一体化的秘密武器——CCM
  4. Java序列化和克隆
  5. 用命令行CMD .bat 相关操作 如: 创建快捷方式 复制文件等
  6. python中cv2库_Python cv2库(人脸检测)
  7. 【Markdown编辑器】LaTeX公式教程
  8. 驱动框架2——内核驱动框架中LED的基本情况、初步分析
  9. android cordova 教程,cordova入门教程(一)
  10. Windows巡检IIS指标脚本(PowerShell实现)
  11. 基础算法 —— 高精度计算 —— 高精度减法
  12. python打印字符金字塔_Python教程第7篇:print打印字符串
  13. leetcode力扣94. 二叉树的中序遍历
  14. chapter 1 JS简介,核心语法,变量
  15. java 图片 pdf_Java 添加图片到PDF
  16. 1946年第一台公认电子计算机,1946年诞生的世界上公认的第一台电子计算机是()。...
  17. ip网络广播系统服务器,IP网络广播服务器
  18. 请仅用一笔画四根直线,将下图9各点全部连接
  19. linux查询iscsi服务,使用Linux的tgtd提供iscsi服务
  20. 荣耀机试题 2021.04 ~05

热门文章

  1. 这些普洱茶知识你都知道吗?
  2. 转换流InputStreamReader
  3. 原始form表单提交数据字段缺失问题
  4. JQuery使用插件实现轮播
  5. P5488 差分与前缀和 解题报告
  6. UVA - 524:Prime Ring Problem
  7. 名编辑电子杂志大师教程 | 朗读配音解说员助手
  8. asynchttpclient 超时_LOL手游登录不了怎么办 英雄联盟手游超时教程方式
  9. 问题解决:Word实现横竖页面插入混合排版
  10. 怎么处理公司税务异常?税务异常的原因主要有三个