2009-02-26 65 views
2

我试图向Excel 2007电子表格中的单元格添加注释。我正在使用OpenXml SDK 2.0来做到这一点。使用OpenXML SDK在Excel电子表格中创建单元格注释

我的用例是这样的: 我创建了一个模板Excel文件,我将它复制并用作我的出发点,而不是从头开始创建OpenXML文档。我的模板文件在单元格A1中有注释,因此Excel已经为我创建了一个WorksheetCommentPart。

现在我的问题是,当我添加评论节点到评论部分电子表格不加载和Excel问我是否想要恢复。

真正困扰我的是,我在A1中的原始评论仍然存在,但是我通过编程添加的任何评论都不见了!

这里是我的工作代码:

使用(MemoryStream的spreadsheetStream =新的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标准中。你可以在微软的Open XML文档中找到关于它的文档,但它并不漂亮。希望微软将在Excel 14中解决这个问题,方法是添加完整的单元注释支持以及对写入VML的控件的支持。

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

+0

Yikes。至少我知道现在应该去哪里看看。尽管现在查看电子表格中包含的VML文件,但这很有意义。 谢谢。 – 2009-02-27 21:17:13

相关问题