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

Contribuez .NET Discussion :

Ecrire un fichier XLS sans utiliser Excel [Sources]


Sujet :

Contribuez .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut Ecrire un fichier XLS sans utiliser Excel
    Bonjour à tous .

    J'ai fait quelques recherche rapide sur le sujet et je n'ai pas trouver de tutorial explicite à ce sujet (mais honte sur moi j'ai pas chercher beaucoup ).

    Voici donc un petit code permettant de crée des fichiers XLS lisible sous excel sans pour autant avoir excel installé sur la machine de l'utilisateur final.
    Le fichier XLS est ensuite parfaitement lisible par excel mais, petit bémol, pas par open office qui le considère comme un fichier XML Oo.

    pour ce faire, il est nécessaire d'utiliser une DLL codée par Carlos Aguilar Mares, elle est gratuite et disponible sur la page de l'auteur.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut L'écriture
    Je commence avec le gros morceau: la création du fichier et l'écriture de la première page:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
            internal static void WriteXlsFile(BackgroundWorker pWorker, string pFileName, DataTable pValueDT, DataTable pInfoDT)
            {
                Workbook Book = new CarlosAg.ExcelXmlWriter.Workbook(); 
     
                WorksheetStyle NormalStyle = Book.Styles.Add("Normal");
                WorksheetStyle BoldStyle = Book.Styles.Add("Bold");
                BoldStyle.Font.Bold = true;
     
                Worksheet InfoSheets = Book.Worksheets.Add("Information"); 
     
                InfoSheets.Table.Rows.Add();
                foreach (DataRow myDR in pInfoDT.Rows)
                {
                    WorksheetRow Row = new WorksheetRow();
                    for (int i = 0; i < pInfoDT.Columns.Count; i++)
                    {
                        Row.Cells.Add(myDR[i].ToString(), DataType.String, "Normal");
                    }
                    InfoSheets.Table.Rows.Add(Row);
                }
     
     
                Worksheet ValueSheets = Book.Worksheets.Add("Nom");
     
                WorksheetRow WRow = new WorksheetRow();
     
                pWorker.ReportProgress(40);
     
                foreach (DataColumn myDC in pValueDT.Columns)
                {
                    WRow.Cells.Add(myDC.ColumnName, DataType.String, "Bold");
                }
                ValueSheets.Table.Rows.Add(WRow);
     
     
                pWorker.ReportProgress(60);
     
                foreach (DataRow myDR in pValueDT.Rows)
                {
                    WorksheetRow Row = new WorksheetRow();
                    for (int i = 0; i < pValueDT.Columns.Count; i++)
                    {
                        Row.Cells.Add(myDR[i].ToString());
                    }
                    ValueSheets.Table.Rows.Add(Row);
                }
     
                try
                {
                    Book.Save(pFileName + @".Xls");
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.ReadOnly);
                    pWorker.ReportProgress(80);
                    return ReadXlsFile(pFileName);
                }
                catch (Exception Ex)
                {
     
                    throw Ex;
                }
            }
    La fonction prend plusieurs paramètre en entrée:
    - Un background worker: la fonction pouvant prendre au mieux 5 secondes de traitement, il permet d'éviter de figer votre UI (plus d'information à ce sujet: ici )
    - Un string contenant le nom du fichier.
    - Un datatable contenant les valeurs de la feuille à ajouter.
    - Un datatable contenant les informations (page de garde etc)

    Alors décorticage du code ^^:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbook Book = new CarlosAg.ExcelXmlWriter.Workbook();
    Création du nouveau classeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WorksheetStyle NormalStyle = Book.Styles.Add("Normal");
                WorksheetStyle BoldStyle = Book.Styles.Add("Bold");
                BoldStyle.Font.Bold = true;
    Définition des styles d'écriture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet InfoSheets = Book.Worksheets.Add("Information");
    Création de la feuille (nomée ici "information" puisqu'elle va contenir la page... d'information, merci ceux qui suive )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    InfoSheets.Table.Rows.Add();
                foreach (DataRow myDR in pInfoDT.Rows)
                {
                    WorksheetRow Row = new WorksheetRow();
                    for (int i = 0; i < pInfoDT.Columns.Count; i++)
                    {
                        Row.Cells.Add(myDR[i].ToString(), DataType.String, "Normal");
                    }
                    InfoSheets.Table.Rows.Add(Row);
                }
    Je saute une ligne qui, dans les autres feuille, est la ligne des titres.
    Ensuite viens deux boucle imbriquée, la boucle intérieur ajoute toutes les cellules dans la ligne (Row). La boucle extérieur quand à elle, crée puis ajoute la Row remplie par la boucle intérieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     WorksheetRow WRow = new WorksheetRow();
     
                pWorker.ReportProgress(40);
     
                foreach (DataColumn myDC in pValueDT.Columns)
                {
                    WRow.Cells.Add(myDC.ColumnName, DataType.String, "Bold");
                }
                ValueSheets.Table.Rows.Add(WRow);
    Cette boucle crée la ligne des titres de la page en cours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try
                {
                    Book.Save(pFileName + @".Xls");
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.ReadOnly);
                    pWorker.ReportProgress(80);
                }
                catch (Exception Ex)
                {
     
                    throw Ex;
                }
    Cela sauve le fichier et le passe en "lecture seule" afin de limité les modifications extérieur.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Ensuite voici la mise à jour d'un fichier existant:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    internal static Void WriteXlsFile(BackgroundWorker pWorker, string pFileName, DataTable pValueDT)
            {
                Workbook TamponBook = new Workbook();//Creates a stamp book
     
                WorksheetStyle NormalStyle = TamponBook.Styles.Add("Normal");
                WorksheetStyle BoldStyle = TamponBook.Styles.Add("Bold");
                BoldStyle.Font.Bold = true;
     
                Worksheet ValueSheets = TamponBook.Worksheets.Add("Nom");
     
                WorksheetRow WRow = new WorksheetRow();
     
                foreach (DataColumn myDC in pValueDT.Columns)
                {
                    WRow.Cells.Add(myDC.ColumnName, DataType.String, "Bold");
                }
                ValueSheets.Table.Rows.Add(WRow);
     
                pWorker.ReportProgress(40);
     
                foreach (DataRow myDR in pValueDT.Rows)
                {
                    WorksheetRow Row = new WorksheetRow();
                    for (int i = 0; i < pValueDT.Columns.Count; i++)
                    {
                        Row.Cells.Add(myDR[i].ToString(), DataType.String, "Normal");
                    }
                    ValueSheets.Table.Rows.Add(Row);
                }
     
                pWorker.ReportProgress(60);
     
                Workbook Book = new Workbook();
                Book.Load(pFileName + @".Xls");
                Book.Worksheets.Insert(1, ValueSheets);
     
                try
                {
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.Normal);
                    Book.Save(pFileName + @".Xls");
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.ReadOnly);
                    pWorker.ReportProgress(80);
                    return ReadXlsFile(pFileName);
                }
                catch (Exception Ex)
                {
                    throw Ex;
                }
            }
    Ce code est pratiquement le même que celui du dessus à quelques détail prés:

    Une feuille "tampon" est crée et c'est sur cette feuille que seront chargé les données.

    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
    Workbook Book = new Workbook();
                Book.Load(pFileName + @".Xls");
                Book.Worksheets.Insert(1, ValueSheets);
     
                try
                {
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.Normal);
                    Book.Save(pFileName + @".Xls");
                    File.SetAttributes(pFileName + @".Xls", FileAttributes.ReadOnly);
                    pWorker.ReportProgress(80);
                    return ReadXlsFile(pFileName);
                }
                catch (Exception Ex)
                {
                    throw Ex;
                }
            }
    Le classeur est crée et charge le fichier existant et puis il insert la feuille tampon (en deuxième place, toujours ).
    Il est possible de changer la place de la fueille dans le ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Book.Worksheets.Insert(1, ValueSheets);
    le chiffre étant la page précédant la page insérée.

    Je repasse évidemment le fichier en lecture/écriture avant de sauvegarder.


    ATTENTION!

    les parties de code qui définissent le nom de la feuille
    dois à chaque fois contenir une valeur différente car deux feuilles ne peuvent pas avoir le même nom.


    Voila, je pensai également ajouter la lecture du fichier avec cette DLL mais le code que j'ai utiliser est brouillon et pas très propre donc je préfère m'abstenir pour le moment, je reviendrai dessus un peu plus tard .

    Bonne lecture et n'hésiter pas à commenter/corriger.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  4. #4
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    euh...en fait, je viens d'ecrire un article contenant entre autres un bout de code faisant ca, mais oriente asp.net, et sans trop creuser (et pis il est pas encore publie, alors... )

    Niveau remarques, je ne trouve pas la fonction ReadXlsFile (dommage, elle est utilisee partout), et tu as un pb de coherence dans le nommage de tes variables (qui devraient toutes etre en camelCase)


    Sinon, a quand un article ?

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 62
    Points
    62
    Par défaut
    Effectivement, c'est une erreur de ma part, normalement ReadXML devrai lire le contenu du fichier XLS malheureusement j'ai oublier de la retirer quand j'ai copier/coller le code :s . Je corrigerai ça sous peu .

    Effectivement j'ai un peu mélanger Camel et Pascal case , je repasserai dessus en même temps que mes corrections (mais pas ce soir :s).

    Maintenant pour ce qui est de ton article, je ne pense pas que les deux vont se gêner car il me semble que l'ASP travaille différemment. Dans tout les cas je ne vais pas venir pleurer parce qu'on a copier une partie de mon code dans un autre article, tant que le dis article est la pour aider la communauté.

    Et à la question " A quand l'article?" Ben ca faut voir avec un des rédacteurs C#

    Voilou.
    Entre la culture des perles fines et ceux qui perlent l'inculture, un point commun domine : c'est le QI de l'huître !

  6. #6
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Maintenant pour ce qui est de ton article, je ne pense pas que les deux vont se gêner car il me semble que l'ASP travaille différemment. Dans tout les cas je ne vais pas venir pleurer parce qu'on a copier une partie de mon code dans un autre article, tant que le dis article est la pour aider la communauté.
    Je te rassure, si c'est le cas, ce serait plus de l'ordre de la coïncidence que du plagiat

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

Discussions similaires

  1. Macro Excel, verifier si un fichier existe sans utiliser Dir(Path)
    Par choji5 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/05/2013, 15h51
  2. Ouvrir un fichier xls sans Microsoft Excel
    Par Spoot dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/12/2009, 21h14
  3. Lire une fichier XLS sans excel
    Par petitcoucou31 dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 06/10/2008, 15h03
  4. Manipulation de fichier .XLS sans Excel
    Par kergoussel dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 04/07/2007, 17h12
  5. [VBA-E] ouvrir un fichier .xls sans executer les macro
    Par lae_t2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2003, 17h07

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