如何通过Microsoft.Office.Interop.PowerPoint自定义PPT评论的作者名及缩写?
问题
基于VSTO开发项目,用Microsoft.Office.Interop.PowerPoint给PPTX文件添加评论时,明明在Comments.Add方法里传了自定义的作者名和缩写,最终显示的却是登录PowerPoint的用户名。查了Comment接口的定义,发现Author和AuthorInitials只有get方法,没法直接修改。
当前使用的代码:
Microsoft.Office.Interop.PowerPoint.Comment comment = slide.Comments.Add( Left: 0, Top: 0, Author: apiAuthor, AuthorInitials: apiAuthor, Text: title + "\n \n" + description);
Comment接口相关定义:
[DispId(2003)] string Author { [MethodImpl(MethodImplOptions.InternalCall)] [DispId(2003)] [return: MarshalAs(UnmanagedType.BStr)] get; } [DispId(2004)] string AuthorInitials { [MethodImpl(MethodImplOptions.InternalCall)] [DispId(2004)] [return: MarshalAs(UnmanagedType.BStr)] get; }
解决办法
方法1:临时修改PowerPoint应用的用户信息
添加评论前先把PowerPoint应用的用户名改成自定义值,完成后再恢复原设置:
// 保存原用户名和缩写 var originalUserName = app.UserName; var originalUserInitials = app.UserInitials; // 设置自定义作者信息 app.UserName = apiAuthor; app.UserInitials = apiAuthor; // 缩写可按需调整,不强制和全名一致 // 添加评论 var comment = slide.Comments.Add(Left: 0, Top: 0, Text: title + "\n \n" + description); // 恢复原用户信息 app.UserName = originalUserName; app.UserInitials = originalUserInitials;
⚠️ 注意:该方法是全局修改PowerPoint应用设置,多线程或并发处理场景下可能出现数据冲突,需确保操作串行执行。
方法2:用Open XML SDK直接操作PPTX底层结构
PPTX本质是压缩包格式,无需启动PowerPoint应用,直接用Open XML SDK修改评论的作者信息更适合后端批量处理:
- 先安装NuGet包
DocumentFormat.OpenXml和DocumentFormat.OpenXml.Presentation - 示例代码:
using (var presentation = PresentationDocument.Open("目标文件路径.pptx", true)) { // 定位到目标幻灯片对应的SlidePart(需根据实际场景调整,比如按SlideId匹配) var slidePart = presentation.PresentationPart.SlideParts.FirstOrDefault(s => s.SlideId == 目标幻灯片ID); if (slidePart == null) return; // 创建唯一ID的评论作者 var author = new CommentAuthor { Id = 1, Name = apiAuthor, Initials = apiAuthor }; slidePart.CommentAuthorsPart.CommentAuthors.Append(author); slidePart.CommentAuthorsPart.CommentAuthors.Save(); // 创建评论内容 var comment = new Comment { AuthorId = 1, // 与上述作者ID对应 Text = new Text(title + "\n \n" + description), Position = new Position { X = 0, Y = 0 }, DateTime = DateTime.Now }; slidePart.CommentsPart.Comments.Append(comment); slidePart.CommentsPart.Comments.Save(); }
内容的提问来源于stack exchange,提问作者mahesh deshmukh
相关产品推荐
相关产品推荐

