Файлы Xlsx - это набор файлов XML в контейнере Zip.Чтобы два xlsx-файла были бинарным эквивалентом:
- XML-файлы должны быть в точности одинаковыми.
- ZIP должен выполняться одинаково.
Для файлов XlsxWriter и, вероятно, для большинства программ zip будет таким же.Однако, это может не совпадать в программном обеспечении.
Скорее всего, XML-часть будет одинаковой.
Первым различием метаданных могут быть системные временные метки файлов перед их сжатием.(так как эти данные хранятся в zip).Для версий XlsxWriter> = 1.0.4 эта метка времени всегда «1980-01-01 00:00:00», как в Excel, поэтому она будет одинаковой.
Excel также добавляет в файл метаданные об авторе и времени создания / изменения, поэтому любые два файла, за исключением доли секунды, будут различаться.
Эти метаданные хранятся в 'docPropsФайл /core.xml 'в коллекции XML:
$ xmllint --format example/docProps/core.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="...">
<dc:creator>John</dc:creator>
<cp:lastModifiedBy>John</cp:lastModifiedBy>
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02-23T21:20:58Z</dcterms:created>
<dcterms:modified xsi:type="dcterms:W3CDTF">2018-02-25T02:13:23Z</dcterms:modified>
</cp:coreProperties>
Чтобы сделать их согласованными в XlsxWriter, вы можете установить свойство документа created
:
workbook.set_properties({'created': datetime.date(2018, 1, 1))
Это «хакерский» метод, на который вы ссылаетесь, но он действительно действителен.Он допускает двоичное сравнение в стиле cmp
.
XlsxWriter пытается обеспечить очень высокий уровень совместимости с Excel, поэтому он имеет ~ 700 тестов, в которых он сравнивает свои результаты с файлами, созданными в Excel.Для этого используется тестовая функция с именем compare_xlsx_files()
.Это игнорирует метаданные стиля даты при выполнении сравнения, а также порядок некоторых элементов в других файлах метаданных "rel", которые могут различаться.Это также позволяет игнорировать определенные файлы или элементы с файлами при проведении сравнения.Модуль не экспортируется, но доступен, если вам это нужно.