Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" <jean.bonneau@nospam.com> a écrit dans le message de
news:u$v92ybJFHA.3628@TK2MSFTNGP15.phx.gbl...
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
// attention aux modifs éventuelles avec BIFF7...
HTH
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
// attention aux modifs éventuelles avec BIFF7...
HTH
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
// attention aux modifs éventuelles avec BIFF7...
HTH
!?!?!?!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ca maaaaaaaaaaaaAAAAAAAAAAAAAAAAAAARCHEEEEEEEEEEEEEEEEE !!!!!!!!!!!!!!!
On m'avait bien dit qu'il y a des super-cracks dans ce newsgroup, mais
alors là
je suis soufflé !
MERCI MONSIEUR JPS !!!
Jeanbonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien
parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et
qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans
la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que
tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe
et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel
ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
!?!?!?!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ca maaaaaaaaaaaaAAAAAAAAAAAAAAAAAAARCHEEEEEEEEEEEEEEEEE !!!!!!!!!!!!!!!
On m'avait bien dit qu'il y a des super-cracks dans ce newsgroup, mais
alors là
je suis soufflé !
MERCI MONSIEUR JPS !!!
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien
parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et
qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans
la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que
tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe
et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" <jean.bonneau@nospam.com> a écrit dans le message de
news:u$v92ybJFHA.3628@TK2MSFTNGP15.phx.gbl...
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel
ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
!?!?!?!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ca maaaaaaaaaaaaAAAAAAAAAAAAAAAAAAARCHEEEEEEEEEEEEEEEEE !!!!!!!!!!!!!!!
On m'avait bien dit qu'il y a des super-cracks dans ce newsgroup, mais
alors là
je suis soufflé !
MERCI MONSIEUR JPS !!!
Jeanbonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien
parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et
qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans
la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que
tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe
et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel
ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
C'est remoi.
J'aurais deux précisions à te demander :// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
sois sympa, jean, n'en rajoute pas trop qu'après je vais tellement me la
Jean
jps
C'est remoi.
J'aurais deux précisions à te demander :
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
sois sympa, jean, n'en rajoute pas trop qu'après je vais tellement me la
Jean
jps
C'est remoi.
J'aurais deux précisions à te demander :// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
sois sympa, jean, n'en rajoute pas trop qu'après je vais tellement me la
Jean
jps
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" <jean.bonneau@nospam.com> a écrit dans le message de
news:u$v92ybJFHA.3628@TK2MSFTNGP15.phx.gbl...
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
?????
:-O !!!
sur le cul !!!!
jps wrote:bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
?????
:-O !!!
sur le cul !!!!
jps wrote:
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" <jean.bonneau@nospam.com> a écrit dans le message de
news:u$v92ybJFHA.3628@TK2MSFTNGP15.phx.gbl...
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
?????
:-O !!!
sur le cul !!!!
jps wrote:bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré
pour comprendre comment naviguer dans les sous-flux mais bon, c'est
bien parce que c'est toi et que si tu es venu sur ce forum, c'est
pour y trouver de l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois
et qui, j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le
book stream "pStream" et renvoie true (prononcez "trou")le cas
échéant. si la feuille a été trouvée, l'offset de l'enregistrement
INDEX est mis dans la variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour
que tu capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une
bouffe et on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour l'instant je sais juste comment positionner un IStream
sur le flux "Workbook" du compound file, mais après je ne sais pas
trop comment boucler sur les enregistrements de ce flux pour repérer
les BUNDLESHEET. Le SDK d'Excel ne donne aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors
j'essaie ici en espérant sans beaucoup d'espoir qu'un expert aura la
solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" <jean.bonneau@nospam.com> a écrit dans le message de
news:u$v92ybJFHA.3628@TK2MSFTNGP15.phx.gbl...
Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pour
l'instant je sais juste comment positionner un IStream sur le flux
"Workbook" du
compound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donne
aucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
ici
en espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
bonsoir jean,
bouhhhhhhh, si tu savais comme j'ai pu moi-même déjà beaucoup galéré pour
comprendre comment naviguer dans les sous-flux mais bon, c'est bien parce
que c'est toi et que si tu es venu sur ce forum, c'est pour y trouver de
l'aide...
je te livre donc un bout de code que j'ai pondu il y a quelques mois et qui,
j'espère,
pourra t'aider.
cette fonction cherche le sous-flux de la feuille "sheetname" dans le book
stream "pStream" et renvoie true (prononcez "trou")le cas échéant. si la
feuille a été trouvée, l'offset de l'enregistrement INDEX est mis dans la
variable IndexLen.
tu ne manqueras pas de noter que j'ai ajouté des commentaires pour que tu
capich bien la démarche.
si tu as des problèmes, klaxonne, on boit un coup, on se fait une bouffe et
on en reparle.
or donc, voici la fonction :
bool SearchSheet(const char *sheetname, IStream* &pStream,
unsigned short* IndexLen)
// (c) jps, mpfe
{
unsigned short Record[2];
unsigned short lbPlyPos;
unsigned short grbit;
unsigned short cch;
char* rgch;
unsigned short BOFLen;
bool SheetFound;
ULARGE_INTEGER Pos;
LARGE_INTEGER NewPos;
unsigned long pcbRead;
for(;;)
{
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
pStream -> Seek(ToLargeInt(0), STREAM_SEEK_CUR, &Pos);
if(Record[0] == 0x85) // c'est un BOUNDSHEET
{
// position du BOF Record de la feuille
pStream -> Read(&lbPlyPos, 4, NULL);
// attention aux modifs éventuelles avec BIFF7...
pStream -> Read(&grbit, 2, NULL);
// est-ce bien une feuille de calcul ?
if(grbit < 2)
{
pStream -> Read(&cch, 2, NULL);
// Nom de la feuille = bonne longueur ?
if((size_t)cch == strlen(sheetname))
{
rgch = (char*)malloc(cch);
pStream -> Read(rgch, cch,NULL);
SheetFound = memicmp(rgch, sheetname, cch) == 0;
free(rgch);
// si feuille trouvée, SheetFound = True
if(SheetFound)
{
// on déplace pStream vers le BOF Record de la feuille
NewPos.QuadPart = lbPlyPos + 2;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
// on déplace pStream vers le INDEX Record
pStream -> Read(&BOFLen, 2, NULL);
NewPos.QuadPart = BOFLen + 2;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
// on met la longueur de INDEX dans la variable IndexLen
pStream -> Read(IndexLen, 2, NULL);
NewPos.QuadPart = 4;
pStream -> Seek(NewPos, STREAM_SEEK_CUR, NULL);
return true;
}
}
}
}
NewPos.QuadPart = (unsigned __int64)Record[1] + Pos.QuadPart;
pStream -> Seek(NewPos, STREAM_SEEK_SET, NULL);
}
}
HTH
jps
"Jean Bonneau" a écrit dans le message de
news:u$Bonsoir !
Je voudrais trouver l'offset d'une feuille de calcul dans un fichier
BIFF8. Pourl'instant je sais juste comment positionner un IStream sur le flux
"Workbook" ducompound file, mais après je ne sais pas trop comment boucler sur les
enregistrements de ce flux pour repérer les BUNDLESHEET. Le SDK d'Excel ne
donneaucun exemple de code.
J'ai posé la question sur 36 forums sans trouver de réponse alors j'essaie
icien espérant sans beaucoup d'espoir qu'un expert aura la solution...
Merci...
Jean
C'est remoi.
J'aurais deux précisions à te demander :// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
Jean
jps
C'est remoi.
J'aurais deux précisions à te demander :
// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
Jean
jps
C'est remoi.
J'aurais deux précisions à te demander :// on lit le descripteur et la taille du BIFF record
pStream -> Read(Record, 4, &pcbRead);
if(pcbRead < 4) return false; // erreur => fin du Book Stream
Ca ne serait pas plus simple de tester le code de retour de pStream ->
Read ?
if (pStream -> Read(Record, 4, &pcbRead) != S_OK) return false;
// attention aux modifs éventuelles avec BIFF7...
Quelles sont ces modifications ?
HTH
TH à la puissance 10, jps. :-)
Jean
jps