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.

Pranav
la source

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);
Mikael Svenson
la source
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
13

Vous pouvez peut-être essayer d'utiliser la DateTime.FromOADateméthode de conversion entre Excel et .net.

À M
la source
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");
Développeur logiciel Yashwant
la source
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

rsapru
la source
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
Thomas
la source
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

joXin
la source
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

Kasim Husaini
la source
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;
}
dbardakov
la source