Создание комментариев к ячейкам в электронной таблице Excel с помощью OpenXML SDK

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

Спасибо за любую помощь, которую я могу получить.

Ответов (2)

Решение

К сожалению, не все так просто.

Комментарии к ячейкам также имеют графический объект, который находится в части чертежа VML. VML - это загадочная устаревшая спецификация, не входящая в утвержденный стандарт ECMA. Вы можете найти документацию по нему в документах Microsoft Open XML, но это некрасиво. Надеюсь, Microsoft решит эту проблему в Excel 14, добавив полную поддержку комментариев к ячейкам, а также поддержку элементов управления, которые также записываются в VML.

При этом я не использовал Open XML SDK и не могу сказать, можно ли с его помощью добавлять комментарии. Я просто подумал, что это может помочь вам указать правильное направление.

Похоже, что на http://openxmldeveloper.org/forums/thread/7396.aspx есть образец кода, который показывает, как создать необходимый чертеж VML. Я пробую этот код сейчас, и, похоже, все в порядке, хотя я все еще получаю какую-то неопределенную ошибку, в которой Excel решает отбросить комментарии перед открытием ...