web-dev-qa-db-fra.com

Comment rendre le format de date correct lors de l'écriture de données dans Excel

J'exporte un DataTable vers un fichier Excel à l'aide de office interop. Le problème est que Excel ne reconnaît pas les dates en tant que telles, mais affiche des chiffres. Dans un autre cas, je passe une chaîne qu’il reconnaît ensuite comme une date. Dans les deux cas, les données sont perturbées.

J'ai essayé NumberFormat @, qui est supposé stocker la cellule au format texte, mais cela n'a pas fonctionné non plus.

Application app = new Application();
app.Visible = false;
app.ScreenUpdating = false;
app.DisplayAlerts = false;
app.EnableAnimations = false;
app.EnableAutoComplete = false;
app.EnableSound = false;
app.EnableTipWizard = false;
app.ErrorCheckingOptions.BackgroundChecking = false; 

Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];

for (int j = 0; j < dt.Rows.Count; j++)
{
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        Range rng = ws.Cells[j+2, i+1]as Range;
        rng.Value2 = dt.Rows[j][i].ToString();
        rng.NumberFormat = "@";
    }   
}           

wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
       Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

wb.Close(false, Missing.Value, Missing.Value);            

app.Workbooks.Close();
app.Application.Quit();
app.Quit();    
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
ws = null;
wb = null;
app = null;
GC.Collect();

Pourquoi mon NumberFormat @ ne fonctionne-t-il pas? Textformat ne devrait-il pas tout afficher de la même manière que je l'ai mis?

33
codymanix

Avez-vous essayé de formater la colonne entière en tant que colonne de date? Quelque chose comme ça:

Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";

Vous pouvez également essayer de mettre une coche avant l'expression de chaîne avant de charger le texte dans la cellule Excel (vous ne savez pas si cela compte ou non, mais cela fonctionne lorsque vous tapez du texte directement dans une cellule).

34
dcp

Essayez d'utiliser

DateTime.ToOADate()

Et mettre cela comme un double dans la cellule. Il pourrait y avoir des problèmes avec Excel sur les systèmes Mac (il utilise une date/heure différente -> double conversion), mais cela devrait bien fonctionner dans la plupart des cas. 

J'espère que cela t'aides.

9
Assaf

Cela a fonctionné pour moi:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");

Notez la coche ajoutée avant la date.

2
Versatile

Je sais que cette question est ancienne, mais peupler Excell Cells avec Dates via VSTO a quelques pièges.

J'ai trouvé que les formules ne fonctionnaient pas avec les dates au format aaaa-mmm-jj - même si les cellules étaient au format de date! Vous devez traduire les dates au format jj/mm/aaaa pour les utiliser dans les formules.

Par exemple, les dates que je reçois de SQL Analysis Server et je devais les retourner puis les formater:

using (var dateRn = xlApp.Range["A1"].WithComCleanup())
{
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy");
}


using (var rn = xlApp.Range["A1:A10"].WithComCleanup())
{
    rn.Resource.Select();
    rn.Resource.NumberFormat =  "d-mmm-yyyy;@";
}

Sinon, la formule utilisant Dates ne fonctionne pas - la formule dans la cellule C4 est identique à C3:

enter image description here

2
Jeremy Thompson

Ancienne question mais toujours d'actualité. J'ai généré un dictionnaire qui obtient le format de date/heure approprié pour chaque région, voici la classe d'assistance que j'ai générée:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW c'est comme ça que je suis allé à ce sujet:

  1. ouvert Excel, saisissez manuellement une date/heure dans la première cellule d'un classeur
  2. ouvert la boîte de dialogue des régions dans le panneau de configuration
  3. utilisé Spy pour connaître les HWND de la liste déroulante des régions et le bouton Appliquer afin que je puisse utiliser SetForegroundWindow et SendKey pour changer de région (impossible de trouver comment changer de région via l'API Windows)
  4. itéré dans toutes les régions et pour chaque région, il a demandé à Excel de saisir le format NumberFormat de la cellule contenant la date et a sauvegardé ces données dans un fichier
1
anakic

J'espère que cette aide

private bool isDate(Range cell)
    {
        if (cell.NumberFormat.ToString().Contains("/yy"))
        {
            return true;
        }
        return false;
    }

isDate(worksheet.Cells[irow, icol])
0
Vo Tran Hai Anh

Pour formater par code Date dans les cellules Excel, essayez ceci:

Excel.Range rg = (Excel.Range)xlWorkSheet.Cells[numberRow, numberColumn];

rg.NumberFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

Après cela, vous pouvez définir la valeur DateTime sur une cellule spécifique.

xlWorkSheet.Cells[numberRow, numberColumn] = myDate;

Si vous voulez définir une colonne entière, essayez ceci: Excel.Range rg = (Excel.Range) xlWorkSheet.Cells [numberRow, numberColumn];

rg.EntireColumn.NumberFormat = 
    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
0
daniele3004

Cela a fonctionné pour moi:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");
0
Jorge Baldárrago