我在这里观察到一种非常奇怪的行为。我有一个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
答案 0 :(得分:0)
我想你的索引会把它扔掉。
作为第一次尝试,我将尝试向后工作。
例如:
var hcount = hyperLinkRelations.Count();
for (int i = hcount - 1; i >= 0; i--)
否则,在删除然后添加关系后,您的i变量将更新,但集合已重新编号/上移了一个,因此我将跳过一个元素。