使用OpenXML迭代Excel工作表中的所有超链接不会返回所有超链接

时间:2018-10-08 20:40:37

标签: c# excel openxml openxml-sdk

我在这里观察到一种非常奇怪的行为。我有一个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 :(得分:0)

我想你的索引会把它扔掉。
作为第一次尝试,我将尝试向后工作。 例如:

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

否则,在删除然后添加关系后,您的i变量将更新,但集合已重新编号/上移了一个,因此我将跳过一个元素。