检测Excel工作簿链接

http://www.linkfixerplus.com有一个产品来检查工作簿链接,并修复它们,但它的昂贵,我已经被要求写一个将只检查交叉引用(工作簿链接),而不用担心,如果他们被打破。

这是我迄今为止写的裸骨代码(更像是在这个阶段的伪代码 – 瞄准.Net 2,所以忘了LINQ):

public class LinkInfo { public string SheetName { get; set; } public string Cell { get; set; } public string CellValue { get; set; } } private bool ExcelFileHasLinks(string path,ref List<LinkInfo> linkInfoList) { bool hasLinks = false; Workbook wb = null; try { wb = excel.Workbooks.Open(path); foreach (object possibleSheet in excel.Sheets) { var aSheet = possibleSheet as Worksheet; if (aSheet != null) { //Get the values in the sheet Range rng = aSheet.UsedRange; object[,] values = null; try { if (rng.Value2.GetType().IsArray) { values = (object[,])rng.FormulaArray; } else { values = new object[2, 2]; values[1, 1] = rng.FormulaArray; } } catch { } if (values != null) { for (int row = 1; row <= values.GetUpperBound(0); row++) { for (int col = 1; col <= values.GetUpperBound(1); col++) { if (values[row, col] != null) { //Check if this iis a link to another workbook string cellFormula = values[row, col].ToString().Trim(); if (cellFormula.StartsWith("=") && cellFormula.Contains("!") && cellFormula.Contains("[") && cellFormula.Contains("]")) { hasLinks = true; linkInfoList.Add(new LinkInfo() { SheetName = aSheet.Name, Cell = ColumnNumberToName(col) + row, CellValue = cellFormula }); } } } } } } } } catch (Exception) { } finally { if (wb != null) wb.Close(); } return hasLinks; } 

当XLS文件具有指向其他工作簿的链接时,此function完美无缺:

= [a.xlsx]工作表Sheet1!$ A $ 1

我的问题是,在SAN中几乎有成千上万的电子表格,并且由于敏感性,我不允许查看它们! 所以我正在进行testing,看看是否有各种语法来做到这一点,我发现这一点:

= Excel.Sheet.12 | 'C:\ TEMP \ a.xlsx'! '!Sheet2的R6C3'

和这个:

= EMBED( “Excel.Sheet.12”, “”)

检测公式的代码行不能用于以上两个:

 if (cellFormula.StartsWith("=") && cellFormula.Contains("!") && cellFormula.Contains("[") && cellFormula.Contains("]")) 

我的问题是有没有更多的语法,我不知道,任何人都可以推荐优雅的代码来检测工作簿链接的所有变化?

另一个产品,我发现可以做到这一点是http://www.2haveit.com/listdetail.php?id=90005和它的Excel插件,所以它只能在一个电子表格上一次 – 但他们仍然必须有覆盖那里基地,因为我试图做。

编辑:我需要这个WinForm应用程序不是Excel加载项

我发现在对象模型中有一个方法: Workbook.LinkSources Method但是它也无法检测到这个链接:

= Excel.Sheet.12 | 'C:\ TEMP \ a.xlsx'! '!Sheet2的R6C3'

按照要求:

我的mappit! 插件检测并突出显示工作簿链接

另外我是比尔·曼维尔的FindLink工具的巨大粉丝

我find了对象模型的方法: Workbook.LinkSources方法