IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[OLEDB et Excel][C#] Lignes vides manquantes lors de le lecture d'un fichier Excel


Sujet :

Accès aux données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut [OLEDB et Excel][C#] Lignes vides manquantes lors de le lecture d'un fichier Excel
    Bonjour à tous,

    J'ai un petit souci lorsque je lis un fichier Excel (.xls) avec OLEDB. Si mon fichier à ses premières lignes vides, alors je ne les récupère pas dans le dataTable correspondant.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
                    DataSet ds = new DataSet();
                    string connectionString = GetConnectionString(filePath, firstLineAsHeader);
     
                    using (OleDbConnection conn = new OleDbConnection(connectionString))
                    {
                        conn.Open();
                        OleDbCommand cmd = new OleDbCommand();
                        cmd.Connection = conn;
     
                        DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); // Get all Sheets in Excel File
                        DataTable dt = null;
                        OleDbDataAdapter da = null;
                        string sheetName = string.Empty;
     
                        // Loop through all Sheets to get data
                        foreach (DataRow dr in dtSheet.Rows)
                        {
                            sheetName = dr["TABLE_NAME"].ToString();
                            if (!sheetName.EndsWith("$")) // Les feuilles excel se termine toujours par un '$'
                                continue;
     
                            cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; // Get all rows from the Sheet
                            dt = new DataTable(sheetName);
                            da = new OleDbDataAdapter(cmd);
                            da.Fill(dt);
                            ds.Tables.Add(dt);
                        }
     
                        cmd = null;
                        conn.Close();
                    }
    Avec la connectionString = Provider=Microsoft.ACE.OLEDB.12.0;Data Source=FullPathToFile.xls;Extended Properties="Excel 12.0 XML;IMEX=1;HDR=No"

    Etant donné que je récupère les données du fichier en fonction des cellules indiquées depuis un fichier de config, j'ai des décalages dans le dataTable.
    Est-ce que quelqu'un sait s'il faut indiquer un paramètre supplémentaire dans la connection string pour avoir toutes les lignes, ou si le problème vient dans ma manière de charger le dataTable.

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    Il me semble que l'on peut définir la zone sur laquelle on veut faire le select.
    Pour ça il faut quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM [" + sheetName + "$" + range + "]"
    ou range pourrait par exemple valoir A1:AB120.

    Cela dit pas sur que ça corrige ton soucis, à tester.

    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse mais malheureusement ça ne fonctionne pas en ajoutant le range dans le select.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Arff !

    Je m'en doutais mais il n'y avait qu'une façon d'en être sur.

    Toujours pas de solution toute faite mais da.Fill(..) à une signature qui permet de donner l'index de départ apparemment...

    Si ça ne résolut pas ton souci je ferais quelques tests ça m’intéresse aussi.

    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Testé en speed avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    da.Fill(0 ,99999, dt);
    mais sans résultat (https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx)

    Je prospecte encore...

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je suis plus adepte de VB.net que de C# et je n'ai pas regardé les liens fournis (peut-être que j'aurais dû), mais, as-tu essayé avec une plage nommée qui inclut toutes tes lignes, incluant tes lignes vides "nécessaires", mais pas plus pas moins, comme nom de table à interroger.

    J'ai plutôt tendance à ne pas trop laisser Excel deviner.

    Sinon, tu peux aussi aller voir par là, d'un coup...

    http://www.connectionstrings.com/excel/
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    J'ai fait quelques tests mais rien à faire il ignore les premières lignes si elles sont totalement vides.
    J'ai remarqué que si il y a des données dans ces lignes et ce même en dehors de la zone du select (j'ai du texte en E1 mais je select sur A150 par exemple) alors les lignes sont remontées vides.
    Du coup un simple espace en A1 te permettra de remonter toutes les lignes... et fera une super rustine bien moche !

    Un lien qui ne m'a pas beaucoup aidé.

    Bon code.
    J@ck
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bon je n'ai rien trouver d'autre non plus. J'avais déjà essayé de jouer avec le paramètre "TypeGuessRows=0" dans la chaine de connexion et directement dans la base de registre, mais sans résultat.
    Merci pour les réponses et les liens en tout cas.
    Comme je récupère les fichiers excel depuis une machine de mesure, le nombre de lignes vides en début de fichier est toujours le même, donc je joue la carte du bricolage moche :
    j'ai ajouté un paramètre dans mon fichier de config pour indiquer le nombre de lignes vides et je décale ensuite l'index de ligne en fonction de cette valeur...

Discussions similaires

  1. erreur lors de la lecture d'un fichier Excel par un executable
    Par maracujadobrasil dans le forum MATLAB
    Réponses: 19
    Dernier message: 12/12/2013, 11h59
  2. Cellule vide lors de la lecture d'un fichier Excel par OLEDB
    Par seb.49 dans le forum Framework .NET
    Réponses: 4
    Dernier message: 06/02/2010, 18h52
  3. Performance lors de la lecture d'un fichier excel
    Par Acarp47 dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/08/2007, 19h18
  4. import gros fichier excel (>17000 lignes)
    Par samuelsiffert dans le forum Access
    Réponses: 12
    Dernier message: 05/07/2006, 08h48
  5. Réponses: 14
    Dernier message: 30/03/2005, 21h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo