Я борюся з цією точною проблемою протягом останніх кількох днів і написав невелику утиліту .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 в текстовий режим.
Примітка. Хоча я використовую Mercurial, я читав це запитання, досліджуючи своє рішення, і в рішенні немає нічого специфічного для Mercurial, що повинно добре працювати для Git або будь-якого іншого VCS.