Come faccio a creare una diff leggibile di due fogli di calcolo usando git diff?


168

Abbiamo molti fogli di calcolo (xls) nel nostro repository di codice sorgente. Questi sono di solito modificati con gnumeric o openoffice.org e sono usati principalmente per popolare database per unit test con dbUnit . Non ci sono modi semplici per fare differenze sui file xls che conosco e questo rende la fusione estremamente noiosa e soggetta a errori.

Ho provato a convertire i fogli di calcolo in XML e fare un diff regolare, ma sembra davvero che dovrebbe essere l'ultima risorsa.

Mi piacerebbe eseguire il diffing (e l'unione) con gitcome faccio con i file di testo. Come lo farei, ad esempio durante l'emissione git diff?


4
Penso che i tag unit test e dbunit vengano applicati in modo errato qui. La domanda riguarda il confronto dei file per un formato di file specifico e non ha nulla a che fare con i test unitari.
Hamish Smith,

1
Non una risposta (richiede Excel ed è un prodotto commerciale) ma per le persone portate qui da GooBinghoo - formulasoft.com/excel-compare.html funziona bene per me.
Bloke CAD,

1
Uso questo script Python per diffondere Excel che eseguiamo il check-in in git. Ho portato questo codice GO (che è stato portato da Perl) su Python: github.com/tokuhirom/git-xlsx-textconv#see- anche Ti permette di usare git diffegitk
nmz787


Un modo semplice sarebbe esportare i dati di entrambi i fogli di calcolo come CSV / testo e fare un diff regolare (con il tuo editor preferito o file diff)
PPC

Risposte:


109

Abbiamo affrontato lo stesso identico problema nel nostro co. I nostri test hanno prodotto eccellenti cartelle di lavoro. Il diff binario non era un'opzione. Quindi abbiamo implementato il nostro semplice strumento da riga di comando. Scopri il progetto di ExcelCompare . Questo ci consente di automatizzare i nostri test abbastanza bene. Richieste di patch / funzionalità sono ben accette!


2
@KimStacks yes funziona per tutte le xls, xlsx, ods. E può anche confrontare qualsiasi tipo con l'altro, ad esempio xls v / s xlsx.
na_ka_na,

1
Ottimo strumento ... ma dice "Diff failed: Impossibile leggere come file excel:" per alcuni file xls perfettamente validi. Per chiunque cerchi un'alternativa (molto più povera, sotto tutti gli altri punti di vista): vedi github.com/toobaz/xlrd_diff
Pietro Battiston

2
@PietroBattiston per favore registra un biglietto in github e lo guarderò.
na_ka_na,

@na_ka_na Grazie per aver creato questo strumento!
jgpawletko,

111

Facile e veloce senza strumenti esterni, funziona bene finché i due fogli che stai confrontando sono simili:

  • Crea un terzo foglio di calcolo
  • Digita =if(Sheet1!A1 <> Sheet2!A1, "X", "")la cella in alto a sinistra (o equivalente: fai clic sulle celle effettive per inserire automaticamente i riferimenti nella formula)
  • Ctrl+C(copia), Ctrl+A(seleziona tutto), Ctrl+V(incolla) per riempire il foglio.

Se i fogli sono simili, questo foglio di calcolo sarà vuoto ad eccezione di alcune celle con X, evidenziando le differenze. Unzoom al 40% per vedere rapidamente cosa è diverso.


6
Questo non fa il confronto cellula per cellula? Voglio dire, se la parte sinistra ha una riga in più in alto, le diverse righe (e celle) saranno diverse. Se è così, non è molto utile.
Hammad Khan,

1
@Throcrocodilehunter: puoi sempre eliminare quella riga in alto e poi confrontare il resto. Se le differenze sono molto più complesse, ovviamente hai bisogno di uno strumento diverso. Questo è utile per rapidi confronti una tantum, come quando Excel dice che hai cambiato il foglio di calcolo e hai paura di aver modificato accidentalmente un campo.
iconoclasta,

1
Mi è piaciuto questo. Invece di fare X, puoi anche fare "1" e avere una somma come prime righe e colonne. Aggiungi un som sul primo campo e vedrai rapidamente quanti campi differiscono.
Konerak,

5
Ho cambiato un po 'la formula, quindi non ho dovuto andare a vedere quali fossero le differenze esatte. = IF (Foglio1! A1 <> Foglio2! A1, CONCATENATO ("Foglio 1 =", Foglio1! A1, "Foglio 2 =", Foglio2! A1), "")
Martyn

1
Puoi semplicemente digitare =Sheet1!A1=Sheet2!A1. Questo stamperà VERO o FALSO. È quindi possibile eseguire la formattazione condizionale =countif(A1:B2, FALSE)o qualcosa di simile.
user2023861

12

Ho confrontato molto le cartelle di lavoro di Excel in passato. La mia tecnica funziona molto bene per le cartelle di lavoro con molti fogli di lavoro, ma confronta solo i contenuti delle celle, non la formattazione delle celle, le macro, ecc. Inoltre, c'è un po 'di codice in questione, ma vale la pena se devi confrontare molti file di grandi dimensioni ripetutamente. Ecco come funziona:

A) Scrivi un semplice programma di dump che passi attraverso tutti i fogli di lavoro e salvi tutti i dati in file separati da tabulazioni. Crea un file per foglio di lavoro (usa il nome del foglio di lavoro come nome file, ad esempio "MyWorksheet.tsv") e crea una nuova cartella per questi file ogni volta che esegui il programma. Assegna un nome alla cartella dopo il nome file Excel e aggiungi un timestamp, ad esempio "20080922-065412-MyExcelFile". L'ho fatto in Java usando una libreria chiamata JExcelAPI . È davvero abbastanza facile.

B) Aggiungere un'estensione della shell di Windows per eseguire il nuovo programma Java dal passaggio A quando si fa clic con il pulsante destro del mouse su un file Excel. Questo rende molto facile eseguire questo programma. Devi fare come fare a Google, ma è facile come scrivere un file * .reg.

C) Ottieni BeyondCompare . Ha una funzionalità molto interessante per confrontare i dati delimitati mostrandoli in una bella tabella, vedi screenshot .

D) Ora sei pronto per confrontare facilmente i file Excel. Fare clic con il tasto destro del mouse sul file Excel 1 ed eseguire il programma di dump. Creerà una cartella con un file per foglio di lavoro. Fare clic con il tasto destro del mouse sul file Excel 2 ed eseguire il programma di dump. Creerà una seconda cartella con un file per foglio di lavoro. Ora usa BeyondCompare (BC) per confrontare le cartelle. Ogni file rappresenta un foglio di lavoro, quindi se ci sono differenze in un foglio di lavoro BC lo mostrerà e sarà possibile eseguire il drill down e fare un confronto dei file. BC mostrerà il confronto in un bel layout di tabella e puoi nascondere righe e colonne che non ti interessano.



10

Ho trovato xdocdiff WinMerge Plugin . È un plugin per WinMerge (sia OpenSource che Freeware , non è necessario scrivere un VBA né salvare un Excel in CSV o XML). Funziona solo per i contenuti della cartella.

Questo plugin supporta anche:

  • .rtf Rich Text
  • .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 Apri documento
  • .wj2 / wj3 / wk3 / wk4 / 123 Lotus 123
  • .wri Windows3.1 Write
  • .pdf Adobe PDF
  • .mht Web Archive
  • .eml File esportati da OutlookExpress

Saluti, Andres


1
Sfortunatamente, non consente il salvataggio delle modifiche ai file decompressi, quindi non è utile per l'unione. È gratuito però.
Sogger

6

Hmmm. Dal menu Excel scegliere Finestra -> Confronta fianco a fianco?


+1 funziona bene ma non mette in evidenza le differenze in ufficio 2007. Immagino che nelle versioni precedenti lo faccia. Ancora molto buono per il confronto visivo.
Hammad Khan,

2
sì, non c'è evidenziazione, quindi l'unico vantaggio è lo scorrimento sincrono.
Soggetto

5

Usi TortoiseSVN per eseguire i tuoi commit e gli aggiornamenti in sovversione? Ha uno strumento diff, tuttavia il confronto di file Excel non è ancora molto facile da usare. Nel mio ambiente (Win XP, Office 2007), apre due file Excel per il confronto fianco a fianco.

Documento clic destro> Tortoise SVN> Mostra registro> seleziona revisione> clic destro per "Confronta con copia di lavoro".


4

Le versioni più recenti di MS Office vengono fornite con Spreadsheet Compare , che esegue una differenza abbastanza piacevole in una GUI. Rileva la maggior parte dei cambiamenti.


Sebbene questa risposta probabilmente non aiuterà la situazione di OP con diffun'unione basata su riga di comando , questo strumento di confronto di fogli di calcolo è stato perfetto per i miei scopi (verificando le differenze tra l'output di automazione OpenXML e l'output di automazione COM di Excel).
ErrCode

Nota: ho provato ad indagare l'automazione utilizzando questo strumento, ma non ha funzionato per me (strumento appena tenuto crash): stackoverflow.com/a/35905262/7270462
ErrCode

4

C'è una libreria daff (abbreviazione di data diff) che aiuta a confrontare le tabelle, a produrre un riepilogo delle loro diff e ad usare un sommario come un file patch.

È scritto in Haxe, quindi può essere compilato nelle principali lingue.

Ho creato uno strumento Excel Diff in Javascript con l'aiuto di questa libreria. Funziona bene con numeri e stringhe piccole ma l'output non è ideale per stringhe lunghe (ad es. Una frase lunga con un cambio di carattere minore).


3

So che diverse risposte hanno suggerito di esportare il file in CSV o in qualche altro formato di testo, e quindi di confrontarli. Non l'ho visto menzionato in modo specifico, ma Beyond Compare 3 ha una serie di formati di file aggiuntivi che supporta. Vedi formati di file aggiuntivi . Utilizzando uno dei formati di file di Microsoft Excel è possibile confrontare facilmente due file di Excel senza passare all'esportazione in un'altra opzione di formato.


2

Vorrei utilizzare il formato di file SYLK se l'esecuzione delle differenze è importante. È un formato basato su testo, che dovrebbe rendere i confronti più facili e compatti di un formato binario. È compatibile anche con Excel, Gnumeric e OpenOffice.org, quindi tutti e tre gli strumenti dovrebbero essere in grado di lavorare bene insieme. Articolo di SYLK Wikipedia


Questa è un'ottima soluzione che dovrebbe essere adottata come pratica comune in ambienti che utilizzano frequentemente git con file Excel (e altri file). È sicuramente "git" (anche se i diff non sono super leggibili dall'uomo) e non richiede strumenti extra oltre "Excel" moderno (è il 2019 ora). È anche "bidirezionale", il che significa che altri utenti possono salvare i loro fogli di calcolo Excel in formato .slk (SYLK) e quindi aprirsi con tutta la formattazione corretta, ecc. In Excel quando necessario.
D. Woods,

2

Usa Altova DiffDog

Utilizzare la modalità diff XML di diffdog e la vista griglia per rivedere le differenze in un formato tabulare di facile lettura. La differenza di testo è MOLTO DIFFICILE per fogli di calcolo di qualsiasi complessità. Con questo strumento, almeno due metodi sono praticabili in varie circostanze.

  1. Salva come .xml

    Per rilevare le differenze di un semplice foglio di calcolo a un foglio, salvare i fogli di calcolo di Excel per confrontarli come XML Spreadsheet 2003 con un'estensione .xml.

  2. Salva come .xlsx

    Per rilevare le differenze della maggior parte dei fogli di calcolo in un modello di documento modulare, salvare i fogli di calcolo di Excel per confrontarli come cartella di lavoro di Excel in formato .xlsx. Apri i file per diff con diffdog. Ti informa che il file è un archivio ZIP e ti chiede se vuoi aprirlo per il confronto delle directory. Accettando il confronto delle directory, diventa relativamente semplice fare doppio clic su parti logiche del documento per diffonderle (con la modalità diff XML). La maggior parte delle parti del documento .xslx sono dati in formato XML. La vista griglia è estremamente utile. È banale diffondere i singoli fogli per focalizzare l'analisi su aree che sono note per essere cambiate.

La propensione di Excel a modificare determinati nomi di attributi con ogni salvataggio è fastidiosa, ma le funzionalità di diffing XML di diffdog includono la possibilità di filtrare determinati tipi di differenze. Ad esempio, i fogli di calcolo di Excel in formato XML contengono rowe cgli elementi che hanno sattributi (stile) che rinominare con ogni salvataggio. L'impostazione di un filtro come c:srende molto più semplice visualizzare solo le modifiche al contenuto.

diffdog ha molte funzionalità diff. Ho elencato le modalità diff XML solo perché non ho usato un altro strumento che mi è piaciuto di più quando si tratta di differenziare i documenti Excel.


1

Ho trovato qui una macro di openoffice che richiamerà la funzione di confronto dei documenti di openoffice su due file. Sfortunatamente, il confronto del foglio di calcolo di Openoffice sembra un po 'traballante; Ho appena avuto il pulsante 'Rifiuta tutto' per inserire una colonna superflua nel mio documento.


1

plugin xdocdiff per SVN


xdocdiff sembra carino, ma sembra richiedere TortioseSVN
neu242

xdocdiff ha anche un plugin WinMerge, entrambi usano xdoc2txt dietro le quinte
Sogger

1

Se stai usando Java, potresti provare simple-excel .

Diffonderà i fogli di calcolo usando gli abbinamenti Hamcrest e produrrà qualcosa del genere.

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)

Dovrei qualificarmi per aver scritto quello strumento (come se la risposta barrata fosse la propria).


2
Grazie per aver pubblicato la tua risposta! Assicurati di leggere attentamente le FAQ sull'autopromozione . Si noti inoltre che è necessario pubblicare un disclaimer ogni volta che si collega al proprio sito / prodotto.
Andrew Barber,

1

Se si dispone di TortoiseSVN, è possibile CTRLfare clic sui due file per selezionarli in Esplora risorse, quindi fare clic con il pulsante destro del mouse, TortoiseSVN-> Diff.

Funziona particolarmente bene se stai cercando una piccola modifica in un set di dati di grandi dimensioni.


Questo non funziona particolarmente bene, tuttavia, per file binari come il formato XLS di Excel.
Charles Wood,

1
@CharlesWood - in realtà fa il lavoro particolarmente bene. Tortoise utilizza Excel stesso per fornire il diff ed evidenzia le diverse celle in rosso. Non l'ho provato, ma sono abbastanza sicuro che fa lo stesso anche per i file Word .doc e .docx (usando Word che è il visualizzatore di differenze).
Chris B,

Whaaat! Il mio non lo fa. È una nuova funzionalità o hai installato un plug-in?
Charles Wood,

MrGreen Ho TortoiseSVN 1.7.12 e lo fa fuori dalla scatola. Il file di aiuto afferma che ha il supporto per questo - tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-diff.html . Usa uno script per diffrare i file che sulla mia macchina è C: \ Programmi \ TortoiseSVN \ Diff-Scripts \ diff-xls.js. È possibile che tu abbia una politica di gruppo sul tuo computer che ha disabilitato gli script?
Chris B,

1

Ho il problema come te, quindi decido di scrivere un piccolo strumento per aiutarmi. Si prega di controllare ExcelDiff_Tools . Viene fornito con diversi punti chiave:

  • Supporta xls, xlsx, xlsm.
  • Con cella formula. Confronterà sia la formula che il valore.
  • Cerco di rendere l'interfaccia utente simile al visualizzatore di testi diff standard con: stato modificato, cancellato, aggiunto, invariato. Si prega di dare un'occhiata con l'immagine qui sotto per esempio: inserisci qui la descrizione dell'immagine


0

Diff Doc potrebbe essere quello che stai cercando.

  • Confronta i documenti di MS Word (DOC, DOCX ecc.), Excel, PDF, Rich Text (RTF), Text, HTML, XML, PowerPoint o Wordperfect e mantieni la formattazione
  • Scegli una parte di qualsiasi documento (file) e confrontala con qualsiasi parte dello stesso o diverso documento (file).

2
Diff Doc è solo per Windows e chiuso, non soddisfa davvero le mie esigenze.
neu242,

0

Non conosco nessuno strumento, ma ci sono due soluzioni roll-your-own che mi vengono in mente, entrambe richiedono Excel:

  1. È possibile scrivere un codice VBA che passi attraverso ciascun foglio di lavoro, riga, colonna e cella delle due cartelle di lavoro, riportando le differenze.

  2. Se si utilizza Excel 2007, è possibile salvare le cartelle di lavoro in formato Open-XML (* .xlsx), estrarre l'XML e diff. Il file Open-XML è essenzialmente solo un file .zip di file .xml e manifest.

Ti ritroverai con molto "rumore" in entrambi i casi se i tuoi fogli di calcolo non sono strutturalmente "vicini" all'inizio.


Da Excel 2002 in poi puoi anche salvare nel formato 'Foglio di calcolo XML' che è più semplice che gestire i file xlsx.
Sam Warwick,

0

Converti in cvs, quindi caricalo su un sistema di controllo della versione, quindi diff con uno strumento avanzato per il controllo della versione. Quando ho usato perforce aveva un ottimo strumento diff, ma ne dimentico il nome.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.