AUTOMATION DE EXCEL ENTIEREMENT EN WIN32 ET SOUS FORME DE CLASSE

TOLLAI Messages postés 8 Date d'inscription mercredi 15 septembre 2004 Statut Membre Dernière intervention 11 octobre 2007 - 10 oct. 2007 à 17:03
antoine2641 Messages postés 1 Date d'inscription mardi 5 avril 2011 Statut Membre Dernière intervention 5 avril 2011 - 5 avril 2011 à 10:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44276-automation-de-excel-entierement-en-win32-et-sous-forme-de-classe

antoine2641 Messages postés 1 Date d'inscription mardi 5 avril 2011 Statut Membre Dernière intervention 5 avril 2011
5 avril 2011 à 10:23
Bonjour,

J'ai repris ce code qui est très utile et j'ai rajouté quelques fonctions, notamment pour formater les cellules.
Maintenant, j'aimerais pouvoir inserer une ligne dans un fichier mais je ne trouve pas la commande à fournir à la fonction Autowrap.
Si quelqu'un l'a déjà fait ou a une petite idée....

Merci d'avance !
A bientôt !
mcallan Messages postés 17 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 28 janvier 2011
28 janv. 2011 à 15:39
Bonjour,

Une idée pour appeler une Macro excel depuis ce code ?

bool MyExcel::RunMacro(char* macro) {
return false;
}

bool RunMacro(char *);//ne marche pas

Tres bon exemple ;)
cs_gerunt Messages postés 1 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 19 novembre 2010
19 nov. 2010 à 16:03
Bonjour,

Le programme fonctionne très bien chez moi. Cependant, si j'essaye de lire une valeur provenant d'une feuille excel "Protégée", le programme plante. J'imagine que des modifications apportées à la fonction Open de la classe MyExcel pourrait corriger le problème. Quelqu'un a-t-il une idée ? Merci de votre aide.
Utilisateur anonyme
6 juil. 2010 à 10:57
Bonjour, vos réponses m'ont bien aidé mais j'ai un autre problème, je veux par exemple ouvrir un fichier, récupérer certaines données pour ensuite les copier dans un autre fichier excel.
J'arrive à récupérer les données mais pas à les copier dans le deuxième fichier.

Voici un code simple pour montrer mon problème :

#include "windows.h"
#include "libexcel/excel.h"

void test1()
{
MyExcel Excel;
Excel.NewExcel();
Excel.SetVisible(true);
Excel.Open("C:\\Documents and Settings\\Administrateur\\Bureau\\test.xls");
Excel.Quit();
Excel.~MyExcel();
}

void test2()
{
MyExcel Excel;
Excel.NewExcel();
Excel.SetVisible(false);
Excel.Open("C:\\Documents and Settings\\Administrateur\\Bureau\\test.xls");
Excel.Quit();
Excel.~MyExcel();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
test1();
test2();
return 0;
}

Impossible d'utiliser test1 puis test2 l'un après l'autre, pourtant ils fonctionnent très bien séparément.

Si quelqu'un a trouvé un solution je suis preneur.
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
23 juin 2010 à 18:54
Sinon
char *test=(char*)malloc(sizeof(test)); (moins bien que avec New)
ou plus simplement
char test[255];
Utilisateur anonyme
23 juin 2010 à 11:05
Merci de m'avoir repondu, grâce a toi j'ai vraiment pu avancer.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
22 juin 2010 à 17:00
Bonjour Geochabi,
en fait ton pointeur est juste mal initialisé, essai:
char *test=new char[2];
Excel.GetData("A8",test);
puis tu libère ta mémoire
delete [] test;
Bon travail...
Utilisateur anonyme
21 juin 2010 à 10:54
Bonjour, YODDDD pourrais-tu m'aider, je n'arrive pas à stocker le résultat du Excel.GetData dans une variable.

Voici un extrait de mon code :

char *test = '\0';

//charge un fichier existant
Excel.Open(TruePath("\\test.xls"));

//selectionne la premiere feuille
Excel.GetWorksheet(1);

//on rempli certaines cases
Excel.SetData("A2:B3","ABCD");
Excel.SetData("A1","Titre");
Excel.GetData("A8", test);

Lorsque j'exécute le programme pas à pas, une fois arrivé sur le GetData je peux voir "Nom : test, Valeur : 0x00000000 incorrect". Et donc la fonction GetData me renvoie false, ce qui m'empêche de récupérer la valeur de la cellule.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
29 mai 2010 à 23:29
Bonsoir, ça y est! J'arrive à récupéré la valeur des cellules, vous aviez raison dès le départ, le problème n'était pas au niveau du code, plutôt de mon fichier. Je vous remercie énormément, je ferait gaffff prochainement à mes déclarations.
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
29 mai 2010 à 17:02
Désoler j'ai rien trouver pour corriger ton problème :(
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
29 mai 2010 à 16:34
Bonjour, alors Benjamin_31 et Snoopss,
Vous avez du nouveau concernant mon bug, je suis toujours au même point.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
25 mai 2010 à 18:24
Bonjour Benjamin_31
Pour le code je n'ai pas le droit, c'est confidentiel;
En fait je dois récupéré des données d'un classeur donné(exemple.xls), puis les stocker dans un fichier.txt, pour cela j'ai fait un essai avec la fonction GetData sur une cellule existante:

char *valeur='\0';

Excel.Open(TruePath("//exemple.xls"));

Excel.GetWorksheet(1);
Excel.GetData("B10",valeur);
ofstream fichier("fichier.txt",ios::out | ios::trunc");
if(fich)
{
fich << valeur << endl;
}
fich.close();
else
cerr << "Impossible d'ouvrir le fichier !" << endl;
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
25 mai 2010 à 17:23
Vive les long Week-end sans pc ^^

Désoler, je voit pas trop d'où peut venir ton problème. Mais je commence un nouveau projet avec la bibliothèque to day donc je vais regarder rapidement d'où ça pourrai venir.

Pourrait-tu aussi me montrer ton code sans modification ? si ça te dérange pas et que ça soit pas confidentiel.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
25 mai 2010 à 11:41
Bonjour Benjamin_31 et Snoopss,
Je suis toujours au même point, j'ai bien declaré la variable où je veux stocker la valeur de la cellule, une aide de votre part serai la bienvenue.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
20 mai 2010 à 23:50
Bonsoir,
oui mais il me renvoit à la fonction BSTRtoASC (BSTR str, char * &strRet) , à la line:

length = WideCharToMultiByte (CP_ACP,0, str,SysStringLen(str), reinterpret_cast <char *>(strRet), length,NULL, NULL );
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 mai 2010 à 17:58
As tu definis la variable ou tu veux stocker ta donnée voddd ? Regarde mieux les warnings de ton compilateur, il doit surement te dire que la variable X est utilisée sans etre definie.
Sinon pour en revenir a ton probleme Benjamin_31 j'ai modifié mon code comme cela:

void MyExcel::Release(void) {

//Sinon excel reste bloqué en memoire, peut etre necessaire pour les autres aussi ?
if (xlApp.pdispVal) {
xlApp.pdispVal->Release();
xlApp.pdispVal == NULL;
}
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
20 mai 2010 à 17:36
j'ai fait les modifications, après execution ,il ouvre deux classeurs et me renvoit:
Unhandled exception at 0*7855b690 in Excel.exe: 0*c0000005: Access violation reading location 0*00000000.
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
20 mai 2010 à 17:07
Normal, le 2emme paramètre est une sortie. Donc si tu y met un texte constant ("essai"), il ne pourra pas le modifier.

// declaration variable
char* cValeurCellule

// je selectionne la cellule A12
Excel.GetData("A12",cValeurCellule);

.....

Puis fait attantion à la mise en forme de ton code c'est important pour une bonne lisibiliter et voir les erreur de "{"
je me rappel plus trop comment ça ce manipule les fichier donc apar ton accolade qui ce ferme 2 fois je voie rien d'autre

ofstream fichier("tex.txt",ios::out | ios::trunc");
if(fichier)
{
fichier << "essai" << endl;
}
fichier.close();
}
else
cerr << "Impossible d'ouvrir le fichier !" << endl;
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
20 mai 2010 à 16:42
Dans le main
Excel.GetData("A12","essai");// je selectionne la cellule A12
Puis j'ouvre mon fichier.txt
ofstream fichier("tex.txt",ios::out | ios::trunc");
if(fichier)
{fichier << "essai" << endl;}
fichier.close();
}
else
cerr << "Impossible d'ouvrir le fichier !" << endl;

Il me sort des erreures?
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
20 mai 2010 à 16:15
bool GetData(char* pPos, char* pData);//lit une valeur dans une cellule

Retourne Vrai si l'opération a réussit.

pPos : Valeur d'entrer. Position de la cellule que tu souhaite lire. (ex : "B5")
pData : Valeur de sorti. Après l'exécution de la fonction pData contiendra la valeur de la cellule. (ex : "Je suis la cellule B5")
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
20 mai 2010 à 16:01
Mon problème c'est plus au niveau de la valeur de la cellule; l'écriture pas de soucis. je ne vois trop ce que fait la fonction getdata
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
20 mai 2010 à 14:41
Tu devrais regarder le fichier excel.h qui ce trouve dans l'archive, il y a toutes les fonction possible et bien documenter.
Pour récupérer uns valeur utilise la fonction GetData(). Puis pour L'écrire dans un fichier reporte toi à un tutoriel (http://www.siteduzero.com/tutoriel-3-36367-lecture-et-ecriture-dans-les-fichiers-en-c.html)
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
20 mai 2010 à 12:03
Bonjour tout le monde,
Comment faire pour recupéré la valeur d'une cellule depuis un fichier excel et l'écrire dans un fichier exemple.txt?
Merci d'avance
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
12 mai 2010 à 21:15
Voila mon destructeur actuel :
MyExcel::~MyExcel() {

xlApp.pdispVal = 0;

//relesase
Release();

// Uninitialize COM for this thread...
//CoUninitialize();
}

Vue que dans mon programme je n'utilise l'automatisation d'Excel que 5min pour environs 12h de fonctionnement il met inutile de garder en mémoire le fichier Excel, surtout que après il est utiliser par d'autre utilisateur. Donc quand j'ai finit de l'utiliser, la méthode qui l,utilise ce finie également et il est détruit a ce moment là.
Mais Si je réutiliser l'automation pour une autre méthode je tomber sur :

// if Excel is already running, return with current instance
if (xlApp.pdispVal != NULL)
return true;

Qui considérer donc que J'avais déjà un fichier Excel et qui me faisais sauter tous le code suivant. Donc gros bug lorsque je voulez manipulez un fichier qui exister pas.
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
12 mai 2010 à 20:39
Tu as ajouté "xlApp.pdispVal = 0;" au début du destructeur ?
Avant ou apres le "Release();" ? Car dans ce cas tu empeches tout le nettoyage des objets >> if (xlApp.pdispVal) xlApp.pdispVal->Release();
Normallement dans chacun de mes projets je ne crée l'objet MyExcel qu'une seule fois, ca cela ne sert a rien de le supprimer pour m'en resservir apres, mais ton bug m'intrigue meme si j'ai completement abandonné ce projet depuis des lustres.
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
12 mai 2010 à 01:32
merci énormément, je vais vite faire cela, encore une fois merci, bon repos.
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
12 mai 2010 à 01:25
tu peut marquer "C:\\Dossier1\\Dossier2\\Dossier3\\MonXLS.xls" ou "..\\MonXLS.xls"

Et zou au lit, il est tard ^^ (Mon j'ai une dérogation qui s'appel fuseau horaire)
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
12 mai 2010 à 00:32
Merci pour l'aide , effectivement le .exe est soit dans le Debug ou le release après compilation, comment changer l'adresse du fichier excel?
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
11 mai 2010 à 19:09
Bonjours,
Mon problème été causé par plusieurs points :
- L'adresse du fichier excel. Lorsque tu compile ton programme en debug (ou release) l'exécutable est mit dans un dossier Debug (ou Release) ça modifie donc le chemin absolu (Visual ne déplace pas ton fichier excel). Puis n'oublie pas que le "/" est un caractère spécial, il faut écrire "//".
- Le logiciel dans le quel j'ai intégrer l'API été complexe et utiliser déjà un grand nombre d'interface diverse et varier. Donc le fait d'utiliser "CoInitialize(NULL);" et "CoUninitialize()" y a créer des interférence. Il ma suffis d'enlever les 2 ligne.
- Puis pour un raison que je n'ai toujours pas trouver, les VARIANT ne sont pas détruit et réinitialiser entre 2 création de l'objet. Pour résoudre cette gène j'ai rajouter "xlApp.pdispVal = 0;" au début du destructeur (Mais je trouve que ça fait pas du code propre)
yodddd Messages postés 13 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 22 juin 2010
11 mai 2010 à 18:52
Salut Benjamin_31,
j'ai rencontre le même problème que toi, et je ne sais pas quoi faire.
Je suis sur visual C++ express edition, au secour!!!
benjamin_31 Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 1 juin 2010
21 avril 2010 à 21:42
Salut,

Le code est super, et très utile.
Il fonctionne super bien.
Mais quand je le met dans mon projet ça me fait une Erreur :
"AutoWrap()"
"IDispach::Invoke("Open"=00000783) failed w/err 0x800a03ec"

Quelqu'un peut m'aider ?
slimIT Messages postés 1 Date d'inscription dimanche 11 avril 2010 Statut Membre Dernière intervention 11 avril 2010
11 avril 2010 à 20:49
Salut,

quand je test ce code sur Visual C++ Express il marche parfaitement mais lorsque je le test dans mon projet Qt avec Qt Creator il ne marche pas.

voici les erreurs avec Qt Creator :

C:/Documents and Settings/Slim/Mes documents/Qt/Projects/CMMS/main.cpp:63: error: cannot convert 'char*' to 'WCHAR*' for argument '2' to 'DWORD GetModuleFileNameW(HINSTANCE__*, WCHAR*, DWORD)'

C:/Documents and Settings/Slim/Mes documents/Qt/Projects/CMMS/main.cpp:65: error: 'strcat_s' was not declared in this scope
amouretsu Messages postés 2 Date d'inscription vendredi 4 juillet 2008 Statut Membre Dernière intervention 19 février 2010
11 févr. 2010 à 16:43
bonjour je veux un code pareille mais pour extraireet inserer des information dans un document word et pas excel aider moi pleaaaaaaaaaaase
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
2 déc. 2008 à 20:09
Merci pour la modif, plusieurs fois j'avais eu le probleme et j'avais du bricoler pour passer outre.
tomcoy75 Messages postés 1 Date d'inscription vendredi 16 novembre 2007 Statut Membre Dernière intervention 2 décembre 2008
2 déc. 2008 à 11:26
Très pratique ! Merci

Cas d'un enregistrement d'un fichier excel déja existant

J'ai essayé l'exemple. Je souhaitais compléter un fichier excel existant. Il est écrit que pour avoir à éviter de confirmer l'enregistrement d'un fichier, il faut mettre "excel.SetSave(true)". Cela fonctionne très bien si le fichier excel n'existe pas.
Si on enregistre un fichier déja existant, une boite de dialogue apparait pour demander de confirmer l'écrasement du fichier RESUME.XLW. Ce problème est connu en Vb.
J'ai rajouté la méthode suivante dans la classe :
bool MyExcel::SetDisplayAlerts(bool fDisplay)
{
VariantClear(&lgVariant);
lgVariant.vt = VT_I4;
lgVariant.lVal = fDisplay;
HRESULT hr = AutoWrap(DISPATCH_PROPERTYPUT, NULL, xlApp.pdispVal, L"DisplayAlerts", 1, lgVariant);

return true;
}
et dans le code principal "excel.SetDisplayAlerts(false)" à la place de de excel.SetSave(true)".
J'ai maintement le bon résultat.
kacihadji2008 Messages postés 1 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 novembre 2008
21 nov. 2008 à 16:12
Bonjour

Un bon et intéressant code.
Merci beaucoup, tu ma sauvé, deux jours pour trouver ce code.

Je te remercie infiniment.
davypillet Messages postés 2 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 4 novembre 2008
21 oct. 2008 à 15:46
Super source, très utile
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
20 mai 2008 à 12:42
Bonjour

J'ai le meme probleme dans mon entreprise
TOLLAI Messages postés 8 Date d'inscription mercredi 15 septembre 2004 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 08:40
Merçi pour ton délai réponse !

Je suis sur un serveur entreprise, et cela viens peut être de ses paramètres que je ne connais pas. Je vais faire autrement pour télécharger le zip.
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
10 oct. 2007 à 17:33
J'ai reverifié aucun virus, ce ne sont que des fichiers textes et un fichiers excel sans aucune macro, un virus je veut bien mais ou, donne moi le nom du fichier infecté ?
"Compressed_Huge_File" ce n'est pas un nom de virus, je veut bien compresser mon archive differement mais j'aimerais etre sur que le probleme viens de chez moi.
TOLLAI Messages postés 8 Date d'inscription mercredi 15 septembre 2004 Statut Membre Dernière intervention 11 octobre 2007
10 oct. 2007 à 17:03
Bonjour SnOOpss,
Je suis tres interressé par tes lignes de codes.
J'ai voulu télécharger ton zip et voilà le message de mon serveur :(

L'objet de votre requête contient un virus :
Le fichier cppfrance_AUTOMATION-EXCEL-ENTIEREMENT-WIN32-SOUS-FORME-CLASSE___Page.zip contient le virus Compressed_Huge_File: ce fichier a été détruit.

Pourrais-tu nettoyer tes fichiers et remettre un zip?

a+
Rejoignez-nous