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.
Huch. Nun, zumindest weiß ich, wo ich jetzt hinschaue. Es macht Sinn, wenn Sie jetzt die VML-Datei in meiner Tabelle betrachten. Danke. –
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! –