Comment faire le format de date correct lors de l'écriture de données à Excel

IAM exporte une donnée vers un fichier Excel en utilisant office interop. Le problème est que Excel ne reconnaît pas les dates comme telles, mais affiche plutôt des nombres. Dans un autre cas, je passe une chaîne de caractères qu'elle reconnaît comme date. Dans les deux cas, les données sont foiré.

j'ai essayé NumberFormat @ qui est censé stocker la cellule en format texte, mais ça 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 numéro ne fonctionne-t-il pas? Ne devrait pas Textformat Tout afficher le même que je l'ai mis dans?

31
demandé sur imsome1 2010-07-22 19:55:33

7 réponses

avez-vous essayé de formater la colonne entière comme une colonne de date? Quelque chose comme ceci:

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

l'autre chose que vous pourriez essayer serait de mettre une simple tique avant l'expression de chaîne de caractères avant de charger le texte dans la cellule Excel (pas sûr si cela importe ou pas, mais cela fonctionne quand vous tapez le texte directement dans une cellule).

34
répondu dcp 2010-07-22 16:34:08

Essayez d'utiliser

DateTime.ToOADate()

le plaçant comme un double dans la cellule. Il pourrait y avoir des problèmes avec Excel sur les systèmes Mac (il utilise une datetime différente-->double conversion), mais il devrait bien fonctionner pour la plupart des cas.

Espérons que cette aide.

7
répondu Assaf 2010-07-22 16:02:20

je sais que cette question Est ancienne mais peupler des cellules Excell avec des Dates via VSTO a quelques gotchas.

J'ai trouvé que les formules ne fonctionnent pas sur les dates avec format AAAA-mmm-JJ-même si les cellules étaient en format DATE! Vous devez traduire les Dates en format JJ / mm / AAAA pour les utiliser dans les formules.

par exemple les dates que je reçois reviennent de SQL Analysis Server et j'ai dû les retourner et 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 les formules utilisant des Dates ne fonctionnent pas - la formule dans la cellule C4 est la même que C3:

enter image description here

2
répondu Jeremy Thompson 2012-12-06 03:37:28

vieille question mais toujours pertinente. J'ai créé un dictionnaire qui obtient le format datetime approprié pour chaque région, voici la classe helper que j'ai générée:

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

FWIW c'est la façon dont je suis allé à ce sujet:

  1. ouvert excel, entré manuellement une datetime dans la première cellule d'un classeur
  2. ouverture de la boîte de dialogue régions dans le contrôle panneau
  3. utilisé Spy pour trouver les HWND des régions combobox et le bouton apply de sorte que je puisse utiliser SetForegroundWindow et SendKey pour changer la région (ne pouvait pas trouver comment changer la région à travers L'API Windows)
  4. itérated à travers toutes les régions et pour chaque région demandé Excel pour le Numéroformat de la cellule qui contenait la date, a enregistré ces données dans un fichier
1
répondu anakic 2016-05-15 10:35:59

Cela a fonctionné pour moi:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");
0
répondu Jorge Baldárrago 2016-12-06 22:05:07

Cela a fonctionné pour moi:

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

notez la marque de tique ajoutée avant la date.

0
répondu Versatile 2017-04-21 15:45:34

formater par le code de Date dans des 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 à la cellule spécifique

xlWorkSheet.Cells[numberRow, numberColumn] = myDate;

si vous voulez mettre la colonne entière essayez ceci: Excel.Portée rg = (Excel.Range) xlWorkSheet.Cells[numberRow, numberColumn];

rg.EntireColumn.NumberFormat = 
    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
0
répondu daniele3004 2018-07-02 07:20:09