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?
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).
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.
Cela a fonctionné pour moi:
sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");
Notez la coche ajoutée avant la date.
Je sais que cette question est ancienne, mais peupler Excell Cells avec Dates via VSTO a quelques pièges.
Le formatage de la colonne entière ne fonctionnait pas pour moi ET.
Même cette approche de Microsoft n'a pas fonctionné: http://msdn.Microsoft.com/en-us/library/Microsoft.office.tools.Excel.namedrange.numberformat.aspx
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:
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:
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])
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;
Cela a fonctionné pour moi:
hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");