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

C# Discussion :

AutomationExcel: nombre de colonnes variable


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut AutomationExcel: nombre de colonnes variable
    Bonjour à tous, j'ai un problème avec la lecture de fichiers Excel à l'aide de l'automationExcel.

    Je m'explique, je dois traiter une feuille dont le nombre de colonnes est variable (2 pour les 5 premières lignes puis 16 pour les centaines de lignes restantes). Le problème que je rencontre est que excel reader définit le nombre de colonnes de toute la feuille comme étant le nombre de colonnes de la première ligne (soit 2 colonnes dans mon cas). Et lorsque je parcours tout le fichier (en utilisant la fonction string[] ReadLine() ) pour extraire certaines valeurs (appartenant à la colonne 13 par exemple), j'ai le bug classique "index out of bounds", logique vu que pour excel reader la feuille ne comporte que deux colonnes...

    Est-il possible de faire en sorte que le nombre de colonnes ne soit plus défini comme étant égal au nombre de colonnes de la première ligne mais le max du nombre de colonnes pour toutes les lignes de la feuille? (J'ai commencé à regarder si cela était faisable facilement et je n'ai pas l'impression mais je ne suis pas non plus expert DOT.NET).
    Ou si quelqu'un connait un moyen de zapper les lignes du début (celles qui ne possèdent que deux colonnes) car je n'en ai pas besoin pour mon traitement mais je ne peux pas les supprimer manuellement non plus car le programme est à destination d'un client qui ne veut pas avoir à faire de modification sauvage sur ses fichiers sources pour que le programme fonctionne.

    J'espère avoir été le plus clair possible et je remercie d'avance ceux qui vont lire mon sujet et tenter de m'apporter de l'aide. Je résume mon problème d'une autre manière

    Bonne continuation

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Salut,

    Si ce n'est pas déjà fait, tu devras intégrer les sources du projet AutomationExcel à ta solution pour pouvoir modifier les sources à ta guise.

    Dans ton cas, une solution simple serait d'affecter 16 directement dans la méthode SetWorksheetAttributes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void SetWorksheetAttributes()
    {
        // Les attributs spécifiques à la feuille sont :
        // - Le nombre de lignes :
        this.m_RowCount = this.GetRowCount(1, this.m_Worksheet.Rows.Count, (int)Math.Ceiling((double)((this.m_Worksheet.Rows.Count - 1) / 2)));
        this.m_RowIndex = 1;
        // - Le nombre de colonnes :
        this.m_ColumnCount = 16;
        this.m_ColumnIndex = 1;
    }
    Une solution plus complexe consiste à faire appel aux coordonnées de la cellule spéciale Excel représentant la dernière cellule renseignée du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.m_ColumnCount = this.m_Worksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Column

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Ouais merci de ta réponse Skalp, j'avais bien intégré les sources d'AutomationExcel à ma solution, et bien situer le problème du this.m_ColumnCount mais je ne peux pas non plus écrire 16 en dur car j'aurai différents types de feuilles excel en entrée donc le reder doit s'adapter.

    La solution que j'ai trouvé (elle, n'est peut-être pas optimale, on peut en discuter) est de modifier les méthodes private void SetWorksheetAttributes() et private int GetColumnCount(....) comme ci dessous

    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
            private void SetWorksheetAttributes()
            {
                // Les attributs spécifiques à la feuille sont :
                // - Le nombre de lignes :
                this.m_RowCount = this.GetRowCount(1, this.m_Worksheet.Rows.Count, (int)Math.Ceiling((double)((this.m_Worksheet.Rows.Count - 1) / 2)));
                this.m_RowIndex = 1;
                // - Le nombre de colonnes :
                int columncount=0;
                for (int i = 1; i < this.m_RowCount; i++)
                {
                    columncount = this.GetColumnCount(i,1, this.m_Worksheet.Columns.Count, (int)Math.Ceiling((double)((this.m_Worksheet.Columns.Count - 1) / 2)));
                    if (columncount > this.m_ColumnCount) this.m_ColumnCount = columncount;
                }
                this.m_ColumnIndex = 1;
            }

    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
    private int GetColumnCount(int i, int FirstColumnIndex, int LastColumnIndex, int MiddleColumnIndex)
            {
     
                if ((Range)this.m_Worksheet.Cells[i, MiddleColumnIndex] != null &&
                    ((Range)this.m_Worksheet.Cells[i, MiddleColumnIndex]).Value2 != null)
                {
                    if ((Range)this.m_Worksheet.Cells[i, MiddleColumnIndex + 1] != null &&
                        ((Range)this.m_Worksheet.Cells[i, MiddleColumnIndex + 1]).Value2 == null)
                    {
     
     
                            // La ligne suivante n'est pas renseignée, le résultat est :
                            return MiddleColumnIndex;
     
                    }
                    else
                    {
                        // La ligne suivante est renseignée, rechercher dans l'intervalle supérieur :
                        return GetColumnCount(i,MiddleColumnIndex, LastColumnIndex, (int)Math.Ceiling((double)(MiddleColumnIndex + ((LastColumnIndex - MiddleColumnIndex) / 2))));
                    }
                }
                else
                {
                    // La ligne n'est pas renseignée, rechercher dans l'intervalle inférieur :
                    return GetColumnCount(i,FirstColumnIndex, MiddleColumnIndex, (int)Math.Ceiling((double)(FirstColumnIndex + ((MiddleColumnIndex - FirstColumnIndex) / 2))));
                }
     
            }
    En clair je parcours la feuille ligne par ligne et je conserve le nombre de colonnes max (calculé pour chaque ligne désormais et non plus uniquement pour la première).

    J'ai donc rajouté un paramètre pour la méthode GetColumnCount symbolisant la ligne en cours.

    Voilà, si il y'a plus beau, plus propre et/ou moins gourmand en ressources je prend.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. BULK INSERT et nombre de colonnes variable
    Par hannii dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 20/07/2009, 20h02
  2. Tableau avec un nombre de colonne variable
    Par HoB dans le forum VBScript
    Réponses: 12
    Dernier message: 17/01/2008, 11h06
  3. Affichage avec un nombre de colonnes variable
    Par sebaaas dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/10/2007, 19h53
  4. SELECT avec un nombre de colonnes variable
    Par sorcer1 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/09/2007, 21h58
  5. [Etat]Nombre de colonnes variables dans un état
    Par milou161185 dans le forum IHM
    Réponses: 15
    Dernier message: 27/03/2007, 16h39

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