2009-02-26 96 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

相關問題