2013-02-12 2 views
5

Я работаю над проектом, в котором набор данных хранится в тысячах книг Excel (в настоящее время ~ 14000) в папке на сервере Sharepoint, каждый из которых регулярно изменяется, чтобы отражать изменения в подмножестве данных в этой книге. Я знаю, что это не очень хороший способ сохранить и обновить эти данные, но это так, как есть.Есть ли более быстрый способ сбора данных из книг, чем повторение Workbooks.Open()?

Мне нужно выполнить различные запросы, связанные с извлечением содержимого одного или нескольких полей из всех книг в папке. Я делал это путем перебора множества книг следующим образом:

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, которые не нужно открывать/закрывать? Или есть способ, которым я могу справиться с процессом open/close, чтобы сделать это быстрее?

+2

Ха-ха. Хах. Повторите за мной: «SharePoint - это * не * база данных». В более серьезной заметке это, скорее всего, можно будет сделать быстрее, используя подход, который не полагается на COM +/OLE, например, стороннюю библиотеку, которая может читать указанные файлы независимо от Office. – 2013-02-12 20:29:18

+0

@pst: и наверняка это все виновата в сигиле, верно? не очень конструктивный сегодня. –

+0

@PeterAlbert Я никогда не говорил, что это так. И я предложил путь для подражания. – 2013-02-12 20:31:13

ответ

1

Я бы использовал ADO и подключался к книгам Excel как базы данных, позволяя вам вызывать SQL-запросы против них. Я бы определенно сделал это для чтения данных, но также и для написания (см. here).

Сохранение данных в Access, безусловно, будет улучшением по сравнению с сохранением в Excel, и вы могли бы рассмотреть возможность планирования компактных данных так часто, чтобы уменьшить размер базы данных.

+1

ADO + SQL намного быстрее, чем открытие/закрытие книг , Мне нравится этот подход лучше, хотя бывают случаи, когда он не будет работать (например, получение значений пользовательских свойств в листах). – sigil

+0

Если документами являются .xlsx, другой вариант рассмотрения - это SDK Office Open XML SDK, который, вероятно, будет еще быстрее. OTOH, я не знаю, можете ли вы использовать SDK в качестве COM-компонента, что было бы необходимо, если вы делаете это из VBScript или VBA. –

+0

@ JasonR.Mick И теперь мы можем удалить наши предыдущие комментарии по этой проблеме. –

Смежные вопросы