Я боролся с этой проблемой в течение последних нескольких дней и написал небольшую утилиту .NET для извлечения и нормализации файлов Excel таким образом, чтобы их было намного легче хранить в системе контроля версий. Я опубликовал исполняемый файл здесь:
https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe
..и источник здесь:
https://bitbucket.org/htilabs/ooxmlunpack
Если есть какой-либо интерес, я рад сделать это более настраиваемым, но на данный момент вы должны поместить исполняемый файл в папку (например, в корень исходного репозитория), и когда вы запустите его, он:
- Просканируйте папку и ее подпапки на наличие файлов .xlsx и .xlsm.
- Сделайте копию файла как * .orig.
- Разархивируйте каждый файл и повторно заархивируйте его без сжатия.
- Распечатайте любые файлы в архиве, которые являются допустимыми XML.
- Удалите файл calcchain.xml из архива (так как он сильно меняется и не влияет на содержимое файла).
- Вставьте любые неформатированные текстовые значения (в противном случае они сохраняются в таблице поиска, что вызывает большие изменения во внутреннем XML, если изменяется даже одна ячейка).
- Удалите значения из любых ячеек, которые содержат формулы (поскольку их можно просто вычислить при следующем открытии листа).
- Создайте подпапку * .extracted, содержащую извлеченное содержимое zip-архива.
Ясно, что не все эти вещи необходимы, но конечным результатом является файл электронной таблицы, который по-прежнему будет открываться в Excel, но который гораздо лучше поддается различному и инкрементному сжатию. Кроме того, сохранение извлеченных файлов делает более очевидным в истории версий, какие изменения были применены в каждой версии.
Если есть какой-то аппетит, я рад сделать инструмент более настраиваемым, так как я думаю, не все захотят извлекать содержимое или, возможно, значения, удаленные из ячеек формулы, но на данный момент они очень полезны для меня.
В тестах электронная таблица размером 2 МБ «распаковывается» до 21 МБ, но затем я смог сохранить пять ее версий с небольшими изменениями между каждой в файле данных Mercurial размером 1,9 МБ и эффективно визуализировать различия между версиями, используя Beyond Compare в текстовый режим.
NB: хотя я использую Mercurial, я прочитал этот вопрос во время исследования своего решения, и в решении нет ничего специфичного для Mercurial, должно работать нормально для Git или любой другой VCS.