2009-04-22 5 views
1

Я программно открытия книг Excel под деревом папок для некоторых ссылок проекта, используя следующий код -лист проекта Excel Ссылки

workbook = app.Workbooks.Open(fileName,false,true,Missing,Missing,.....); 
foreach(Reference r in workbook.VBProject.References) 
{ 
     //check for a specific reference here 
} 

Это прекрасно работает, но моя структура папок очень глубоко, и я более чем 20000 электронные таблицы, хранящиеся в них. Иногда, в зависимости от размера файла excel, вызов Workbooks.Open() занимает много времени (более 5 минут на звонок в некоторых файлах). Есть ли более эффективный способ сделать это?

Спасибо за помощь

ответ

0

Я не думаю, что вы можете увеличить производительность Workbooks.Open. Однако, если ваше основное намерение состоит в том, чтобы проверить, не используется ли конкретная ссылка в электронной таблице или нет, рассмотрите возможность открытия файла Excel в двоичном режиме и поиска строки dll. (Путь к dll, предоставляющий функциональность, которая может быть см. в разделе «Расположение» в окне «Ссылки»).

Это было бы очень грубо, но если производительность Workbook.Open действительно является узким местом, вы можете определенно попробовать.

+0

Спасибо. Я не пытался использовать двоичный вариант, так как это может быть не очень просто, и теперь он управляется с помощью WorkBooks.Open. – 2009-05-01 12:25:44

1

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

В качестве примечания стороны, поскольку файлы Excel 2007 (* .xlsm, * .xltm) являются в основном * .zip-файлами, вам нужно будет напрямую найти и получить доступ к файлу vbaProject.bin. Беглый точки взгляд на пути, как (я изменил расширение, чтобы я мог просмотреть файл):

..\Book1.zip\xl\vbaProject.bin 

Очевидно, что вы могли бы вырыть через этот бен файл вручную, так и найти конкретные ссылки (как это было предложено в предыдущем постере), но если вы хотите просмотреть все ссылки в проекте, вам нужно будет использовать вызовы API IStream/IStorage. Есть отличная статья об обратном проектировании файлов Office BIN здесь: http://www.codeproject.com/KB/cs/office2007bin.aspx. Чтобы получить доступ к ссылкам в vbaProject.bin, найдите раздел «Чтение или обновление частей vbaProject.bin». Существует также пример проекта кода C#, который демонстрирует, как читать контейнер OLE. Я просто взял пик в образце кода, поэтому я не могу подтвердить его эффективность, но он, безусловно, выглядит в порядке.

Надеюсь, что это поможет!

+0

Правда, мы не работаем для Office 2007 до конца этого года, поэтому на данный момент я придерживаюсь существующего кода, но Office 2007 будет лучше выполнять эту операцию. Спасибо за совет. – 2009-05-01 12:26:57

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