Bonjour a tous,
Je suis en trein d'étudier la structure des fichiers excel pour voir si j'arrive a acceder aux cellules sans avoir excel sur le poste. Donc pas besoin de payer de licence ...
J'ai déja mainte fois étudié des contenus binairs de fichiers tel le java ...
mais jamais je ne me suis autant pris la tête ^_^
Pour l'exemple, les fichiers excels sont "encapsulés" dans un système FAT. Oui oui dans le fichier
Donc, avant même d'atteindre le codage du fichier excel , il me faut le "dé-encapsuler".
Vous pourrez trouver la spécification de la structure des fichiers office à cette adresse :
http://msdn.microsoft.com/en-us/library/dd941946(PROT.10).aspx
Mon problème :
Dès le début de la lecture du fichier en mode binaire, je ne suis pas d'accord avec la spécification.
A savoir : le header.
Voici mon code :
Public Type t_HEADER
signature(1 To 8) As Byte ' magic number
clsid(1 To 16) As Byte '
minor_version As Integer '
major_version As Integer '
order As Integer '
sector_shift As Integer ' sector size = 2^sector_shift (512 if 0x0009; 4096 if 0x000C ...)
mini_sector_shift As Integer ' sector size = 2^sector_shift (512 if 0x0009; 4096 if 0x000C ...)
reserved(1 To 6) As Byte '
number_of_directory_sectors As Long '
number_of_fat_sectors As Long '
first_directory_sector_location As Long '
transaction_signature_number As Long '
mini_stream_cutoff_size As Long '
first_mini_fat_sector_location As Long ' index dans le difat ou code FAT SECTOR
number_of_mini_fat_sectors As Long '
first_mini_difat_sector_location As Long ' index dans le difat ou code FAT SECTOR
number_of_difat_sectors As Long ' nombre de secteurs de difat (si fichier > 7Mb)
DIFAT(1 To 109) As Long ' les 109 premiers etats des secteurs (
End Type
Public Const Hsignature = "D0 CF 11 E0 A1 B1 1A E1"
Public Const Hclsid = "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" '16 zeros
Public Function Ouvrire(file As String) As String
On Error GoTo fin
'déclarer et allouer un canal de flux disponible
Ouvrire = "Alocation du canal de flux"
Dim canal As Byte
canal = FreeFile
'ouvrire le fichier en mode binaire & lecture seule
Ouvrire = "Ouverture du fichier"
Open file For Binary Access Read As #canal
'Entête
Ouvrire = "Lecture de l'entête"
Dim header As t_HEADER
Get #canal, , header
'vérification de la signature du document
If (to_hex_str(header.signature) <> Hsignature) Then
Ouvrire = "'Header Signature' non conforme."
GoTo fin
End If
'vérification du clsid du doccument
If (to_hex_str(header.clsid) <> Hclsid) Then
Ouvrire = "'Header CLSID' non conforme."
GoTo fin
End If
[...]
Dans les valeurs chargées dans le header, tout semble bon sauf les données suivantes :
header.first_directory_sector_location = 1
header.first_mini_difat_sector_location = 13951
header.first_mini_fat_sector_location = 26917
ce qui me choque c'est que j'ai nb de directory sector = 0 (donc pkoi a voir une location et que ensuite, minidifat et minifat location sont sensés être inférieurs au nombre de fat secteur soit 212 dans mon cas ...
J'ai bien conscience que c'est une question alaquelle très peu peuvent répondre. Néamoins, si quelqu'un a une piste je suis preneur
Merci d'avance et a bientôt
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée