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 :

Création fichier Excel depuis DataSet avec OleDb


Sujet :

C#

  1. #1
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut Création fichier Excel depuis DataSet avec OleDb
    Bonjour,

    Je cherche à créer un fichier Excel à partir d'un DataSet. Ce DataSet contient les données suivantes :
    id | revenu
    -------------
    1 | 2
    2 | 5
    3 | 0
    4 | 7

    J'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    OleDbConnection connection = new OleDbConnection(paramConnexion);
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = new OleDbCommand("UPDATE [Feuil1$]", connection);
    OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
     
    connection.Open();
    adapter.Update(donnees, "Feuil1");
    connection.Close();
    avec paramConnexion = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + CHEMIN_EXCEL + "; Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"

    Le code compile et ne plante pas, mais il ne fait rien.
    Je pense qu'il y a un problème avec la requête "UPDATE [Feuil1$]", mais je ne comprend pas trop comment fonctionne la création de table sous Excel. J'ai trouvé beaucoup d'info pour la lecture de donnée dans un fichier Excel, mais pas grand chose sur l'écriture.
    Petite précision : Je sais qu'InterOp permet de manipuler plus facilement des fichiers Excel, mais niveau rapidité, OleDb est plus efficace.

  2. #2
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    Pour information j'ai trouvé la solution :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    #region Ecriture
     
    	/// <summary>
    	/// Écrit des données avec OleDb.
    	/// </summary>
    	/// <param name="paramConnexion">Les paramètres pour mapper la destination des données.</param>
    	/// <param name="table">Les données à écrire.</param>
    	private static void EcrireTableOleDb(string paramConnexion, System.Data.DataTable table)
    	{
    		try
    		{
    			/* Ouverture de la connexion */
    			OleDbConnection connexion = new OleDbConnection(paramConnexion);
    			connexion.Open();
     
    			/* Préparation de l'exécution des requêtes */
    			OleDbCommand commande = new OleDbCommand();
    			commande.Connection = connexion;
    			commande.CommandType = CommandType.Text;
     
    			/* Création de la structure des données */
    			commande.CommandText = TestBDToExcelForm.DonnerRequeteCreationExcel(table);
    			commande.ExecuteNonQuery();
     
    			/* Insertion des données par ligne */
    			foreach (DataRow ligne in table.Rows)
    			{
    				commande.CommandText = TestBDToExcelForm.DonnerRequeteInsertionExcel(
    					table.TableName, ligne);
    				commande.ExecuteNonQuery();
    			}
     
    			/* Fermeture de la connexion */
    			connexion.Close();
    		}
    		catch (Exception exception)
    		{
    			MessageBox.Show("Erreur EcrireDonneesOleDb : \n" + exception);
    		}
    	}
     
    #endregion
     
    #region Fonctions Excel
     
    	/// <summary>
    	/// Donne une requête pour Excel permettant de créer la table donnée.
    	/// </summary>
    	/// <param name="table">La table à créer.</param>
    	/// <returns></returns>
    	private static string DonnerRequeteCreationExcel(System.Data.DataTable table)
    	{
    		/* Variables locales */
    		string requete = null;
    		int index = -1;
     
    		/* Initialisation de la requête */
    		requete = "CREATE TABLE [" + table.TableName + "$] (";
     
    		/* Ajout des informations sur les champs */
    		foreach (DataColumn colonne in table.Columns)
    		{
    			/* Nom du champs */
    			requete += "[" + colonne.ColumnName + "] ";
     
    			/* Type du champs */
    			switch (colonne.DataType.Name)
    			{
    				case ("Int32"):
    					requete += "INTEGER";
    					break;
     
    				default:
    					requete += "VARCHAR(255)";
    					break;
    			}
     
    			/* Fin des informations sur le champs */
    			requete += ", ";
    		}
     
    		/* Retrait éventuel de ", " en trop */
    		index = requete.LastIndexOf(", ");
    		if (index == (requete.Length - 2))
    			requete = requete.Substring(0, index);
     
    		/* Finalisation de la requête */
    		requete += ")";
     
    		return requete;
    	}
     
    	/// <summary>
    	/// Donne une requête pour Excel permettant l'insertion d'une ligne donnée.
    	/// </summary>
    	/// <param name="nomTable">le nom de la table contenant la ligne.</param>
    	/// <param name="ligne">La ligne à ajouter.</param>
    	/// <returns></returns>
    	private static string DonnerRequeteInsertionExcel(string nomTable, DataRow ligne)
    	{
    		/* Variables locales */
    		string requete = null;
    		int index = -1;
     
    		/* Initialisation de la requête */
    		requete = "INSERT INTO [" + nomTable + "$] VALUES (";
     
    		/* Ajout des données de la ligne */
    		foreach (Object valeur in ligne.ItemArray)
    			requete += "'" + valeur.ToString() + "', ";
     
    		/* Retrait éventuel de ", " en trop */
    		index = requete.LastIndexOf(", ");
    		if (index == (requete.Length - 2))
    			requete = requete.Substring(0, index);
     
    		/* Finalisation de la requête */
    		requete += ")";
     
    		return requete;
    	}
     
    #endregion

  3. #3
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    Finalement le dernier code que j'avais donné pose un problème sur un environnement "US". Ce code fonctionne différemment sur un poste en français et US. En français tout va bien, par contre en US mes nombres à virgule posent problème, toutes les virgules disparaissent, et je me retrouve avec des nombres érronnés (FR 150,65 => US 15065, FR 10,5 => US 105).
    Je ne voit pas trop quoi faire, quelqu'un aurait une idée?

  4. #4
    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
    En US, il interprète les virgules comme des séparateurs de milliers (autant dire qu'il n'en tient pas compte). Le séparateur décimal est le point.

    Tu dois modifier la culture du thread pour la passer en "fr-FR". Il y a un exemple sur la msdn CultureInfo.CurrentCulture
    N'oublie pas de la remettre à sa valeur initiale, une fois que tu as terminé tes manipulations de données.

  5. #5
    Membre actif Avatar de djidane39
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 272
    Points : 250
    Points
    250
    Par défaut
    J'avais essayé ça, mais ça ne change pas grand chose, j'ai changer la culture, ainsi que le caractère délimiteur.
    J'ai de plus afficher ces informations sur mon serveur en FR et en US, et la culture est la même (comme j'utilise une platforme, je suppose qu'elle se charge déjà d'uniformiser ce point).
    En creusant un peu, je pense que ça vient d'OleDb et de sa façon de transférer des données d'un DataSet à Excel. Voici la commande qu'OleDb lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE [Situation_État_Lot$] ([usage] VARCHAR(255), [nb_lot] INT, [surface] FLOAT)
    INSERT INTO [Situation_État_Lot$] VALUES ('Habitations', '13', '1058,29')
    INSERT INTO [Situation_État_Lot$] VALUES ('Parkings', '0', '0')
    INSERT INTO [Situation_État_Lot$] VALUES ('Commerces', '0', '0')
    INSERT INTO [Situation_État_Lot$] VALUES ('Divers', '12', '39,09')
    Elle est la même sur le serveur US et FR, ce qui veut dire que mes infos sont bien interprété comme float avec les bonne virgule juste avant le passage DataSet => Excel.
    Ça ressemble à un problème de globalisation comme tu le dit, mais plutôt coté OleDb. Il y a des options de ce genre sur OleDb?

  6. #6
    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
    C'est peut-être aussi le format des données dans le fichier Excel.

Discussions similaires

  1. [XL-2013] Création fichier excel avec arborescence
    Par alex13880 dans le forum Excel
    Réponses: 3
    Dernier message: 27/03/2013, 14h31
  2. [AC-2010] Erreur création fichier Excel avec Workbooks.Add()
    Par Xorbane dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/06/2012, 22h00
  3. Création nouveau fichier excel depuis vba
    Par bossLINDROS dans le forum VBA Access
    Réponses: 7
    Dernier message: 11/04/2008, 15h31
  4. comment fermer un fichier Excel depuis Access?
    Par audrey_desgres dans le forum Access
    Réponses: 14
    Dernier message: 21/06/2005, 12h43
  5. Ouvrir un fichier excel depuis access
    Par ptitegrenouille dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 03/05/2005, 11h47

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