AUTOMATION DE EXCEL ENTIEREMENT EN WIN32 ET SOUS FORME DE CLASSE
TOLLAI
Messages postés8Date d'inscriptionmercredi 15 septembre 2004StatutMembreDernière intervention11 octobre 2007
-
10 oct. 2007 à 17:03
antoine2641
Messages postés1Date d'inscriptionmardi 5 avril 2011StatutMembreDerniè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.
antoine2641
Messages postés1Date d'inscriptionmardi 5 avril 2011StatutMembreDerniè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és17Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention28 janvier 2011 28 janv. 2011 à 15:39
Bonjour,
Une idée pour appeler une Macro excel depuis ce code ?
cs_gerunt
Messages postés1Date d'inscriptionvendredi 12 février 2010StatutMembreDernière intervention19 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.
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.
Merci de m'avoir repondu, grâce a toi j'ai vraiment pu avancer.
yodddd
Messages postés13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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...
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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDernière intervention 1 juin 2010 29 mai 2010 à 17:02
Désoler j'ai rien trouver pour corriger ton problème :(
yodddd
Messages postés13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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:
benjamin_31
Messages postés19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 juin 2010 20 mai 2010 à 23:50
Bonsoir,
oui mais il me renvoit à la fonction BSTRtoASC (BSTR str, char * &strRet) , à la line:
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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
yodddd
Messages postés13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDernière intervention 1 juin 2010 20 mai 2010 à 14:41
yodddd
Messages postés13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDernière intervention 1 juin 2010 12 mai 2010 à 21:15
// 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és571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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és13Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention22 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és19Date d'inscriptionlundi 2 avril 2007StatutMembreDerniè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és1Date d'inscriptiondimanche 11 avril 2010StatutMembreDernière intervention11 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és2Date d'inscriptionvendredi 4 juillet 2008StatutMembreDernière intervention19 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és571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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és1Date d'inscriptionvendredi 16 novembre 2007StatutMembreDerniè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és1Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention21 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és2Date d'inscriptionsamedi 23 décembre 2000StatutMembreDernière intervention 4 novembre 2008 21 oct. 2008 à 15:46
Super source, très utile
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 20 mai 2008 à 12:42
Bonjour
J'ai le meme probleme dans mon entreprise
TOLLAI
Messages postés8Date d'inscriptionmercredi 15 septembre 2004StatutMembreDernière intervention11 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és571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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és8Date d'inscriptionmercredi 15 septembre 2004StatutMembreDernière intervention11 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?
5 avril 2011 à 10:23
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 !
28 janv. 2011 à 15:39
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 ;)
19 nov. 2010 à 16:03
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.
6 juil. 2010 à 10:57
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.
23 juin 2010 à 18:54
char *test=(char*)malloc(sizeof(test)); (moins bien que avec New)
ou plus simplement
char test[255];
23 juin 2010 à 11:05
22 juin 2010 à 17:00
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...
21 juin 2010 à 10:54
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.
29 mai 2010 à 23:29
29 mai 2010 à 17:02
29 mai 2010 à 16:34
Vous avez du nouveau concernant mon bug, je suis toujours au même point.
25 mai 2010 à 18:24
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;
25 mai 2010 à 17:23
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.
25 mai 2010 à 11:41
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.
20 mai 2010 à 23:50
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 );
20 mai 2010 à 17:58
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;
}
20 mai 2010 à 17:36
Unhandled exception at 0*7855b690 in Excel.exe: 0*c0000005: Access violation reading location 0*00000000.
20 mai 2010 à 17:07
// 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;
20 mai 2010 à 16:42
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?
20 mai 2010 à 16:15
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")
20 mai 2010 à 16:01
20 mai 2010 à 14:41
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)
20 mai 2010 à 12:03
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
12 mai 2010 à 21:15
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.
12 mai 2010 à 20:39
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.
12 mai 2010 à 01:32
12 mai 2010 à 01:25
Et zou au lit, il est tard ^^ (Mon j'ai une dérogation qui s'appel fuseau horaire)
12 mai 2010 à 00:32
11 mai 2010 à 19:09
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)
11 mai 2010 à 18:52
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!!!
21 avril 2010 à 21:42
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 ?
11 avril 2010 à 20:49
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
11 févr. 2010 à 16:43
2 déc. 2008 à 20:09
2 déc. 2008 à 11:26
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.
21 nov. 2008 à 16:12
Un bon et intéressant code.
Merci beaucoup, tu ma sauvé, deux jours pour trouver ce code.
Je te remercie infiniment.
21 oct. 2008 à 15:46
20 mai 2008 à 12:42
J'ai le meme probleme dans mon entreprise
11 oct. 2007 à 08:40
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.
10 oct. 2007 à 17:33
"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.
10 oct. 2007 à 17:03
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+