Я пытаюсь добавить комментарии к ячейкам в электронной таблице 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» создает новую строку, но с соответствующей частью (где «комментарий» - это моя строка комментария, а «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.
Есть ли у кого-нибудь хороший пример прикрепления комментария к ячейке с помощью OpenXml? Есть ли что-то, что я должен знать об отношениях? Это как-то связано с использованием файла Excel, который я создал, а затем использую в качестве шаблона (возможно, некоторые размеры не заданы)?
Спасибо за любую помощь, которую я могу получить.