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

Visual C++ Discussion :

De Excel 2007 => Visual C++


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par défaut De Excel 2007 => Visual C++
    Bonjour ¡

    Je m’intéresse au C++ et aux stats et à la modélisation financière.

    Je souhaite utiliser Excel 2007 comme source de séries historiques (de prix … ) , je pourrai alors manipuler ces données avec C++ (j’utilise Visual C++ Express 2010). (NON ! je ne souhaite pas faire autrement ;-) )

    J’ai lu différentes choses sur le sujet et d’autres pas tout à fait sur le sujet (les livres de Steve Dalton sur les add-ins et autres développements pour Excel). Mais je me pose toujours des tas de questions.

    Je ne souhaite pas compliquer dans un premier, en créant l’interface COM.
    Je pense lire mes données dans Excel et les importer sous forme de vectors.

    Le fichier Excel que je souhaite lire, pour la démo s’appelle : C:\Users\Édouard\Desktop\test.xlsx
    Son contenu, 3 colonnes (à partir de ‘A1’):

    2 6 6
    2 2 4
    3 4 4
    5 4 5
    3 4 1
    6 1 2
    2 3 8
    9 5 8
    1 7 7


    Voici le début de mon code (le tout début pourra être utile à d’autres … ) :

    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
    #include <iostream>
    #include <fstream>
    #include<stdio.h>
    #include <cstdlib>
    #include <vector>
     
    using namespace std;
     
    // Microsoft Office Objects
    #import \
    "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll" \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    rename("RGB", "RBGXL")
     
    using namespace Office;
     
    // Microsoft VBA Objects
    #import \
    "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\vbe6ext.olb"
     
    using namespace VBIDE;
     
    // Excel Application Objects
    #import \
    "C:\Program Files\Microsoft Office\OFFICE12\EXCEL.EXE" \
    rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    rename("ReplaceText", "ReplaceTextXL") \
    rename("CopyFile", "CopyFileXL") \
    exclude("IFont", "IPicture") no_dual_interfaces
     
     
    // convertir les ranges excel en vectors
    vector<double>ExcelRangeTovector(Excel::RangePtr pRange)
    {
         // obtenir le colonnes et les lignes utilisées
         int columns=pRange->Columns->Count;
         int rows=pRange->Rows->Count;
     
         // création du vecteur à la bonne taille
         vector<double> v(columns*rows);
     
         // boucle pour remplir le vecteur
         int index=0;
         for (int r=1; r<=rows; r++)
         {
              for (int c=1; c<=columns; c++)
              {
                   // remplir le vector
                   v[index++]=(((Excel::RangePtr) pRange->Item[r][c])->Value).dblVal;
              }
         }
     
         // obtenir le vector
         return v;
    }

    A partir de ceci, qui rassemble les idées tirées de plusieurs ressources sur internet.

    Je me demande dans quelle mesure (jusqu’à où ?) il faut pointer dans ma feuille Excel. Je ne sais pas non plus s’il est nécessaire d’ ‘activer’ . Enfin, je ne parviens pas à bien utiliser la classe ExcelRangeTovector écrite au-dessus.

    Le début de ma main est comme ceci :

    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
    int main ()
    {
    //try
    //	{
    	//initialisation interface COM
    	CoInitialize(NULL);
    	//Pointeur vers Excel 2007
    	Excel::_ApplicationPtr XL;
    	//Session d’excel
    	XL.CreateInstance(L"Excel.Application");
    	//Excel visible ?
    	XL->Visible = false;
    	// pointeur vers le fichier Excel désiré
    	XL->Workbooks->Open(L"C:\\Users\\Édouard\\Desktop\\test.xlsx");
    	//pointeur vers la première worksheet
    	Excel::_WorksheetPtr pSheet = XL->Sheets->Item[1];
    	// Activation de la 1ère feuille
    	pSheet->Activate();
    	// Pointeur vers les cellules sur la feuille active (ici, la 1ère)
    	Excel::RangePtr pRange = pSheet->Cells;
    	pSheet->Activate();
    	// obtenir le vector dans c++ ???
    	
     …. C’EST LÀ QUE JE NE PARVIENS PAS À MES FINS !!!  COMMENT OBTENIR EFFECTIVEMENT LES CELLULES EXCEL DANS UN VECTEUR ??? COMMENT AFFICHER LE VECTEUR À L’ÉCRAN (COMMENT UTILISER COUT ? ?
    
    
    
    	// Quitter l’application
    	xl->Quit();
    	}
    	//si erreur, le faire savoir !
    	catch(_com_error &error)
    	}
    }

    Quelqu’un aurait-il des idées ?
    Quelqu’un pourrait-il expliquer pédagogiqument ?

    Merci
    Edouard.

  2. #2
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Bonjour
    Je peux t'aider pédagogiquement
    mais ça sera un peu long
    Veux-tu?

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par défaut oui !
    oui oui, je suis preneur de vos explications. en fait, je souhaite bien comprendre comment le transfert excel => visual c++ . j'espère que çà ne vous prendra pas trop de votre temps. merci.

  4. #4
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Es-tu famillier avec les MFC?

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par défaut ...
    j'ai lu sur le sujet et pratiqué peu ..
    je tourne avec la version express de visual c++ .
    tout ce qui est ATL et MFC est plutôt limité (à moins de bidouiller avec DDK de microsoft, mais çà devient compliqué ...)

  6. #6
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Bien, mon intervention sera un peu limité mais commence par ajouter deux petits fichiers à ton projet.

    Le fichier OfficeImport.h
    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
    125
    126
     
    // Define this according to the Microsoft Office Object Model version you are compiling under
    //#define OFFICE14				// MS Office 2010
    //#define OFFICE12				// MS Office 2007
    //#define OFFICE11				// MS Office 2003
    //#define OFFICE10				// MS Office 2002
    //#define OFFICE9				// MS Office 2000
    //#define OFFICE8				// MS Office 1997
     
    #if defined(OFFICE14)	// Office 2010
     
    #ifndef FRA
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "D:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #else
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OFFICE14\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Fichiers communs\\Microsoft Shared\\OFFICE14\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #endif
     
    #elif defined(OFFICE12)	// Office 2007
     
    #ifndef FRA
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "D:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE12\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #else
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OFFICE12\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Fichiers communs\\Microsoft Shared\\OFFICE12\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #endif
     
    #elif defined(OFFICE11)	// Office 2003
     
    #ifndef FRA
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #else
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OFFICE11\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Fichiers communs\\Microsoft Shared\\OFFICE11\\mso.dll" \
    			rename_namespace("Office") \
    			auto_rename
    	#endif
    #endif
     
    #elif defined(OFFICE10) // Office 2002
     
    #ifndef FRA
    	#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE10\\mso.dll" \
    		rename_namespace("Office"), rename("DocumentProperties", "DocProps")
    #else
    	#import "C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OFFICE10\\mso.dll" \
    		rename_namespace("Office"), rename("DocumentProperties", "DocProps")
    #endif
     
    #elif defined(OFFICE9)	// Office 2000
    	#import "C:\\Program Files\\Microsoft Office\\Office\\mso9.dll" \
    		rename_namespace("Office"), rename("DocumentProperties", "DocProps")
     
    #elif defined (OFFICE8) // Office 1997
    	#import "C:\\Program Files\\Microsoft Office\\Office\\mso97.dll" \
    		rename_namespace("Office"), rename("DocumentProperties", "DocProps")
     
    #endif // OFFICE12
     
    #if defined(VBA6)	// VBA 6
     
    #ifndef FRA
    	#ifndef Program_Files_x86
    		#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" \
    			rename_namespace("VBA") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" \
    			rename_namespace("VBA") \
    			auto_rename
    	#endif	
    #else
    	#ifndef Program_Files_x8
    		#import "C:\\Program Files\\Fichiers communs\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" \
    			rename_namespace("VBA") \
    			auto_rename
    	#else
    		#import "C:\\Program Files (x86)\\Fichiers communs\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" \
    			rename_namespace("VBA") \
    			auto_rename
    	#endif
    #endif
     
    #endif // VBA6
    et le fichier ExcelImport.h
    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
     
    // Define this according to the Excel Object Model version you are compiling under
    //#define EXCEL14				// Excel 2010
    //#define EXCEL12				// Excel 2007
    //#define EXCEL11				// Excel 2003
    //#define EXCEL10				// Excel 2002
    //#define EXCEL9				// Excel 2000
    //#define EXCEL8				// Excel 1997
     
    //#pragma warning(disable:4146)
     
    #define EXCEL_APPLICATION	"Excel.Application"
     
    #if defined(EXCEL14) // Excel 2010
     
    #define EXCEL_APPLICATION_2010	"Excel.Application.14"
    #define OFFICE14
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #ifndef Program_Files_x86
    	#import "C:\\Program Files\\Microsoft Office\\OFFICE14\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #else
    	#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE14\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #endif
     
    #elif defined(EXCEL12) // Excel 2007
     
    #define EXCEL_APPLICATION_2007	"Excel.Application.12"
    #define OFFICE12
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #ifndef Program_Files_x86
    	#import "C:\\Program Files\\Microsoft Office\\OFFICE12\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #else
    	#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE12\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #endif
     
    #elif defined(EXCEL11) // Excel 2003
     
    #define EXCEL_APPLICATION_2003	"Excel.Application.11"
    #define OFFICE11
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #ifndef Program_Files_x86
    	#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #else
    	#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\Excel.EXE" \
    		rename_namespace("Excel") \
    		auto_rename \
    		include("IFont", "IPicture")
    #endif
     
    #elif defined(EXCEL10) // Excel 2002
     
    #define EXCEL_APPLICATION_2002	"Excel.Application.10"
    #define OFFICE10
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #import "C:\\Program Files\\Microsoft Office\\OFFICE10\\Excel.EXE" \
    	rename_namespace("Excel") \
    	auto_rename
     
    #elif defined(EXCEL9) // Excel 2000
     
    #define EXCEL_APPLICATION_2000	"Excel.Application.9"
    #define OFFICE9
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #import "C:\\Program Files\\Microsoft Office\\Office\\Excel9.olb" \
    	rename_namespace("Excel") \
    	auto_rename
     
    #elif defined(EXCEL8) // Excel 1997
     
    #define EXCEL_APPLICATION_1997	"Excel.Application.8"
    #define OFFICE8
    #define VBA6
    #include "..\Aks.Office\OfficeImport.h"
     
    #import "C:\\Program Files\\Microsoft Office\\Office\\Excel8.olb" \
    	rename_namespace("Excel") \
    	auto_rename
     
    #endif // EXCEL12
     
    //#pragma warning(default:4146)
    Ces deux fichiers doivent dans un premier tant te permettre de référencer la bonne version d'excel que tu souhaites utiliser.

    Fais correspond les path avec ce que tu as chez toi de l'installation de ton MS Office

    Le fichier ExcelImport fait référence au fichier OfficeImport vérfie donc aussi le path approprié

    Si tu es prêt signale moi

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/12/2019, 13h16
  2. Réponses: 7
    Dernier message: 01/06/2013, 06h50
  3. Réponses: 0
    Dernier message: 13/05/2013, 16h21
  4. Faire fonctionner des objets d'Excel 2007 sur Excel 2003 ?
    Par brunoperel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/12/2006, 20h52
  5. D'Excel à Access par Visual Basic 6.0
    Par moane dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/04/2006, 17h25

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