使用OpenXML SDK在Excel电子表格中创build单元格注释

我正在尝试向Excel 2007电子表格中的单元格添加注释。 我正在使用OpenXml SDK 2.0来这样做。

我的用例是这样的:我创build了一个模板Excel文件,我将其作为起点,而不是从头开始创build一个OpenXML文档。 我的模板文件在单元格A1中有一个注释,所以Excel已经为我创build了一个WorksheetCommentPart。

现在我的问题是,当我添加评论节点到评论部分电子表格不加载和Excel问我是否想要恢复。

真正困扰我的是,我在A1中的原始评论仍然存在,但是我通过编程添加的评论已经消失了!

这是我正在使用的代码:

使用(MemoryStream spreadsheetStream = new MemoryStream()){GetGradebookSpreadsheetTemplate(spreadsheetStream);

using (SpreadsheetDocument spDoc = SpreadsheetDocument.Open(spreadsheetStream, true)) { WorkbookPart wbPart = spDoc.WorkbookPart; WorksheetPart wsPart = wbPart.WorksheetParts.First(); SheetData sheet = wsPart.Worksheet.GetFirstChild<SheetData>(); Comments comments = wsPart.WorksheetCommentsPart.Comments; comments.Descendants<Author>().First().Text = string.Format("{0}, {1}", instructor.LastName, instructor.FirstName); comments.Descendants<Text>().First().Text = string.Format("{0}, {1}", instructor.LastName, instructor.FirstName); List<DefinedName> definedNames = new List<DefinedName>(); definedNames.Add(CreateDefinedName("COLWeb_Gradebook", sheet.NamespaceURI, "Gradebook", "1", "A")); uint index = 4; foreach (User u in users) CreateUserDataRow(index++, definedNames, comments.CommentList, sheet, u, coursesForUsers[u], assignments, submissions[u]); Cell lastCell = sheet.Descendants<Cell>().Last(); OpenXmlElement dimensionsElement = wsPart.Worksheet.Elements().Where(x => x.LocalName == "dimension").First(); dimensionsElement.SetAttribute(new OpenXmlAttribute("ref", null, "A1:" + lastCell.CellReference)); comments.Save(); wsPart.Worksheet.Save(); wbPart.Workbook.Save(); } return spreadsheetStream.ToArray(); 

}

和“CreateUserDataRow”创build一个新的行,但相关的部分是(其中“评论”是我的评论string和“C”是我想要创build注释关于我的单元格):

 if (!string.IsNullOrEmpty(comment)) { List<OpenXmlElement> runs = new List<OpenXmlElement>(); foreach (string row in comment.Split(new string[] { "<p>", "</p>" }, StringSplitOptions.RemoveEmptyEntries)) { string trimmed = row.Trim(); if (!string.IsNullOrEmpty(trimmed)) { string escaped = System.Security.SecurityElement.Escape(trimmed); runs.Add(new Run(new RunProperties(), new Text(escaped))); } } Comment commentCell = new Comment(); commentCell.Reference = c.CellReference; commentCell.AuthorId = 0; commentCell.AppendChild(new CommentText(runs)); comments.AppendChild(commentCell); } 

现在就我的眼睛可以看到,KDiff3就是这样,我的文件和输出的文件非常相似,如果我打开Excel并在Excel中手动input注释。

有没有人有一个很好的例子,用OpenXml给单元格添加评论? 有什么我可能应该知道的关系? 这是否与使用我创build的Excel文件,然后我用作模板(也许一些维度没有设置)有关?

感谢任何帮助,我可以得到。

不幸的是,事情并不那么简单。

单元格注释也有一个在VML绘图部分的graphics对象。 VML是一个神秘的传统规范,并没有经过批准的ECMA标准。 你可以在微软的Open XML文档中find关于它的文档,但是它并不漂亮。 希望微软将在Excel 14中解决这个问题,方法是添加完整的单元注释支持以及对写入VML的控件的支持。

话虽如此,我还没有使用Open XML SDK,我不能说是否有可能添加注释。 我只是认为这可能会帮助你指出正确的方向。

http://openxmldeveloper.org/forums/thread/7396.aspx&#x4E0A; ,似乎有一个代码示例,它显示了如何创build必需的VML绘图。 我正在尝试这个代码,似乎已经取得了进展,但我还是得到某种未指定的错误,其中Excel决定在打开之前删除注释…