Создание комментариев к ячейкам в электронной таблице Excel с помощью OpenXML SDK - PullRequest
2 голосов
/ 26 февраля 2009

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

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

Ответы [ 2 ]

2 голосов
/ 27 февраля 2009

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

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

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

0 голосов
/ 02 декабря 2009

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

...