Excel表项目参考

我以编程方式打开文件夹树下的Excel工作簿来检查一些项目引用使用下面的代码 –

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

这工作正常,但我的文件夹结构非常深,我有超过20,000电子表格存储在其中。 有时取决于Excel文件的大小,对Workbooks.Open()的调用需要很长时间(在某些文件上每次调用超过5分钟)。 有没有更快捷的方式来做到这一点?

谢谢您的帮助

我不认为你可以增加Workbooks.Openperformance。 但是,如果你的主要目的是检查一个特定的引用是否被Spreadsheet使用,那么考虑以二进制模式打开Excel文件并searchdllstring(dll的path提供的function,可以是见参考窗口的位置部分)。

这将是非常粗糙的方式,但如果Workbook.Openperformance真的是一个瓶颈,那么你一定可以试试看。

这似乎是每当你不得不击中Excel对象模型,你会打一个性能。 我同意以前的海报,如果你想加快性能,你需要直接读取Excel文件。

请注意,由于Excel 2007文件(* .xlsm,* .xltm)本质上是* .zip文件,因此您需要直接查找并访问vbaProject.bin文件。 快速查看指向的path(我改变了扩展,所以我可以浏览文件):

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

很明显,你可以手动挖掘bin文件并find特定的引用(如前面的提示),但是如果你想要遍历项目中的所有引用,你需要使用API​​调用IStream /的IStorage。 有一篇关于在这里对Office BIN文件进行反向工程的很好的文章: http : //www.codeproject.com/KB/cs/office2007bin.aspx 。 要访问vbaProject.bin中的引用,请查找标题为“读取或更新vbaProject.bin部分”的部分。 还有一个示例C#代码项目演示如何读取OLE容器。 我只是在代码示例中取得了一个高峰,所以我不能certificate它的有效性,但它似乎是有条不紊的。

希望有所帮助!