none
Open Xml : XLInsertNumberIntoCell et nombres décimaux RRS feed

  • Question

  • Bonjour à tous,

    Je commence à utiliser le SDK Open Xml et plus particulièrement les Snippets dédiés à Excel et tout va bien tant qu'il s'agit d'ajouter des valeurs de type String ou int, mais dès qu'il s'agit de valeurs décimales, là rien ne va plus. J'ai modifié la méthode XLInsertNumberIntoCell() pour lui passer un decimal (j'ai essayé aussi avec un double), je n'ai pas de problème pour l'écriture, mais lorsque j'ouvre le classeur Excel, j'ai un message m'indiquant qu'il est corrompu et de cliquer sur Oui pour le réparer. Cela fonctionne mais les valeurs insérées ne sont pas prises comme des nombres mais comme du texte.

    Donc ma question est la suivante :

    comment insérer dans une cellule une valeur de type décimale en utilisant Open Xml ?

    Merci à tous,

    Alain


    lundi 23 juillet 2012 14:11

Réponses

  • Bonjour,

    pour éviter les problème liée au séparateur décimal lors de la convertion en chaine, préciser que celle ci ne doit pas tenir compte de la culture :

    theCell.CellValue = new CellValue(value.ToString(CultureInfo.InvariantCulture));
    Cordialement
    mardi 24 juillet 2012 13:42
    Modérateur

Toutes les réponses

  • Bonjour,

    Pouvez-vous nous montrer le code qui pose problème ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 23 juillet 2012 22:05
    Modérateur
  • Bonjour,

    Tout d'abord, merci de vous intéresser à mon problème, voici le code en question :

        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                this.XLInsertStringIntoCell("E:/SIO1.xlsx", "Notes", "A3", "Dupont");
                double nb = 15.25D;
                this.XLInsertNumberIntoCell("E:/SIO1.xlsx", "Notes", "B3", nb);
            }

            public bool XLInsertNumberIntoCell(string fileName, string sheetName, string addressName, double value)
            {
                // Given a file, a sheet, and a cell, insert a specified value.
                // For example: InsertNumberIntoCell("C:\Test.xlsx", "Sheet3", "C3", 14)
                // Assume failure.
                bool returnValue = false;
                // Open the document for editing.
                using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, true))
                {
                    WorkbookPart wbPart = document.WorkbookPart;
                    Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
                      Where(s => s.Name == sheetName).FirstOrDefault();
                    if (theSheet != null)
                    {
                        Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(theSheet.Id))).Worksheet;
                        Cell theCell = InsertCellInWorksheet(ws, addressName);
                        // Set the value of cell A1.
                        theCell.CellValue = new CellValue(value.ToString());
                        theCell.DataType = new EnumValue<CellValues>(CellValues.Number);
                        // Save the worksheet.
                        ws.Save();
                        returnValue = true;
                    }
                }
                return returnValue;
            }

    Remarque : je n'ai rien inventé, je n'ai fait que modifier le Snippet fourni par Microsoft. Autre information, j'ai pensé au problème de la marque décimale qui est la virgule en France, j'ai donc modifié cette marque dans Excel pour la remplacer par le point, mais rien n'y a fait.

    Merci pour votre aide.

    Alain

    P.S. : copie d'écran de la récupération du classeur Excel
    mardi 24 juillet 2012 06:09
  • Bonjour,

    pour éviter les problème liée au séparateur décimal lors de la convertion en chaine, préciser que celle ci ne doit pas tenir compte de la culture :

    theCell.CellValue = new CellValue(value.ToString(CultureInfo.InvariantCulture));
    Cordialement
    mardi 24 juillet 2012 13:42
    Modérateur
  • Bonjour,

    Effectivement c'est bon.

    Merci pour votre aide,

    Alain

    mardi 24 juillet 2012 15:37