2009-02-26 8 views
2

Je tente d'ajouter des commentaires aux cellules dans une feuille de calcul Excel 2007. J'utilise OpenXml SDK 2.0 pour le faire.Création de commentaires de cellules dans une feuille de calcul Excel avec OpenXML SDK

Mon cas d'utilisation est le suivant: J'ai créé un modèle de fichier Excel que je copie et utilise comme point de départ, plutôt que de créer un document OpenXML à partir de zéro. Mon fichier de modèle a un commentaire dans la cellule A1 afin qu'Excel ait déjà créé un WorksheetCommentPart pour moi.

Maintenant, mon problème est que lorsque j'ajoute des nœuds de commentaires à la partie Commentaires, la feuille de calcul ne se charge pas et Excel demande si je veux récupérer. Ce qui me dérange vraiment, c'est que mon commentaire original dans A1 est toujours là, mais tous les commentaires que j'ai ajoutés par programmation ont disparu!

Voici le code que je travaille avec:

utilisant (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(); 

}

Et « CreateUserDataRow » crée une nouvelle ligne, mais la partie pertinente est (où « commentaire » est ma chaîne de commentaire et « c » est ma cellule que je veux créer le commentaire au sujet):

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

maintenant aussi loin que mon oeil peut voir, et KDiff3 pour cette question, mes fichiers sont à peu près identiques aux fichiers qui seraient sortie si je devais ouvrir Excel et mettre les commentaires dans les cellules à la main dans Excel.

Est-ce que quelqu'un a un bon exemple d'attacher un commentaire à une cellule avec OpenXml? Y a-t-il quelque chose que je devrais savoir au sujet d'une relation? Cela a-t-il quelque chose à voir avec l'utilisation d'un fichier Excel que j'ai créé et que j'utilise ensuite comme modèle (peut-être que certaines dimensions ne sont pas définies)?

Merci pour toute aide que je peux obtenir.

Répondre

2

Malheureusement, ce n'est pas si simple.

Les commentaires de cellule ont également un objet graphique qui se trouve dans une partie de dessin VML. VML est une spécification héritée cryptique et n'est pas dans la norme ECMA approuvée. Vous pouvez trouver de la documentation dans les documents Open XML de Microsoft, mais ce n'est pas joli. Espérons que Microsoft abordera cette question dans Excel 14 en ajoutant un support de commentaire sur les cellules complètes ainsi qu'un support pour les contrôles qui sont également écrits en VML. Cela dit, je n'ai pas utilisé le SDK Open XML et je ne peux pas dire s'il est possible ou non d'y ajouter des commentaires. Je pensais juste que cela pourrait vous aider à vous orienter dans la bonne direction.

+0

Yikes. Au moins, je sais où regarder maintenant. Il est logique de regarder le fichier VML inclus dans ma feuille de calcul. Merci. –

+0

Ceci est correct. L'ajout de commentaires nécessite l'ajout de VML.Notez également que si vous ajoutez du VML et que vous ne numérotez/n'étiquetez pas les éléments * exactement * comme le ferait Excel, ils renuméroteront/renommeront ceux-ci, ce qui corrompra la feuille de calcul et provoquera un crash excel = Yuk! –

0

Il semble y avoir un exemple de code à http://openxmldeveloper.org/forums/thread/7396.aspx qui montre comment créer le dessin VML requis. J'essaye ce code maintenant, et semble avoir progressé, bien que j'obtienne toujours une sorte d'erreur non spécifiée dans laquelle Excel décide de laisser tomber les commentaires avant l'ouverture ...

Questions connexes