Tenho lutado com esse problema exato nos últimos dias e escrevi um pequeno utilitário .NET para extrair e normalizar arquivos do Excel de forma que eles sejam muito mais fáceis de armazenar no controle de origem. Publiquei o executável aqui:
https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe
..e a fonte aqui:
https://bitbucket.org/htilabs/ooxmlunpack
Se houver algum interesse, fico feliz em tornar isso mais configurável, mas no momento, você deve colocar o executável em uma pasta (por exemplo, a raiz do seu repositório de origem) e quando você executá-lo, ele irá:
- Examine a pasta e suas subpastas em busca de arquivos .xlsx e .xlsm
- Faça uma cópia do arquivo como * .orig.
- Descompacte cada arquivo e volte a compactá-lo sem compactação.
- Faça uma impressão bonita de todos os arquivos no arquivo que sejam XML válidos.
- Exclua o arquivo calcchain.xml do arquivo (uma vez que muda muito e não afeta o conteúdo do arquivo).
- Inline quaisquer valores de texto não formatados (caso contrário, eles são mantidos em uma tabela de pesquisa que causa grandes mudanças no XML interno se até mesmo uma única célula for modificada).
- Exclua os valores de quaisquer células que contenham fórmulas (uma vez que eles podem ser calculados apenas quando a planilha for aberta novamente).
- Crie uma subpasta * .extraído, contendo o conteúdo do arquivo zip extraído.
É claro que nem todas essas coisas são necessárias, mas o resultado final é um arquivo de planilha que ainda será aberto no Excel, mas que é muito mais fácil de difundir e compactar incrementalmente. Além disso, armazenar os arquivos extraídos também torna muito mais óbvio no histórico da versão quais mudanças foram aplicadas em cada versão.
Se houver algum apetite, fico feliz em tornar a ferramenta mais configurável, pois acho que nem todo mundo vai querer que o conteúdo seja extraído, ou possivelmente os valores removidos das células da fórmula, mas ambos são muito úteis para mim no momento.
Nos testes, uma planilha de 2 MB 'descompacta' até 21 MB, mas então fui capaz de armazenar cinco versões dela com pequenas alterações entre cada uma, em um arquivo de dados Mercurial de 1,9 MB, e visualizar as diferenças entre as versões efetivamente usando Beyond Compare em modo de texto.
NB: embora eu esteja usando o Mercurial, li esta questão enquanto pesquisava minha solução e não há nada específico do Mercurial sobre a solução, deve funcionar bem para Git ou qualquer outro VCS.