2012-06-07 3 views
2

http://www.linkfixerplus.com есть продукт, чтобы проверить ссылки на книгу и исправить их, но это дорого, и мне было предложено написать тот, который будет просто проверять ссылки на перекрестные ссылки (ссылки на рабочую книгу) и не волноваться, если они сломаны.Обнаружение Excel WorkBook Links

Это голый код кости я написал до сих пор (больше как псевдо код на данном этапе - таргетирования .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] Лист1 $ A $ 1

Моя проблема заключается в том, что существуют буквально сотни тысяч электронных таблиц в SAN, и я не имею права смотреть! их должное t o чувствительность! Таким образом, я проводил тесты, чтобы увидеть, если есть различные Синтаксисы, чтобы сделать это, и я нашел это:

= Excel.Sheet.12 | 'C: \ Temp \ a.xlsx'

! Sheet2 R6C3! "

и это:

= ВСТРОИТЬ ("Excel.Sheet.12", "")

строка кода обнаружения формула не будет работать на двух предыдущих:

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

My questi on есть ли еще синтаксисы, о которых я не знаю, и может ли кто-нибудь рекомендовать элегантный код для обнаружения всех вариантов ссылок на книгу?

Другой продукт, который я нашел, может сделать это: http://www.2haveit.com/listdetail.php?id=90005 и его надстройка Excel, поэтому он работает только на одной электронной таблице за один раз - но они все равно должны были покрывать там базы, как я пытаюсь сделать.

Edit: мне это нужно как приложение Winform не Excel Add-In

я узнал, есть метод в объектной модели: Workbook.LinkSources Method однако не удается обнаружить эту связь, а также:

= Excel.Sheet.12 | 'C: \ Temp \ a.xlsx' 'Лист2 R6C3!'

+0

Мой [Mappit! addin] (http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/Excel/A_2613-Mappit-a-free-Excel-model-auditing-addin.html) обнаруживает и выделяет ссылки на рабочие книги – brettdj

+1

чемпион! Не могли бы вы назвать это ответом! Вся статья, ура! ps, пожалуйста, никогда не связывайтесь с этим злым сайтом снова;) Повесите его надстройку Excel, поэтому мне пришлось бы вызывать его так: http://stackoverflow.com/questions/10875278/vsto-add-ins-comaddins - и-requestcomaddinautomationservice, и это не собирается летать - спасибо в любом случае. –

+0

проверить мою вторую статью, она предоставляет VBA для обнаружения различных ссылок.Вы должны уметь это адаптировать для C – brettdj

ответ

1

в соответствии с просьбой:

!

Мои Mappit! addin Обнаруживает и выдвигает на первый план рабочие тетради ссылки

Плюс Я большой поклонник Билла Манвиль в FindLink tool

+0

ok, '= Excel.She.12.12 'C: \ Temp \ a.xlsx'! '! Sheet2! R6C3'' - это объект, а не ссылка. –

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