OVH Cloud OVH Cloud

Repérage d'un sous-flux de feuille de calcul

14 réponses
Avatar
Jean Bonneau
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

10 réponses

1 2
Avatar
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


Avatar
Jean Bonneau
!?!?!?!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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" 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






Avatar
Jean Bonneau
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

Avatar
jps
philippe R aurait dit : "c'était avec plaisir, jean"....
mais je ne le dis pas puisqu'il a mis un copyright sur la formule...
jps

"Jean Bonneau" a écrit dans le message de
news:

!?!?!?!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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" 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








Avatar
jps
"Jean Bonneau" a écrit dans le message de
news:
C'est remoi.


re jean

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;


tu peux toujours tester, jean, mais, AMHA, je ne vois pas comment ça
pourrait être plus simple

// attention aux modifs éventuelles avec BIFF7...


Quelles sont ces modifications ?


si tu veux bien, je t'en reparle demain car je ne te cache pas que j'ai eu
une journée plutôt dure et, tel lance amstrong, ce soir j'ai tendance à
pédaler à côté de mon vélo...mais moi je n'abandonne pas et je ne voudrais
pas qu'à cause d'un manque de suivi de ma part, tous tes brochets soient des
truites...
jps

HTH


TH à la puissance 10, jps. :-)
sois sympa, jean, n'en rajoute pas trop qu'après je vais tellement me la

péter qu'il me faudra signer
jpsV
Jean
jps



Avatar
GD
?????
:-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




Avatar
jps
mais encore, GD?
c'est quoi ces borborygmes suivi d'une expression des plus triviales?
tu vas filer au piquet sur le champ ; ce n'est quand même pas de ma faute si
tu ne comprends rien aux sous-flux (et Dieu sait si pourtant tu sais bien
me souffler dans les bronches)....
jps

"GD" a écrit dans le message de
news:
?????
:-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








Avatar
J
Nous sommes tous sousflux
C'est du grand Tabassier ou je n'y connais guère !!!
:-))))))))))
amitiés
@+
J@@
Avatar
isabelle
hé ! ça fait du bien un séjour à la goële, ça te remet un homme
sul'piton, bravo jean paul comme tu réagi bien dans l'adversité ;-)
isabelle



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






Avatar
jps
bonjour jean
j'avais l'espoir que quelque "poste de nuit" prît le relais pour répondre à
ton complément d'information mais que nenni ; j'en conclus que quand il
s'agit de se gausser des uns et des autres (et surtout de moi), tu as toute
une panoplie de mauvaises langues qui s'expriment mais quand il s'agit de
répondre sérieusement à une question certes pas facile, je te l'accorde
(mais on en a vu ici de plus ardues et en disant cela, je pense à celles
auxquelles michel P apporte une solution), de répondre, disais-je, à une
question et surtout à un complément de question (car sans réponse à
celui-ci, c'est tout un projet qui part en brioche), eh bien, tu as beau
faire un 360° sur toi-même, tu ne vois personne....
ce qui me fait le plus râler, c'est que nous avons vécu une époque ici (mais
tu ne devais pas être sur le forum à l'époque, jean) où un charlot à
pseudonyme variable poser des questions à la c... et toute une pléthore de
contribuables et non des moindres se précipitaient, que dis-je, se battaient
pour répondre...enfin, je ne veux pas remuer la fange, ça me donnerait des
nausées...
ceci dit, j'essaie, comme promis hier soir, de compléter ma réponse

"Jean Bonneau" a écrit dans le message de
news:

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;


non point, jean ; comme je commençais à l'entrevoir hier soir, si tu lis
attentivement les spécifications de IStream::Read, tu apprendras que :

"The actual number of bytes read can be fewer than the number of bytes
requested
if an error occurs or if the end of the stream is reached during the read
operation. The OLE-provided implementation of IStream returns S_OK if the
end of
the stream was reached during the read. (This is the same as the "end of
file"
behavior found in the MS-DOS FAT file system."

je me suis fait avoir une fois, et un jps averti vaut 100 LL.



// attention aux modifs éventuelles avec BIFF7...


Quelles sont ces modifications ?


j'aurais dû te le le préciser tout de suite, excuse-moi :

cch est sur 1 octet au lieu de 2, donc en BIFF7 :

pStream -> Read(&cch, 1, NULL);

tu peux obtenir la version du classeur par le membre "vers" du BOF record
(offset 4), mais ça je pense que tu le sais déjà (sinon, reklaxonne et on
reboit un coup, on se refait une bouffe et on en rereparle).

sur ce, j'entends sonner 8 heures, je me sauve

HTH


TH à la puissance 10, jps. :-)


et toi, TH achement sympa dans tes appréciations...

Jean
jps



1 2