2009-02-26 8 views
2

Ich versuche, Zellen in einer Excel 2007-Tabelle Kommentare hinzuzufügen. Ich verwende das OpenXml SDK 2.0 dazu.Erstellen von Zellkommentaren in einer Excel-Kalkulationstabelle mit OpenXML SDK

Mein Anwendungsfall ist dies: Ich habe eine Vorlage Excel-Datei erstellt, die ich kopieren und verwenden, dass als Ausgangspunkt, anstatt ein OpenXML-Dokument von Grund auf neu erstellen. Meine Vorlage Datei hat einen Kommentar in Zelle A1, so dass Excel bereits ein WorksheetCommentPart für mich erstellt hat.

Jetzt ist mein Problem, dass, wenn ich Kommentarkommentare zum Kommentarteil hinzufüge, die Tabelle nicht lädt und Excel fragt, ob ich wiederherstellen möchte.

Was mich wirklich stört ist, dass mein ursprünglicher Kommentar in A1 immer noch da ist, aber alle Kommentare, die ich programmatisch hinzugefügt habe, sind weg!

Hier ist der Code Ich arbeite mit:

mit (Memory 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(); 

}

Und „CreateUserDataRow“ erstellt eine neue Reihe, aber der relevante Teil ist (wobei „Kommentar“ ist mein Kommentar Zeichenfolge und „c“ ist mein Handy, dass ich über den Kommentar erstellen möchten): sehen

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); 
} 

nun so weit mein Auge, und KDiff3 was das betrifft, meine Dateien sind so ziemlich identisch mit den Dateien, die ausgegeben werden würde, wenn ich Excel öffnen waren und setzen Sie die Kommentare in die Zellen von Hand in Excel.

Hat jemand ein gutes Beispiel für das Hinzufügen eines Kommentars zu einer Zelle mit OpenXml? Gibt es etwas, was ich über eine Beziehung wissen sollte? Hat es etwas mit der Verwendung einer Excel-Datei zu tun, die ich erstellt habe und die ich dann als Vorlage verwende (vielleicht sind einige Dimensionen nicht gesetzt)?

Danke für jede Hilfe, die ich bekommen kann.

Antwort

2

Leider ist es nicht so einfach.

Zellkommentare haben auch ein Grafikobjekt, das sich in einem VML-Zeichnungsteil befindet. VML ist eine kryptische Legacy-Spezifikation und entspricht nicht dem anerkannten ECMA-Standard. Sie können die Dokumentation in Microsoft Open XML-Dokumenten finden, aber es ist nicht schön. Ich hoffe, Microsoft wird dies in Excel 14 durch Hinzufügen vollständiger Zellkommentar-Unterstützung sowie Unterstützung für Steuerelemente, die ebenfalls in VML geschrieben sind, behandeln.

Allerdings habe ich das Open XML SDK nicht verwendet und ich kann nicht sagen, ob es möglich ist, Kommentare hinzuzufügen. Ich dachte nur, das würde dir helfen, in die richtige Richtung zu zeigen.

+0

Huch. Nun, zumindest weiß ich, wo ich jetzt hinschaue. Es macht Sinn, wenn Sie jetzt die VML-Datei in meiner Tabelle betrachten. Danke. –

+0

Das ist richtig. Das Hinzufügen von Kommentaren erfordert das Hinzufügen von VML.Beachten Sie auch, wenn Sie VML hinzufügen und die Elemente * nicht genau wie Excel nummerieren/beschriften, werden sie neu nummeriert/umbenannt, was später die Tabelle beschädigt und crash excel = Yuk! –

0

Es scheint ein Codebeispiel bei http://openxmldeveloper.org/forums/thread/7396.aspx zu sein, das zeigt, wie die erforderliche VML-Zeichnung erstellt wird. Ich probiere diesen Code jetzt aus und habe Fortschritte gemacht, obwohl ich immer noch eine Art unspezifizierten Fehler erhalte, bei dem Excel entscheidet, die Kommentare vor dem Öffnen zu löschen ...

Verwandte Themen