如何减小一个巨大的Excel文件

12

我有一个仅包含一个工作表的小而简单的*.XLS文件,该工作表只有许多带数字的小文本单元格(文件大小为24Kb)。

但是我进行了很多更改,复制粘贴、扩展公式、保存...之后我删除了大部分这些更改,并创建了4个包含少量数据的工作表副本。

现在我的新文件非常巨大:2.5Mb!

隐藏的数据在哪里,我该如何删除它?

我在真实文件上也遇到了同样的问题,该文件包含300个工作表和每个工作表上的1张图片:文件大小为280Mb


你使用的是哪个版本的Excel和应用程序来进行更改的? - PP.
Excel 2010,我手动和通过VBA进行了更改。 - Alban
最后的单元格[CTRL]+[END]是BE10006,但实际上最后的单元格是L27。 - Alban
Excel 2013及以上版本具有查询插件以清除多余的单元格格式 https://support.office.com/zh-cn/article/%E5%B7%A5%E4%BD%9C%E8%A1%A8%E4%B8%AD%E6%B8%85%E9%99%A4%E5%A4%9A%E4%BD%99%E7%9A%84%E5%8D%95%E5%85%83%E6%A0%BC%E6%A0%BC%E5%BC%8F-e744c248-6925-4e77-9d49-4874f7474738 - Slai
你真的需要在一个文件中有300个表格吗? - NoChance
8个回答

13

我使用.XLSB格式存储文件以减小文件大小。 XLSB格式还允许VBA和宏与文件一起保存。通过二进制格式,我曾经将50兆的文件缩小到不到10兆。


1
我在想下面这种情况。如果你从一个非常大的XLSM文件开始,然后将其保存为XLSB,再将其保存回XLSM,那么你会得到不同的XLSM文件大小吗?我问你是因为你有大文件,而我没有 :) - 谢谢。 - NoChance

5
我编写了一个VBA文件来添加清理异常大文件的工具。该脚本会清除最后一个真正使用的单元格后面的所有列和行,以重置最后一个单元格([Ctrl]+[End]),并提供启用图像压缩功能。
我开发了一个自动安装的AddIns(只需启用宏即可运行),以在上下文菜单中包含许多新按钮:
  1. 优化
  2. 优化并保存
  3. 禁用优化器

Context menu after install it

这是基于 Microsoft Office 2003的知识库和PP的答案,加入了个人改进的内容:
  1. 增加图像压缩
  2. 修复列的错误
  3. 支持与Excel 2007-2010等版本兼容(超过255列)
解决方案 > 您可以下载我的*.xlam文件ToolsKit 主要代码如下:
Sub ClearExcessRowsAndColumns()
    Dim ar As Range, r As Double, c As Double, tr As Double, tc As Double
    Dim wksWks As Worksheet, ur As Range, arCount As Integer, i As Integer
    Dim blProtCont As Boolean, blProtScen As Boolean, blProtDO As Boolean
    Dim shp As Shape
    Application.ScreenUpdating = False
    On Error Resume Next
    For Each wksWks In ActiveWorkbook.Worksheets
      Err.Clear
      'Store worksheet protection settings and unprotect if protected.
      blProtCont = wksWks.ProtectContents
      blProtDO = wksWks.ProtectDrawingObjects
      blProtScen = wksWks.ProtectScenarios
      wksWks.Unprotect ""
      If Err.Number = 1004 Then
         Err.Clear
         MsgBox "'" & wksWks.Name & "' is protected with a password and cannot be checked.", vbInformation
      Else
         Application.StatusBar = "Checking " & wksWks.Name & ", Please Wait..."
         r = 0
         c = 0

         'Determine if the sheet contains both formulas and constants
         Set ur = Union(wksWks.UsedRange.SpecialCells(xlCellTypeConstants), wksWks.UsedRange.SpecialCells(xlCellTypeFormulas))
         'If both fails, try constants only
         If Err.Number = 1004 Then
            Err.Clear
            Set ur = wksWks.UsedRange.SpecialCells(xlCellTypeConstants)
         End If
         'If constants fails then set it to formulas
         If Err.Number = 1004 Then
            Err.Clear
            Set ur = wksWks.UsedRange.SpecialCells(xlCellTypeFormulas)
         End If
         'If there is still an error then the worksheet is empty
         If Err.Number <> 0 Then
            Err.Clear
            If wksWks.UsedRange.Address <> "$A$1" Then
               ur.EntireRow.Delete
            Else
               Set ur = Nothing
            End If
         End If
         'On Error GoTo 0
         If Not ur Is Nothing Then
            arCount = ur.Areas.Count
            'determine the last column and row that contains data or formula
            For Each ar In ur.Areas
               i = i + 1
               tr = ar.Range("A1").Row + ar.Rows.Count - 1
               tc = ar.Range("A1").Column + ar.Columns.Count - 1
               If tc > c Then c = tc
               If tr > r Then r = tr
            Next
            'Determine the area covered by shapes
            'so we don't remove shading behind shapes
            For Each shp In wksWks.Shapes
               tr = shp.BottomRightCell.Row
               tc = shp.BottomRightCell.Column
               If tc > c Then c = tc
               If tr > r Then r = tr
            Next
            Application.StatusBar = "Clearing Excess Cells in " & wksWks.Name & ", Please Wait..."
            Set ur = wksWks.Rows(r + 1 & ":" & wksWks.Rows.Count)
                'Reset row height which can also cause the lastcell to be innacurate
                ur.EntireRow.RowHeight = wksWks.StandardHeight
                ur.Clear

            Set ur = wksWks.Columns(ColLetter(c + 1) & ":" & ColLetter(wksWks.Columns.Count))
                'Reset column width which can also cause the lastcell to be innacurate
                ur.EntireColumn.ColumnWidth = wksWks.StandardWidth
                ur.Clear
         End If
      End If
      'Reset protection.
      wksWks.Protect "", blProtDO, blProtCont, blProtScen
      Err.Clear
    Next
    Application.StatusBar = False
    ' prepare les combinaison de touches pour la validation automatique de la fenetre
    ' Application.SendKeys "%(oe)~{TAB}~"

    ' ouvre la fenetre de compression des images
    Application.CommandBars.ExecuteMso "PicturesCompress"
    Application.ScreenUpdating = True
End Sub


Function ColLetter(ColNumber As Integer) As String
    ColLetter = Left(Cells(1, ColNumber).Address(False, False), Len(Cells(1, ColNumber).Address(False, False)) - 1)
End Function

5
我在一个大小为4,194KB的电子表格上运行了它,结果把它变成了一个39,024KB的电子表格! - user3810626
1
你能发给我这个文件吗?(@gmail我的用户名是alban.lopez)我很惊讶你说我的代码不能扩大一个文件。 - Alban
2
很疯狂,是吧?不过我不确定能否发送,我需要先和所有者确认一下。我从工作簿中删除了最大的页面,将电子表格大小降至400K,然后再次运行了您的宏...结果变成了507K!这是Excel 2013版本。 - user3810626

4
我在Excel中有丰富的工作经验,以下3点非常有用:

查找明显不包含任何数据但Excel认为它们有数据的单元格

您可以通过在工作表上使用以下属性来查找此内容:

ActiveSheet.UsedRange.Rows.Count
ActiveSheet.UsedRange.Columns.Count

如果此范围大于您拥有数据的单元格,则删除其余行/列

您会惊讶地发现它可以释放多少空间

将文件转换为 .xlsb 格式

XLSM 格式是为使 Excel 符合 Open XML 而设计的,但实际上我们使用 Excel 的 XML 格式的情况非常少。如果不是更多,则可以将大小减小约 50%

最佳的信息存储方式

例如,如果您需要保存约 10 年的股票价格,并且需要为一只股票保存开盘价、最高价、最低价和收盘价,则会使用 (252*10) * (4) 单元格

相反,可以在单个列中使用字段分隔符 Open:High:Low:Close 来保存开盘价、最高价、最低价和收盘价,而不是使用单独的列。

您可以轻松编写函数以从单个列中提取信息,但这将释放当前占用的近2/3空间。


4
如果你的文件只是文本,最好的解决方案是将每个工作表保存为 .csv 格式,然后重新导入到 Excel 中 - 这需要更多的工作,但我把一个20MB的文件缩小到了43KB。

3
我把文件格式改成了*.XLSX,这个改变压缩了我的文件,并且减小了文件大小15%。

1

2
使用顶部链接,我将一个1484KB的xlsx文件(仅带一些格式的文本)压缩至47KB。 - hynsey

1
我有一个24MB大小的Excel文件,其中包含了100多张图片。通过以下步骤,我将其缩小到不到5MB:
  1. 选中每张图片,剪切(CTRL X),然后通过ALT E S位图选项在特殊模式下粘贴。
  2. 为了找出哪些位图仍然很大,需要选择每个工作表中的一个文件,然后按CTRL A。这将选择所有图片。
  3. 双击任何一张图片,RESET Picture选项会出现在顶部。
  4. 点击重置图片,所有仍然很大的图片都会显示出来。
  5. 按CTRL Z(撤消),然后再像步骤1那样将这些余额图像粘贴到位图(*.BMP)中。
我花了两天时间才弄清楚这个方法,因为在任何帮助论坛中都没有列出。希望这个回答能帮助到某些人。
BR Gautam Dalal(印度)

1
我发现一个巨大的.xlsx文件有一个有趣的原因。 原始工作簿有20个表格,大约20 MB 我创建了一个只包含其中一个表格的新工作簿,以便更易于管理:仍然是11.5 MB 想象一下,我惊讶地发现新工作簿中的单个表格有1,041,776(数一下!)空行。 现在它只有13.5 KB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接