Lecture de la valeur Datetime à partir d'une feuille Excel


87

lorsque j'essaie de lire la valeur de type datetime à partir de la feuille Excel, il renvoie une valeur double.Par exemple, si vous souhaitez lire une valeur '2007-02-19 14:11:45.730'comme celle-ci, j'obtiens une valeur de type double. parce que je n'obtiens que cette valeur '2007-02-19 12:00:00 AM'
maintenant, je veux exactement la même valeur datetime que la première. Mon code est comme: -

TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);

  DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);

   arrrow2[cCnt - 1] = inputdate.ToString();

Veuillez aider !!! Merci.

Réponses:


222

Vous devez convertir le format de date d'OLE Automation au format .net à l'aide de DateTime.FromOADate.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

1
Seriez-vous également gentil de voter pour la réponse et de la marquer comme correcte?
Mikael Svenson

voter pour 15 points de réputation mais je n'en ai que 6 car je suis un nouvel utilisateur, mais j'ai marqué la réponse comme correcte
Pranav

4
+1 Il est clair que la restriction du vote favorable ne devrait pas s'appliquer à ses propres questions.
Mike Rosenblum

1
J'ai compris ça. Soulignant simplement que tout le monde ne serait pas d'accord avec vous, ce comportement est un bogue.
jwg

1
C'est le moyen le plus simple que j'ai trouvé. Merci.
Ashok


6

Lecture de la valeur Datetime à partir d'une feuille Excel: essayez ce sera le travail.

string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();

double date = double.Parse(sDate);

var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");

4
Au fait, en quoi votre code diffère de la réponse acceptée?
Pranav

Voté contre. Ceci est inefficace, car lorsque la cellule est une date, Value2renvoie une doublevaleur encadrée .
dbardakov

0

Ou vous pouvez simplement utiliser OleDbDataAdapter pour obtenir des données d'Excel


0

Sinon, si votre cellule est déjà une date réelle, utilisez simplement .Value au lieu de .Value2:

excelApp.Range[namedRange].Value
{21/02/2013 00:00:00}
    Date: {21/02/2013 00:00:00}
    Day: 21
    DayOfWeek: Thursday
    DayOfYear: 52
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 634970016000000000
    TimeOfDay: {00:00:00}
    Year: 2013

excelApp.Range[namedRange].Value2
41326.0

1
Je pense que c'est un peu plus compliqué que ça. Valuerenverra un DateTimesi vous avez écrit un DateTimeà Valuemais un doublesi vous avez écrit un DateTimeà Value2.
jwg

0

J'ai eu une situation similaire et j'ai utilisé le code ci-dessous pour que cela fonctionne.

Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);

Workbook workbook = new Workbook(fstream, loadOptions);

Worksheet worksheet = workbook.Worksheets[0];

dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);

DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();

foreach (DataColumn column in dtCloned.Columns)
{
    if (column.DataType == Type.GetType("System.DateTime"))
    {
        column.DataType = typeof(String);
        myAL.Add(column.ColumnName);
    }
}


foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}



foreach (string colName in myAL)
{
    dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
}


/*******************************/

public static class MyExtension
{
    public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
    {
        foreach (DataRow row in column.Table.Rows)
        {
            row[column] = conversion(row[column]);
        }
    }
}

J'espère que cela aidera certains1 thx_joxin


2
L'utilisation de cette réponse nécessite une licence et l'installation associée du produit Aspose.Cells. C'est un excellent produit, mais pas quelque chose auquel tous les développeurs ont accès.
Zarepheth

0

Vous voudrez peut-être essayer une fonction simple que j'ai publiée sur un autre fil lié à la lecture de la valeur de la date à partir d'une feuille Excel.

Il prend simplement le texte de la cellule en entrée et donne DateTime en sortie.

Je serais heureux de voir une amélioration dans mon exemple de code fourni au profit de la communauté de développement .Net.

Voici le lien pour le fil C # ne lisant pas la date Excel de la feuille de calcul


0

Une autre option: lorsque le type de cellule est inconnu au moment de la compilation et que la cellule est formatée comme Date Range.Valuerenvoie un DateTimeobjet souhaité .


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.