检测Excel工作簿链接

时间:2012-06-07 01:43:32

标签: c# hyperlink 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文件以这种方式表达其他工作簿的链接时,这非常有效:

= [a.xlsx] Sheet 1中!$ A $ 1

我的问题是SAN中有数十万个电子表格,由于敏感性,我不允许查看它们!所以我正在进行测试,看看是否有各种语法可以做到这一点,我发现了这个:

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

和此:

= 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 |!: '!Sheet2的R6C3' 'C \ TEMP \ a.xlsx'

2 个答案:

答案 0 :(得分:1)

我找到了对象模型方式:Workbook.LinkSources Method

答案 1 :(得分:1)

根据要求:

我的Mappit! addin检测并突出显示工作簿链接

另外,我是Bill Manville的FindLink tool

的忠实粉丝