如何使用EPPlus获取Excel单元格批注的作者真实名称?
解决EPPlus获取Excel批注作者返回tc=GUID的问题
原因说明
你看到的tc={GUID}是Excel的线程缓存ID(Thread Cache ID),并非Active Directory的用户GUID,所以用AD查询自然无效。这种情况通常出现在使用Office 365/2019及以上版本的企业版Excel时,当开启了隐私保护或协作会话功能,Excel会将批注的真实作者名替换为临时的tc格式标识符,避免泄露个人信息。EPPlus只是直接读取OOXML文件中存储的作者字段,因此返回的是这个替换后的字符串。
解决方法
1. 直接读取Excel底层XML提取真实作者
如果文件底层仍保留了真实作者信息(部分场景下Excel只是隐藏了显示,并未彻底删除),可以通过EPPlus访问批注的原始XML来获取:
using System.Xml; using OfficeOpenXml; // 注意:需根据使用场景设置EPPlus许可 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 商用场景请改为LicenseContext.Commercial using (var package = new ExcelPackage(new FileInfo(pathToExcelFile))) { var worksheet = package.Workbook.Worksheets[0]; var commentsXml = worksheet.CommentsXml; if (commentsXml == null) { Console.WriteLine("该工作表无批注"); return; } var nsManager = new XmlNamespaceManager(commentsXml.NameTable); var ns = commentsXml.DocumentElement.NamespaceURI; nsManager.AddNamespace("d", ns); // 获取所有作者列表 var authorNodes = commentsXml.SelectNodes("//d:author", nsManager); if (authorNodes == null || authorNodes.Count == 0) { Console.WriteLine("未找到作者信息"); return; } // 遍历每个批注,匹配对应作者 var commentNodes = commentsXml.SelectNodes("//d:comment", nsManager); foreach (XmlNode commentNode in commentNodes) { var refCell = commentNode.Attributes["ref"]?.Value; var authorIdStr = commentNode.Attributes["authorId"]?.Value; if (int.TryParse(authorIdStr, out int authorId) && authorId < authorNodes.Count) { var realAuthorName = authorNodes[authorId].InnerText; Console.WriteLine($"单元格{refCell}的批注作者:{realAuthorName}"); } } }
2. 调整Excel保存设置
如果是你自己生成或有权修改的文件,可以关闭Excel的隐私保护设置,让其保存真实作者名:
- 打开Excel文件,点击「文件」→「另存为」→「工具」→「常规选项」,取消勾选「删除文件属性和个人信息」
- 或者进入「文件」→「选项」→「信任中心」→「信任中心设置」→「隐私选项」,关闭「保存时从文件属性中删除个人信息」
3. 注意事项
如果Excel已经彻底删除了真实作者信息(仅保留tc=GUID),则无法通过任何方式恢复真实名称——因为tc标识符只是Excel会话的临时ID,不关联任何全局用户系统(包括AD)。
内容的提问来源于stack exchange,提问作者Hanlov
相关产品推荐
相关产品推荐

