Excel工作表项目参考

时间:2009-04-22 14:57:53

标签: excel interop

我在编程树下以编程方式打开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分钟)。有更快更有效的方法吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

似乎每当你必须点击Excel对象模型时,你就会受到性能影响。我同意上一张海报,如果你想加快性能,你需要直接阅读Excel文件。

作为旁注,由于Excel 2007文件(* .xlsm,* .xltm)本质上是* .zip文件,因此您需要直接查找和访问vbaProject.bin文件。快速查看指向路径(我更改了扩展名,以便我可以浏览文件):

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

显然,您可以手动挖掘该bin文件并找到特定的引用(如前一张海报所示),但是如果您想要遍历项目中的所有引用,则需要使用API呼叫IStream / IStorage。这里有一篇关于逆向工程Office BIN文件的文章: http://www.codeproject.com/KB/cs/office2007bin.aspx。要访问vbaProject.bin中的引用,请查找标题为“读取或更新vbaProject.bin部件”的部分。还有一个示例C#代码项目,演示如何读取OLE容器。我刚刚在代码示例中占据了一席之地,所以我无法证明它的有效性,但它看起来确实是有序的。

希望有所帮助!

答案 1 :(得分:0)

我不认为你可以增加Workbooks.Open性能。但是,如果您的主要目的只是检查电子表格是否使用了特定引用,那么请考虑以二进制模式打开Excel文件并搜索dll字符串。(提供功能的dll的路径,可以是在参考窗口的位置部分看到。)

这将是非常粗糙的方式,但如果Workbook.Open表现真的是一个瓶颈,那么你绝对可以尝试一下。

相关问题