【问题标题】:Is there a faster way to gather data from workbooks than iterating Workbooks.Open()?有没有比迭代 Workbooks.Open() 更快的方法从工作簿中收集数据?
【发布时间】:2013-01-28 06:28:17
【问题描述】:

我正在处理一个项目,其中数据集存储在 Sharepoint 服务器上的一个文件夹中的数千个 Excel 工作簿(目前约为 14000 个)中,每个工作簿都会定期修改以反映对该工作簿中数据子集的更改.我知道这不是存储和更新这些数据的好方法,但情况就是这样。

我必须执行各种查询,这些查询涉及从文件夹中的所有工作簿中提取一个或多个字段的内容。我一直在通过迭代一组工作簿来做到这一点,如下所示:

Function getData() As Workbook

Dim resultBk As Workbook
Dim fldr As Folder
Dim fso As New FileSystemObject
Dim fileObj As File
Dim filePath As String
Dim queryBk As Workbook

'create a workbook for storing the query results
Set resultBk = Workbooks.Add(resultBkTemplatePath)

'get the folder with all the workbooks to be queried
Set fldr = fso.GetFolder(sharepointFolderPath)

For Each fileObj In fldr.Files
    'try opening each of the workbooks
    Set queryBk = Workbooks.Open(fileObj.Path, ReadOnly:=True)

    'get data from queryBk and add it to resultBk, or add a row with an error message if queryBk failed to open
    addBkDataToResults resultBk, queryBk

    queryBk.Close False
    Set queryBk = Nothing
Next

getData = resultBk

End Function

通过 Sharepoint 连接打开和关闭这么多工作簿的过程非常缓慢;运行一个完整的查询通常需要 12-14 小时。有没有更快的方法从不需要打开/关闭的 Excel 书中读取数据?或者有什么方法可以让我处理打开/关闭过程以加快速度?

【问题讨论】:

  • 哈哈。哈。在我之后重复:“SharePoint 不是数据库”。更严肃地说,使用不依赖 COM+/OLE 的方法(例如可以独立于 Office 读取所述文件的第 3 方库)可能会更快地完成此操作。
  • 请参阅stackoverflow.com/questions/15828/… - 它来自 C# 端,但涵盖了 .NET 中可用的各种选项(使用 VBA/WSH 可能更...限制。)包括“标准”和第 3 方。此外,请考虑仅打开已更新的工作簿; Microsoft Sync Framework(或类似的方法)可以与“缓存存储”一起使用 - 如果只更新一些文档,则只需读取一点点 [新] 数据就可以大大加快进程。
  • @pst,很公平... ;-)
  • 您使用的是 http 路径,还是直接的 "\\someserver\foldername" UNC?后者可能更快。您还可以通过将工作分配到两台或多台 PC 上来获得更好的吞吐量...文件有多大?
  • 1-5MB 是一个不错的大小,因此每个工作簿约 3 秒似乎并不慢:您只有 lot 文件...@pst 的建议跟踪上次更新时间似乎是一个很好的修改。

标签: sharepoint excel vba


【解决方案1】:

我会使用 ADO 并将 Excel 工作簿作为数据库连接,允许您针对它们发出 SQL 语句。我肯定会这样做以读取数据,但也用于写入(请参阅here)。

在 Access 中保存数据肯定会比在 Excel 中保存数据有所改进,您可以考虑每隔一段时间安排一次压缩以减小数据库大小。

【讨论】:

  • ADO + SQL 比打开/关闭工作簿快很多。我更喜欢这种方法,尽管有时它不起作用(例如,在工作表中获取自定义属性的值)。
  • 如果文档是 .xlsx,另一个需要考虑的选项是 Office Open XML SDK,它可能会更快。 OTOH,我不知道您是否可以将 SDK 用作 COM 组件,如果从 VBScript 或 VBA 执行此操作,这将是必需的。
  • @JasonR.Mick 现在我们都可以删除之前关于这个问题的 cmets。
猜你喜欢
  • 2017-07-19
  • 2021-12-19
  • 2018-12-05
  • 1970-01-01
  • 2020-12-06
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多