Puis-je m'assurer que deux fichiers XLSX (écrits avec l'option openxlsx::write.xlsx
) sont identiques, lorsqu'on leur donne les mêmes données à écrire ? Je pense qu'il y a un horodatage écrit dans la feuille de calcul, ce qui signifie que les mêmes données écrites à plus d'une seconde d'intervalle créent un fichier différent.
Par exemple, lorsqu'ils sont écrits en succession rapide :
library(openxlsx)
write.xlsx(mtcars, "/tmp/t1.xlsx");write.xlsx(mtcars, "/tmp/t2.xlsx")
les fichiers sont identiques :
$ md5sum /tmp/t?.xlsx
c9b5f6509e20dd62b158debfbef376fe /tmp/t1.xlsx
c9b5f6509e20dd62b158debfbef376fe /tmp/t2.xlsx
mais si je dors entre deux écritures :
unlink("/tmp/t1.xlsx") # remove previous
unlink("/tmp/t2.xlsx")
write.xlsx(mtcars, "/tmp/t1.xlsx");Sys.sleep(2);write.xlsx(mtcars, "/tmp/t2.xlsx")
tout est différent :
$ md5sum /tmp/t?.xlsx
460945a610df3bc8a1ccdae9eb86c1fa /tmp/t1.xlsx
a4865be49994092173792c9f7354e435 /tmp/t2.xlsx
Mon cas d'utilisation est un processus qui génère un fichier XLSX qui va dans un dépôt git. Si je l'automatise, le fichier XLSX va changer à chaque fois, même si les données sources n'ont pas changé. Je suppose que je pourrais tester si les données ont changé plus tôt dans le processus et ne pas générer un nouveau fichier XLSX, mais il semble plus facile de laisser git faire le test "est-ce que ça a changé ?" mais des métadonnées invisibles dans le XLSX empêchent cela. Traitez-moi de paresseux.
Les métadonnées XLSX peuvent-elles être définies pour empêcher cela ? Je suppose qu'il y a peut-être une "date de création" quelque part. Je me fiche que ce soit toujours 1970-01-01.
Défense préventive : Non, je ne peux pas utiliser un CSV, le XLSX comporte plusieurs feuilles et c'est ce que veulent mes utilisateurs finaux. Oui, je l'écris déjà aussi dans une base de données SQlite et c'est identique quand on y écrit les mêmes données.
Je ne pense pas que cela puisse être fait avec openxlsx
tel quel, puisque la différence est due aux métadonnées XML créées : https://github.com/ycphs/openxlsx/blob/7742063a4473879490d789c552bb8e6cc9a0d2c7/R/baseXML.R#L77 où il met le courant Sys.time()
dans le created
champ.
Il semble y avoir deux sources de différence. Premièrement, il y a les métadonnées Excel écrites dans le fichier <dcterms:created>
les métadonnées dans la structure du document MS Excel. Mais même en fixant cela de la même manière (par monkey-Parcheando openxlsx
) laisse quand même une différence car le document est regroupé en utilisant le format standard ZIP et que a également des en-têtes de datestamp.
Voici deux fichiers XLSX, décompressés, qui présentent tous les mêmes valeurs CRC-32, ce qui signifie que les fichiers qu'ils contiennent sont identiques :
Archive: test1.xlsx
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
587 Defl:N 234 60% 2022-01-31 15:22 b5dbec60 _rels/.rels
1402 Defl:N 362 74% 2022-01-31 15:22 63422601 [Content_Types].xml
284 Defl:N 173 39% 2022-01-31 15:22 f9153db0 docProps/app.xml
552 Defl:N 278 50% 2022-01-31 15:22 37126cbe docProps/core.xml
696 Defl:N 229 67% 2022-01-31 15:22 14a147d3 xl/_rels/workbook.xml.rels
4500 Defl:N 311 93% 2022-01-31 15:22 285db1ad xl/printerSettings/printerSettings1.bin
601 Defl:N 203 66% 2022-01-31 15:22 211e1d6e xl/sharedStrings.xml
1127 Defl:N 464 59% 2022-01-31 15:22 0d8ee71d xl/styles.xml
7075 Defl:N 1361 81% 2022-01-31 15:22 050f988c xl/theme/theme1.xml
950 Defl:N 382 60% 2022-01-31 15:22 1b8cce29 xl/workbook.xml
612 Defl:N 223 64% 2022-01-31 15:22 f0584777 xl/worksheets/_rels/sheet1.xml.rels
12729 Defl:N 2204 83% 2022-01-31 15:22 18057777 xl/worksheets/sheet1.xml
-------- ------- --- -------
31115 6424 79% 12 files
$ unzip -v test2.xlsx
Archive: test2.xlsx
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
587 Defl:N 234 60% 2022-01-31 15:22 b5dbec60 _rels/.rels
1402 Defl:N 362 74% 2022-01-31 15:22 63422601 [Content_Types].xml
284 Defl:N 173 39% 2022-01-31 15:22 f9153db0 docProps/app.xml
552 Defl:N 278 50% 2022-01-31 15:22 37126cbe docProps/core.xml
696 Defl:N 229 67% 2022-01-31 15:22 14a147d3 xl/_rels/workbook.xml.rels
4500 Defl:N 311 93% 2022-01-31 15:22 285db1ad xl/printerSettings/printerSettings1.bin
601 Defl:N 203 66% 2022-01-31 15:22 211e1d6e xl/sharedStrings.xml
1127 Defl:N 464 59% 2022-01-31 15:22 0d8ee71d xl/styles.xml
7075 Defl:N 1361 81% 2022-01-31 15:22 050f988c xl/theme/theme1.xml
950 Defl:N 382 60% 2022-01-31 15:22 1b8cce29 xl/workbook.xml
612 Defl:N 223 64% 2022-01-31 15:22 f0584777 xl/worksheets/_rels/sheet1.xml.rels
12729 Defl:N 2204 83% 2022-01-31 15:22 18057777 xl/worksheets/sheet1.xml
mais les fichiers diffèrent toujours :
$ md5sum test1.xlsx test2.xlsx
27783e8b19631039a1c940db214f25e1 test1.xlsx
ba0678946aea1e01093ce25130b2c467 test2.xlsx
à cause des métadonnées du ZIP, visibles avec exiftool
:
$ exiftool test*.xlsx | grep Zip | grep Date
Zip Modify Date : 2022:01:31 15:22:52
Zip Modify Date : 2022:01:31 15:22:54