¿Cómo creo un diff legible de dos hojas de cálculo usando git diff?


168

Tenemos muchas hojas de cálculo (xls) en nuestro repositorio de código fuente. Por lo general, se editan con gnumeric u openoffice.org, y se utilizan principalmente para llenar bases de datos para pruebas unitarias con dbUnit . No hay formas fáciles de hacer diferencias en los archivos xls que conozco, y esto hace que la fusión sea extremadamente tediosa y propensa a errores.

Intenté convertir las hojas de cálculo a xml y hacer una diferencia regular, pero realmente parece que debería ser un último recurso.

Me gustaría realizar la diferenciación (y fusión) con gitlo que hago con los archivos de texto. ¿Cómo haría esto, por ejemplo, al emitir git diff?


44
Creo que las etiquetas unit unit testing y dbunit se aplican incorrectamente aquí. La pregunta es sobre la comparación de archivos para un formato de archivo específico y no tiene nada que ver con las pruebas unitarias.
Hamish Smith

1
No es una respuesta (requiere Excel y es un producto comercial), pero para las personas traídas aquí por GooBinghoo: formulasoft.com/excel-compare.html funciona bien para mí.
CAD bloke

1
Utilizo este script de Python para diferenciar Excel que registramos en git. Porté este código GO (que fue portado desde Perl) a Python: github.com/tokuhirom/git-xlsx-textconv#see-also Le permite usar git diffygitk
nmz787


Una manera simple de hacerlo sería exportar los datos de ambas hojas de cálculo como CSV / texto y hacer un diff regular (con su editor preferido o archivos diff)
PPC

Respuestas:


109

Nos enfrentamos exactamente al mismo problema en nuestra compañía. Nuestras pruebas producen libros de Excel. La diferencia binaria no era una opción. Así que lanzamos nuestra propia herramienta de línea de comandos simple. Echa un vistazo al proyecto ExcelCompare . De hecho, esto nos permite automatizar nuestras pruebas bastante bien. Parches / Peticiones de características ¡bienvenidos!


2
@KimStacks sí funciona para todos los xls, xlsx, ods. E incluso puede comparar cualquier tipo con el otro, por ejemplo, xls v / s xlsx.
na_ka_na

1
Gran herramienta ... pero dice "Diff falló: Error al leer como archivo de Excel:" para algunos archivos xls perfectamente válidos. Para cualquiera que esté buscando una alternativa (mucho más pobre, desde todos los demás puntos de vista): visite github.com/toobaz/xlrd_diff
Pietro Battiston

2
@PietroBattiston por favor registre un boleto en github y lo miraré.
na_ka_na

@na_ka_na ¡Gracias por crear esta herramienta!
jgpawletko

111

Rápido y fácil sin herramientas externas, funciona bien siempre que las dos hojas que está comparando sean similares:

  • Crea una tercera hoja de cálculo
  • Escriba =if(Sheet1!A1 <> Sheet2!A1, "X", "")la celda superior izquierda (o equivalente: haga clic en las celdas reales para insertar automáticamente las referencias en la fórmula)
  • Ctrl+C(copiar), Ctrl+A(seleccionar todo), Ctrl+V(pegar) para llenar la hoja.

Si las hojas son similares, esta hoja de cálculo estará vacía, excepto por algunas celdas con X en ellas, resaltando las diferencias. Desenganche al 40% para ver rápidamente qué es diferente.


66
¿No hace esto comparación celda por celda? Quiero decir que si el lado izquierdo tiene una fila adicional en la parte superior, dará a todas las filas restantes (y celdas) diferentes. Si es así, eso no es muy útil.
Hammad Khan

1
@ Thecrocodilehunter: siempre puedes eliminar esa fila en la parte superior y luego comparar el resto. Si las diferencias son mucho más complejas, entonces, por supuesto, necesita una herramienta diferente. Esto es útil para realizar comparaciones rápidas, como cuando Excel dice que ha cambiado la hoja de cálculo y teme haber editado un campo accidentalmente.
iconoclasta

1
Me gustó este. En lugar de hacer X, también puede hacer "1" y tener un SUM como las primeras filas y columnas. Agregue un som en el primer campo y verá rápidamente cuántos campos difieren.
Konerak

55
Cambié un poco la fórmula para no tener que mirar cuáles eran las diferencias exactas. = SI (Hoja1! A1 <> Hoja2! A1, CONCATENAR ("Hoja 1 =", Hoja1! A1, "Hoja 2 =", Hoja2! A1), "")
Martyn

1
Solo puedes escribir =Sheet1!A1=Sheet2!A1. Esto imprimirá VERDADERO o FALSO. Luego puede hacer un formato condicional =countif(A1:B2, FALSE)o algo similar.
user2023861

12

He comparado mucho los libros de Excel en el pasado. Mi técnica funciona muy bien para libros de trabajo con muchas hojas de trabajo, pero solo compara el contenido de las celdas, no el formato de las celdas, las macros, etc. Además, hay algo de codificación involucrada, pero vale la pena si tiene que comparar muchos archivos grandes repetidamente. Así es como funciona:

A) Escriba un programa de volcado simple que recorra todas las hojas de trabajo y guarde todos los datos en archivos separados por tabuladores. Cree un archivo por hoja de trabajo (use el nombre de la hoja de trabajo como nombre de archivo, por ejemplo, "MyWorksheet.tsv"), y cree una nueva carpeta para estos archivos cada vez que ejecute el programa. Asigne un nombre a la carpeta después del nombre de archivo de Excel y agregue una marca de tiempo, por ejemplo, "20080922-065412-MyExcelFile". Hice esto en Java usando una biblioteca llamada JExcelAPI . Es realmente bastante fácil.

B) Agregue una extensión de shell de Windows para ejecutar su nuevo programa Java desde el paso A al hacer clic derecho en un archivo de Excel. Esto hace que sea muy fácil ejecutar este programa. Necesita Google para hacer esto, pero es tan fácil como escribir un archivo * .reg.

C) Get BeyondCompare . Tiene una característica muy buena para comparar datos delimitados mostrándolos en una buena tabla, mira la captura de pantalla .

D) Ahora está listo para comparar archivos de Excel con facilidad. Haga clic derecho en el archivo 1 de Excel y ejecute su programa de volcado. Creará una carpeta con un archivo por hoja de trabajo. Haga clic derecho en el archivo de Excel 2 y ejecute su programa de volcado. Creará una segunda carpeta con un archivo por hoja de trabajo. Ahora use BeyondCompare (BC) para comparar las carpetas. Cada archivo representa una hoja de trabajo, por lo que si hay diferencias en una hoja de trabajo, BC lo mostrará y podrá profundizar y hacer una comparación de archivos. BC mostrará la comparación en un diseño de tabla agradable, y puede ocultar filas y columnas que no le interesen.


12

Puede probar esta herramienta gratuita en línea: www.cloudyexcel.com/compare-excel/

Ofrece una buena salida visual en línea, en términos de filas agregadas, eliminadas, modificadas, etc.

ingrese la descripción de la imagen aquí

Además, no tienes que instalar nada.


Lamentablemente, solo funciona para archivos de <2 MB. De todos modos, podría funcionar para otra persona.
MikeVelazco

10

He encontrado xdocdiff WinMerge Plugin . Es un complemento para WinMerge (tanto OpenSource como Freeware , no necesita escribir un VBA ni guardar un Excel en csv o xml). Funciona solo para las celdas contiene.

Este complemento también admite:

  • Texto enriquecido .rtf
  • .docx / .docm Microsoft WORD 2007 (OOXML)
  • .xlsx / .xlsm Microsoft Excel 2007 (OOXML)
  • .pptx / .pptm Microsoft PowerPoint 2007 (OOXML)
  • .doc Microsoft WORD ver5.0 / 95/97/2000 / XP / 2003
  • .xls Microsoft Excel ver5.0 / 95/97/2000 / XP / 2003
  • .ppt Microsoft PowerPoint 97/2000 / XP / 2003
  • .sxw / .sxc / .sxi / .sxd OpenOffice.org
  • .odt / .ods / .odp / .odg Abrir documento
  • .wj2 / wj3 / wk3 / wk4 / 123 Lotus 123
  • .wri Windows3.1 Escribir
  • .pdf Adobe PDF
  • .mht Archivo web
  • .eml Archivos exportados de OutlookExpress

Respeto, Andres


1
Desafortunadamente, no permite guardar cambios en los archivos desempaquetados, por lo que no es útil para la fusión. Sin embargo, es gratis.
Sogger

6

Hmmm En el menú de Excel, elija Ventana -> ¿Comparar lado a lado?


+1 funciona bien, pero no destaca las diferencias en Office 2007. Supongo que en versiones anteriores sí. Sigue siendo muy bueno para la comparación visual.
Hammad Khan

2
Sí, no hay resaltado, por lo que el único beneficio es el desplazamiento sincrónico.
Sogger

5

¿Utiliza TortoiseSVN para realizar sus confirmaciones y actualizaciones en subversion? Tiene una herramienta de diferencias, sin embargo, comparar archivos de Excel todavía no es fácil de usar. En mi entorno (Win XP, Office 2007), abre dos archivos de Excel para la comparación lado a lado.

Haga clic con el botón derecho en el documento> Tortoise SVN> Mostrar registro> seleccione revisión> haga clic con el botón derecho para "Comparar con copia de trabajo".


4

Las versiones más nuevas de MS Office vienen con Spreadsheet Compare , que realiza una diferencia bastante agradable en una GUI. Detecta la mayoría de los tipos de cambios.


Aunque esta respuesta probablemente no ayudará a la situación de OP con una diffcombinación basada en la línea de comandos , esta herramienta de comparación de hoja de cálculo fue perfecta para mis propósitos (comprobar las diferencias entre la salida de automatización de OpenXML y la salida de automatización COM de Excel).
ErrCode

Nota:
Intenté

4

Hay una biblioteca daff (abreviatura de diferencias de datos) que ayuda a comparar tablas, producir un resumen de sus diferencias y usar dicho resumen como un archivo de parche.

Está escrito en Haxe, por lo que puede compilarse en los principales idiomas.

He creado una herramienta de diferencias de Excel en Javascript con la ayuda de esta biblioteca. Funciona bien con números y cadenas pequeñas, pero la salida no es ideal para cadenas largas (por ejemplo, una oración larga con un cambio menor de caracteres).


3

Sé que varias respuestas han sugerido exportar el archivo a csv o algún otro formato de texto, y luego compararlos. No lo he visto mencionado específicamente, pero Beyond Compare 3 tiene varios formatos de archivo adicionales que admite. Ver formatos de archivo adicionales . Usando uno de los formatos de archivo de Microsoft Excel, puede comparar fácilmente dos archivos de Excel sin pasar por la opción de exportación a otro formato.


2

Usaría el formato de archivo SYLK si realizar diffs es importante. Es un formato basado en texto, que debería hacer que las comparaciones sean más fáciles y compactas que un formato binario. También es compatible con Excel, Gnumeric y OpenOffice.org, por lo que las tres herramientas deberían funcionar bien juntas. Artículo de Wikipedia sobre SYLK


Esta es una gran solución que debería adoptarse como una práctica común en entornos que utilizan frecuentemente git con archivos de Excel (y otros archivos). Definitivamente es amigable con "git" (aunque los diffs no son legibles para humanos) y no requiere ninguna herramienta adicional más allá de Excel "moderno" (es 2019 ahora). También es "bidireccional", lo que significa que otros usuarios pueden guardar sus hojas de cálculo de Excel en formato .slk (SYLK) y luego se abren con todo el formato adecuado, etc. en Excel cuando sea necesario.
D. Woods

2

Utilice Altova DiffDog

Use el modo diff de XML de diffdog y la Vista de cuadrícula para revisar las diferencias en un formato tabular fácil de leer. La diferenciación de texto es MUCHO MÁS DIFÍCIL para las hojas de cálculo de cualquier complejidad. Con esta herramienta, al menos dos métodos son viables en diversas circunstancias.

  1. Guardar como .xml

    Para detectar las diferencias de una hoja de cálculo simple de una hoja, guarde las hojas de cálculo de Excel para compararlas como XML Spreadsheet 2003 con una extensión .xml.

  2. Guardar como .xlsx

    Para detectar las diferencias de la mayoría de las hojas de cálculo en un modelo de documento modularizado, guarde las hojas de cálculo de Excel para compararlas como un Libro de Excel en formato .xlsx. Abra los archivos a diff con diffdog. Le informa que el archivo es un archivo ZIP y le pregunta si desea abrirlo para comparar directorios. Al aceptar la comparación de directorios, se convierte en una cuestión relativamente simple hacer doble clic en las partes lógicas del documento para diferenciarlas (con el modo de diferencias XML). La mayoría de las partes del documento .xslx son datos con formato XML. La vista de cuadrícula es extremadamente útil. Es trivial diferenciar las hojas individuales para enfocar el análisis en áreas que se sabe que han cambiado.

La propensión de Excel a modificar ciertos nombres de atributos con cada guardado es molesto, pero las capacidades de diferenciación XML de diffdog incluyen la capacidad de filtrar ciertos tipos de diferencias. Por ejemplo, las hojas de cálculo de Excel en forma XML contienen rowy celementos que tienen satributos (estilo) de cambio de nombre que con cada parada. Configurar un filtro como c:shace que sea mucho más fácil ver solo los cambios de contenido.

diffdog tiene mucha capacidad de diferenciación. He enumerado los modos de diferencias XML solo porque no he usado otra herramienta que me haya gustado más cuando se trata de diferenciar documentos de Excel.


1

Encontré una macro de openoffice aquí que invocará la función de comparación de documentos de openoffice en dos archivos. Desafortunadamente, la comparación de la hoja de cálculo de openoffice parece un poco escasa; Acabo de hacer que el botón 'Rechazar todo' inserte una columna superflua en mi documento.


1

Complemento xdocdiff para SVN


xdocdiff se ve bien, pero parece requerir TortioseSVN
neu242

xdocdiff también tiene un complemento WinMerge, ambos usan xdoc2txt detrás de escena
Sogger

1

Si está utilizando Java, puede probar simple-excel .

Difundirá hojas de cálculo usando los emparejadores de Hamcrest y generará algo como esto.

java.lang.AssertionError:
Expected: entire workbook to be equal
     but: cell at "C14" contained <"bananas"> expected <nothing>,
          cell at "C15" contained <"1,850,000 EUR"> expected <"1,850,000.00 EUR">,
          cell at "D16" contained <nothing> expected <"Tue Sep 04 06:30:00">
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

Debería calificar que escribimos esa herramienta (al igual que la respuesta marcada rodó la suya).


2
Gracias por publicar tu respuesta! Asegúrese de leer atentamente las preguntas frecuentes sobre autopromoción. También tenga en cuenta que es necesario que publique un descargo de responsabilidad cada vez que enlace a su propio sitio / producto.
Andrew Barber

1

Si tiene TortoiseSVN, puede CTRLhacer clic en los dos archivos para seleccionarlos en el Explorador de Windows y luego hacer clic con el botón derecho en TortoiseSVN-> Diff.

Esto funciona particularmente bien si está buscando un pequeño cambio en un gran conjunto de datos.


Sin embargo, esto no funciona particularmente bien para archivos binarios como el formato XLS de Excel.
Charles Wood

1
@CharlesWood - en realidad hace el trabajo muy bien. Tortoise usa Excel para proporcionar el diff y resalta las diferentes celdas en rojo. No lo he probado, pero estoy bastante seguro de que también hace lo mismo para los archivos .doc y .docx de Word (usando Word como visor de diferencias).
Chris B

Whaaat! El mío no hace eso. ¿Es una característica nueva o instaló un complemento?
Charles Wood

:-D Tengo TortoiseSVN 1.7.12 y lo hace fuera de la caja. El archivo de ayuda indica que tiene soporte para esto: tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-diff.html . Utiliza un script para diferenciar los archivos que en mi máquina es C: \ Archivos de programa \ TortoiseSVN \ Diff-Scripts \ diff-xls.js. ¿Es posible que tenga una política de grupo en su máquina que haya deshabilitado los scripts?
Chris B

1

Tengo el problema como tú, así que decido escribir una pequeña herramienta para ayudarme. Por favor, consulte ExcelDiff_Tools . Viene con varios puntos clave:

  • Soporte xls, xlsx, xlsm.
  • Con fórmula celular. Comparará tanto la fórmula como el valor.
  • Intento hacer que la IU parezca un visor de texto de diferencias estándar con: estado modificado, eliminado, agregado, sin cambios. Por favor, eche un vistazo a la imagen a continuación, por ejemplo: ingrese la descripción de la imagen aquí


0

Diff Doc puede ser lo que estás buscando.

  • Compare documentos de MS Word (DOC, DOCX, etc.), Excel, PDF, texto enriquecido (RTF), texto, HTML, XML, PowerPoint o Wordperfect y conserve el formato
  • Elija cualquier parte de cualquier documento (archivo) y compárelo con cualquier parte del mismo documento (archivo) o diferente.

2
Diff Doc es solo de Windows y de código cerrado, realmente no se ajusta a mis necesidades.
neu242

0

No conozco ninguna herramienta, pero hay dos soluciones roll-your-own que me vienen a la mente, ambas requieren Excel:

  1. Podría escribir un código de VBA que recorra cada hoja de trabajo, fila, columna y celda de los dos libros de trabajo, informando diferencias.

  2. Si usa Excel 2007, puede guardar los libros de trabajo en formato Open-XML (* .xlsx), extraer el XML y diferenciarlo. El archivo Open-XML es esencialmente solo un archivo .zip de archivos y manifiestos .xml.

En cualquier caso, terminará con mucho "ruido" si sus hojas de cálculo no están estructuralmente "cerca".


Desde Excel 2002 en adelante, también puede guardar en formato 'Hoja de cálculo XML', que es más simple que tratar con archivos xlsx.
Sam Warwick

0

Convierta a cvs, luego cárguelo a un sistema de control de versiones y luego diff con una herramienta avanzada de control de versiones. Cuando utilicé forzar, tenía una gran herramienta de diferencias, pero olvido su nombre.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.