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.