使用OpenXML SDK在Excel电子表格中创建单元格注释

我正在尝试向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文件有关,然后我将其用作模板(可能有些尺寸未设置)?

感谢您的帮助,我可以得到。


不幸的是,并不那么简单。

单元格注释还有一个图形对象,它位于VML绘图部分。 VML是一个神秘的遗留规范,不在批准的ECMA标准中。 你可以在微软的Open XML文档中找到关于它的文档,但它并不漂亮。 希望微软将在Excel 14中解决这个问题,方法是添加完整的单元注释支持以及对写入VML的控件的支持。

话虽如此,我还没有使用Open XML SDK,我不能说是否可以添加注释。 我只是认为这可能会帮助你指出正确的方向。


在http://openxmldeveloper.org/forums/thread/7396.aspx上似乎有一个代码示例,其中显示了如何创建必需的VML绘图。 我现在正在尝试这个代码,并且似乎已经取得了进展,尽管我仍然得到某种未指定的错误,其中Excel决定在打开之前删除注释...

链接地址: http://www.djcxy.com/p/52337.html

上一篇: Creating cell comments in an Excel Spreadsheet with OpenXML SDK

下一篇: selenium webdriver