我正在尝试在Excel 2007电子表格中为单元格添加注释。我正在使用OpenXml SDK 2.0来实现这一目标。
我的用例是这样的: 我创建了一个模板Excel文件,我将其复制并用作我的起点,而不是从头开始创建OpenXML文档。我的模板文件在单元格A1中有注释,因此Excel已经为我创建了一个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”会创建一个新行,但相关部分是(其中“comment”是我的注释字符串,而“c”是我要创建注释的单元格):
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中手动将注释放入单元格时输出的文件完全相同。 / p>
有没有人有一个很好的例子,可以使用OpenXml将注释附加到单元格?关于某种关系,我应该知道些什么吗?是否与使用我创建的Excel文件有关,然后我将其用作模板(可能没有设置某些尺寸)?
感谢您的帮助。
答案 0 :(得分:2)
不幸的是,事情并非那么简单。
单元格注释还有一个图形对象,它位于VML绘图部分。 VML是一个神秘的遗留规范,不在批准的ECMA标准中。您可以在Microsoft的Open XML文档中找到有关它的文档,但它并不漂亮。希望Microsoft能够在Excel 14中通过添加完整的单元格注释支持以及对也写入VML的控件的支持来解决这个问题。
话虽如此,我还没有使用Open XML SDK,我不能说是否可以用它添加注释。我只是觉得这可能会帮助你指出正确的方向。
答案 1 :(得分:0)
http://openxmldeveloper.org/forums/thread/7396.aspx处似乎有一个代码示例,展示了如何创建必需的VML绘图。我现在正在尝试使用此代码,并且似乎已经取得了进展,但我仍然遇到某种未指定的错误,其中Excel决定在打开之前删除注释...