【问题标题】:Slow Excel automation?Excel自动化速度慢?
【发布时间】:2012-12-31 07:13:51
【问题描述】:

我正在使用以下 Powershell 脚本来删除大量文件列中单元格的NumberFormat,以便显示所有分数。该列可能有小数、文本或日期等;只有这些十进制/货币格式(格式为0**#*)的单元格需要应用

但是速度很慢(每秒检查/更新两个或三个单元格)。有更好/更快的方法吗?

    $WorkBook = $Excel.Workbooks.Open($fileName)
    $WorkSheet = $WorkBook.Worksheets.Item(1)
    $cell = $WorkSheet.Cells

    $ColumnIndex = 10 # The column may have decimal, text or date, etc.
    $i = 2

    while ($cell.Item($i, 1).value2 -ne $Null)
      # Replace it to find the last row# of column 1 may cut the time in half? How?
    {
        $c = $cell.Item($i, $ColumnIndex)

        if (($c.NumberFormat -like "0*") -or $c.NumberFormat -like "*#*")
        {
            "$i : $($c.NumberFormat) $($c.value2) "
            $c.NumberFormat = $Null
        }
        $i++
    }

更新:

.Net Microsoft.Office.Interop.Excel 会快得多吗? 或者将文件转换为 xlsx 格式并使用System.IO.Package.IO

【问题讨论】:

  • 你能量化它的运行速度吗?是否有可以上传的示例文件供我们测试?
  • 处理12个Excel文件需要半小时。 Excel 文件的大小通常为 60KB,每个文件中有数百到数千行。
  • 从我自己的角度来看,我需要一个示例文件以及关于使用脚本处理所述文件需要多长时间的指标,以便真正提供更多帮助,或者看看我是否可以提高执行速度。您可以将代码包装在 Measure-Command 中,以查看运行需要多长时间。
  • 由于您的调用已经在使用 Interop(尽管您可能没有意识到),您不太可能看到从早期绑定到 Microsoft.Office.Interop.Excel 的性能改进。
  • 您可以进行一些过滤,这样您就不必循环每个单元格(这样做非常非常慢)。如果(且仅当)您可以保证数字字段中的值永远不会与日期冲突(以数字形式存储,例如 41284 是 2000 年 1 月 1 日),那么您可以排除任何高于此的内容,这也将删除文本单元格。如果有机会,我会制作一个样本

标签: powershell excel automation office-interop vba


【解决方案1】:

阅读评论后,我提高了速度。谢谢大家。

  1. 尽量减少单元格的访问。我删除了输出行"$i : $($c.NumberFormat) $($c.value2) "并更改了

    if (($c.NumberFormat -like "0*") -or $c.NumberFormat -like "*#*")

    $f = $c.NumberFormat
    if ($f -like "0*" -or $f -like "*#*")

  2. 我还使用$lastRow = $cell.SpecialCells(11, 1).Row 来获取最后的行号并将循环更改为while ($i -le $lastRow)

  3. $Excel.ScreenUpdating = False 也帮助减少了一些时间。

【讨论】:

  • 谢谢谢谢谢谢!!!添加 ScreenUpdating = false 将我的边框绘制时间从 70 秒减少到 3 秒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2020-03-02
  • 2011-10-19
相关资源
最近更新 更多