Перебор всех гиперссылок в листе Excel с использованием OpenXML не возвращает все гиперссылки - PullRequest
0 голосов
/ 08 октября 2018

Я наблюдаю очень странное поведение здесь.У меня есть документ Excel (.xlsx), и моя цель - отредактировать все гиперссылки, которые соответствуют определенным критериям.

При первой итерации я могу редактировать большинство ссылок.Есть 4 ссылки, которые все еще остаются.Затем я снова запускаю программу.Теперь 2 остаются.Затем я снова запускаю программу, и, наконец, все ссылки заменяются.

Вот фрагмент:

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(FilePath, true))
        {
            WorkbookPart wbPart = doc.WorkbookPart;

            // Replace hyperlink targets
            foreach (var worksheet in wbPart.WorksheetParts)
            {
                var hyperLinkRelations = worksheet.HyperlinkRelationships;
                for (int i = 0; i < hyperLinkRelations.Count(); i++)    
                {
                    var link = hyperLinkRelations.ElementAt(i);
                    try
                    {
                        if (link != null && link.Uri != null && Utils.IsToBeReplaced(link.Uri.AbsoluteUri))
                        {
                            string relationId = link.Id;
                            string destUrl = GetReplacementUrl(link.Uri.AbsoluteUri);
                            if (destUrl != null)
                            {
                                worksheet.DeleteReferenceRelationship(link);
                                worksheet.AddHyperlinkRelationship(new Uri(destUrl, UriKind.Absolute), true, relationId);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(ex);
                    }
                }
            }
}

Я проверил служебные методы "IsToBeReplaced ()" и "GetReplacementUrl () "функционируют нормально.Я установил точку останова и обнаружил, что URL-адреса, которые не заменяются, просто не отображаются в коллекции «HyperlinkRelationships».

Вот файл Excel, с которым я работаю: https://app.box.com/s/j3ulbxfafzxgcqiaep148a8yq4iy37ow

1 Ответ

0 голосов
/ 09 октября 2018

Я думаю, ваше индексирование сбрасывает его.
В качестве первой попытки я попытался бы работать в обратном направлении.то есть что-то вроде:

var hcount = hyperLinkRelations.Count();
for (int i = hcount - 1; i >= 0; i--)

В противном случае, после удаления добавьте отношение, которое обновляет переменная i, но коллекция была перенумерована / сдвинута на единицу, поэтому я пропустил элемент.

...