2009-04-03 9 views
1

J'ai un certain code de lecture de fichier Excel qui utilise le OLEDB (Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;) qui fonctionne bien mais je rencontre toujours un problème où certaines dates sont renvoyées comme DBNull.Excel DateTime étant retourné comme DBNull

Dans le document XLS original, le format des dates qui travaillent (en-GB locale) sont:

"02/04/2009 17:00:00" // returned as a System.DateTime 

Et l'échec style suivant:

"08/Jan/09 11:24 AM" // returned as DBNull 

Excel sait qu'ils sont tous les deux dates (bien que je ne peux pas les forcer à style correctement) comme suit montre correctement une date:

=DATE(YEAR(c),MONTH(c),DAY(c)) // where c = cell reference. 

Y at-il un moyen, sans altérer l'original généré automatiquement, pour obtenir les données?


EDIT pour référence, voici ma méthode de lecture de données (en supposant un dbAdapter est déjà mis en place - notez le DBNull ne vient pas de la prise qui n'est pas tiré du tout):

public List<List<string>> GetData(string tableName, int maxColumns) 
    { 
     List<List<string>> rows = new List<List<string>>(); 

     DataSet ExcelDataSet = new DataSet(); 
     dbCommand.CommandText = @"SELECT * FROM [" + tableName + "]"; 
     dbAdapter.Fill(ExcelDataSet); 

     DataTable table = ExcelDataSet.Tables[0]; 

     foreach (DataRow row in table.Rows) 
     { 
      List<string> data = new List<string>(); 

      for (int column = 0; column < maxColumns; column++) 
      { 
       try 
       { 
        data.Add(row[column].ToString()); 
       } 
       catch (Exception) 
       { 
        data.Add(null); 
       } 
      } 

      // Stop processing at first blank row 
      if (string.IsNullOrEmpty(data[0])) break; 
      rows.Add(data); 
     } 

     return rows; 
    } 
+0

Comment exactement obtenez-vous les dates du document XLS? Pourriez-vous poster un extrait de code afin que nous puissions voir ce que vous faites? –

Répondre

2

Je ne sais pas si cela sera utile ou non, mais je rencontrer des problèmes avec le code Excel OLEDB retour NULLs où j'attendais données et presque toujours revenu à un problème d'inférence de type de données. Excel détermine le type de données d'une colonne en fonction des x premières lignes de données (je pense que x = 10, pourrait être faux). Je sais que vous ne voulez pas modifier le fichier, mais il peut être utile d'essayer de placer le style de date du problème dans les 10 premières lignes et de voir s'il modifie le comportement de votre application.

De toute évidence, si cela le résout, cela ne résout pas votre problème. Les seules corrections dans ce cas que je connais sont de modifier le fichier (mettre quelque chose dans les 10 premières lignes qui l'oblige à utiliser le type de données correct). Désolé je ne peux pas offrir une meilleure solution, mais j'espère au moins que je vous aide à comprendre ce qui cause votre problème.

+0

En effet, cela fait une différence, car il est arrivé les données avant le 23 Janvier utilisé un format et les données par la suite. La modification de l'ordre des données causait toujours une erreur au point de commutation des données (mais avec le commutateur dans l'autre sens). Il se peut que je doive utiliser CSV à la place ... –

+0

Si vous modifiez le fichier d'origine IS en option, vous pouvez placer une valeur de chaîne évidente dans la colonne (en haut), forçant ainsi la colonne à analyser en tant que chaîne. Puis convertir en DateTime vous-même dans le code. Pas la meilleure option, mais cela fonctionne ... –

+0

Non, pas une option. J'essaie de créer un système de rapports à utiliser par des personnes non techniques et ils vont se tromper. Je suis passé à l'analyse syntaxique en tant que Csv (automatisation d'Excel pour la conversion) et peut, comme vous le dites, analyser le texte directement. –

Questions connexes