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