Question Comment insérer une date dans une feuille de calcul Open XML?


J'utilise Microsoft Open XML SDK 2 et j'ai beaucoup de mal à insérer une date dans une cellule. Je peux insérer des numéros sans problème en définissant Cell.DataType = CellValues.Number, mais quand je fais la même chose avec une date (Cell.DataType = CellValues.Date) Excel 2010 se bloque (2007 aussi).

J'ai essayé de régler le Cell.Text valeur à de nombreux formats de date ainsi que le format de date / numérique Excel en vain. J'ai également essayé d'utiliser des styles, en supprimant l'attribut type, ainsi que de nombreuses autres pizzas que j'ai lancées au mur ...

Quelqu'un peut-il me diriger vers un exemple en insérant une date dans une feuille de calcul?


12
2018-05-07 23:50


origine


Réponses:


Vous devez convertir DateTime à double en utilisant la fonction ToOADate c'est à dire.:

DateTime dtValue = DateTime.Now;
string strValue = dtValue.ToOADate().ToString(CultureInfo.InvariantCulture);

puis le définir comme CellValue

Cell cell;
cell.DataType = new EnumValue<CellValues>(CellValues.Date);
cell.CellValue = new CellValue(strValue);

N'oubliez pas de formater la cellule en utilisant DateTime le formatage, sinon vous verrez double valeur, pas la date.


9
2018-05-31 07:37



J'ai utilisé le code fourni par Andrew J, mais le DataType  CellValues.Date produit un fichier xlsx corrompu pour moi.

le DataType  CellValues.Number a bien fonctionné pour moi (N'oubliez pas de mettre NumberFormatId):

cell.DataType = new EnumValue<CellValues>(CellValues.Number);

Tout mon code:

DateTime valueDate = DateTime.Now;
string valueString = valueDate.ToOADate().ToString();
CellValue cellValue = new CellValue(valueString);

Cell cell = new Cell();
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.StyleIndex = yourStyle; //StyleIndex of CellFormat cfBaseDate -> See below
cell.Append(cellValue);

ma CellFormat pour cette cellule dans la feuille de style ressemble à:

CellFormat cfBaseDate = new CellFormat() { 
 ApplyNumberFormat = true,
 NumberFormatId = 14, //14 is a localized short Date (d/m/yyyy) -> See list below
 //Some further styling parameters
}; 

Si vous souhaitez formater votre date autrement, voici une liste de tous les fichiers Excel par défaut. NumberFormatId's

ID CODE FORMAT
0 Général
dix
2 0.00
3 #, ## 0
4 #, ## 0.00
9 0%
10 0.00%
11 0.00E + 00
12 #? /?
13 # ?? / ??
14 j / m / aaaa
15 d-mmm-yy
16 mm
17 mmm-aa
18 h: mm tt
19 h: mm: ss tt
20 H: mm
21 H: mm: ss
22 m / j / aaaa H: mm
37 #, ## 0; (#, ## 0)
38 #, ## 0; [Rouge] (#, ## 0)
39 #, ## 0.00; (#, ## 0.00)
40 #, ## 0.00; [Rouge] (#, ## 0.00)
45 mm: ss
46 [h]: mm: ss
47 mmss.0
48 ## 0.0E + 0
49 @

Source de la liste: http://closedxml.codeplex.com/wikipage?title=NumberFormatId%20Lookup%20Table

Je sais que cette liste provient de ClosedXML, mais c'est la même chose avec OpenXML.


20
2018-01-24 10:36



Lors de la création de nouveaux SpreadsheetDocument à partir de zéro, pour Date mise en forme pour travailler, minimale Stylesheet doit être créé.

Critique sont ces quelques lignes:

new CellFormat
{
    NumberFormatId = 14,
    ApplyNumberFormat = true
})

Plein Stylesheet classe:

using (var spreadSheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook))
{
    // Workbook
    var workbookPart = spreadSheet.AddWorkbookPart();
    workbookPart.Workbook =
        new Workbook(new Sheets(new Sheet { Name = "Sheet1", SheetId = (UInt32Value) 1U, Id = "rId1" }));

    // Add minimal Stylesheet
    var stylesPart = spreadSheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
    stylesPart.Stylesheet = new Stylesheet
    {
        Fonts = new Fonts(new Font()),
        Fills = new Fills(new Fill()),
        Borders = new Borders(new Border()),
        CellStyleFormats = new CellStyleFormats(new CellFormat()),
        CellFormats =
            new CellFormats(
                new CellFormat(),
                new CellFormat
                {
                    NumberFormatId = 14,
                    ApplyNumberFormat = true
                })
    };

    // Continue creating `WorksheetPart`...

Après Stylesheet est ajouté, DateTime peut être formaté:

if (valueType == typeof(DateTime))
{
    DateTime date = (DateTime)value;
    cell.CellValue = new CellValue(date.ToOADate().ToString(CultureInfo.InvariantCulture));

    // "StyleIndex" is "1", because "NumberFormatId=14"
    // is in the 2nd item of `CellFormats` array.
    cell.StyleIndex = 1; 
}

Notez que StyleIndex la valeur dépend de l'ordre de CellFormat articles dans le CellFormats tableau ou le Stylesheet objet. Dans cet exemple NumberFormatId = 14 élément sur le 2ème élément du tableau.


11
2017-08-07 09:49



Il existe deux façons de stocker des dates dans OpenXml; en écrivant un numéro (en utilisant ToOADate) et la mise en DataType à Number ou en écrivant un ISO 8601 date formatée et réglage du DataType à Date. Notez que la valeur par défaut DataType est Number donc si vous allez avec la première option, vous n'avez pas à définir le DataType.

Quelle que soit la méthode que vous choisissez, vous devrez définir le style car Excel affiche les deux méthodes de manière identique. Le code suivant montre un exemple d’écriture d’une date à l’aide du Number format (avec et sans paramétrage explicite de la DataType) et en utilisant le format ISO 8601.

using (SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
    //fluff to generate the workbook etc
    WorkbookPart workbookPart = document.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet();

    Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());

    Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet" };
    sheets.Append(sheet);

    workbookPart.Workbook.Save();

    var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

    //add the style
    Stylesheet styleSheet = new Stylesheet();

    CellFormat cf = new CellFormat();
    cf.NumberFormatId = 14;
    cf.ApplyNumberFormat = true;

    CellFormats cfs = new CellFormats();
    cfs.Append(cf);
    styleSheet.CellFormats = cfs;

    styleSheet.Borders = new Borders();
    styleSheet.Borders.Append(new Border());
    styleSheet.Fills = new Fills();
    styleSheet.Fills.Append(new Fill());
    styleSheet.Fonts = new Fonts();
    styleSheet.Fonts.Append(new Font());

    workbookPart.AddNewPart<WorkbookStylesPart>();
    workbookPart.WorkbookStylesPart.Stylesheet = styleSheet;

    CellStyles css = new CellStyles();
    CellStyle cs = new CellStyle();
    cs.FormatId = 0;
    cs.BuiltinId = 0;
    css.Append(cs);
    css.Count = UInt32Value.FromUInt32((uint)css.ChildElements.Count);
    styleSheet.Append(css);

    Row row = new Row();

    DateTime date = new DateTime(2017, 6, 24);

    /*** Date code here ***/
    //write an OADate with type of Number
    Cell cell1 = new Cell();
    cell1.CellReference = "A1";
    cell1.CellValue = new CellValue(date.ToOADate().ToString());
    cell1.DataType = new EnumValue<CellValues>(CellValues.Number);
    cell1.StyleIndex = 0;
    row.Append(cell1);

    //write an OADate with no type (defaults to Number)
    Cell cell2 = new Cell();
    cell2.CellReference = "B1";
    cell2.CellValue = new CellValue(date.ToOADate().ToString());
    cell1.StyleIndex = 0;
    row.Append(cell2);

    //write an ISO 8601 date with type of Date
    Cell cell3 = new Cell();
    cell3.CellReference = "C1";
    cell3.CellValue = new CellValue(date.ToString("yyyy-MM-dd"));
    cell3.DataType = new EnumValue<CellValues>(CellValues.Date);
    cell1.StyleIndex = 0;
    row.Append(cell3);

    sheetData.AppendChild(row);

    worksheetPart.Worksheet.Save();
}

3
2018-06-20 19:36



Utiliser une chaîne partagée:

// assuming it's the first item in the shared string table
SharedStringItem sharedStringItem = new SharedStringItem();
Text text = new Text();
text.Text = DateTime.Today.ToString("MM/dd/yyyy hh:mm");
sharedStringTable1.Append(sharedStringItem);

Puis plus tard dans le code:

// assuming it's the first item in the shared string table
var cell = new Cell {CellReference = "A1", DataType = CellValues.SharedString};
var cellValue = new CellValue("0");
cell.Append(cellValue);

0
2018-06-07 20:37



Les éléments suivants ont fonctionné pour nous:

c.CellValue = new CellValue(datetimeValue).ToOADate().ToString());
c.DataType = CellValues.Number;
c.StyleIndex = StyleDate;

Définissez le DataType sur CellValues.Number, puis veillez à formater la cellule avec l'index de style approprié à partir des CellFormats. Dans notre cas, nous construisons une feuille de style dans la feuille de calcul et StyleDate est un index dans les CellFormats de la feuille de style.


0
2017-10-01 19:28