Création de commentaires de cellules dans une feuille de calcul Excel avec OpenXML SDK

StackOverflow https://stackoverflow.com/questions/592189

  •  09-09-2019
  •  | 
  •  

Question

Je suis en train d'ajouter des commentaires à des cellules dans une feuille de calcul Excel 2007. J'utilise le SDK 2.0 OpenXml de le faire.

Mon cas d'utilisation est la suivante: J'ai créé un modèle de fichier Excel que copier et l'utiliser comme mon point de départ, plutôt que de créer un document OpenXML à partir de zéro. Mon fichier modèle a un commentaire dans la cellule A1 de sorte que Excel a déjà créé un WorksheetCommentPart pour moi.

Maintenant, mon problème est que lorsque j'ajouter 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 que mon commentaire original en A1 est toujours là, mais tous les commentaires que j'ajouté sont partis programme!

Voici le code que je travaille avec:

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

}

« 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, en ce que mon œil 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 par la main dans Excel.

Quelqu'un at-il un bon exemple d'attacher un commentaire à une cellule avec OpenXml? Y at-il quelque chose que je devrais savoir peut-être une relation? At-il quelque chose à voir avec l'aide d'un fichier Excel que j'ai créé et je suis en utilisant comme modèle (peut-être certaines dimensions ne sont pas définies)?

Merci pour toute aide que je peux obtenir.

Était-ce utile?

La solution

Malheureusement, ce n'est pas aussi simple que cela.

commentaires cellulaires ont également un objet graphique qui se trouve dans une partie de dessin VML. VML est une spécification de l'héritage cryptique et ne sont pas dans la norme ECMA approuvée. Vous trouverez la documentation sur elle dans les documents Open XML de Microsoft, mais ce n'est pas assez. Espérons que Microsoft traitera dans Excel 14 en ajoutant un support complet de commentaire cellulaire ainsi que le support pour les contrôles qui sont également écrites à VML.

Cela dit, je ne l'ai pas utilisé le SDK Open XML et je ne peux pas dire si oui ou non il est possible d'ajouter des commentaires avec elle. Je pensais juste que cela pourrait vous aider à fait dans la bonne direction.

Autres conseils

Il semble y avoir un exemple de code http://openxmldeveloper.org/forums/thread /7396.aspx qui montre comment créer la condition VML Dessin. J'essaie maintenant de ce code, et semblent avoir progressé, bien que je suis toujours obtenir une sorte d'erreur non spécifiée dans lequel Excel décide de laisser tomber les commentaires avant d'ouvrir ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top