Jak utworzyć czytelną różnicę dwóch arkuszy kalkulacyjnych za pomocą git diff?

168

W naszym repozytorium kodu źródłowego mamy wiele arkuszy kalkulacyjnych (xls). Są one zwykle edytowane za pomocą gnumeric lub openoffice.org i są najczęściej używane do zapełniania baz danych do testów jednostkowych za pomocą dbUnit . Nie ma łatwych sposobów robienia różnic na plikach xls, o których wiem, a to sprawia, że ​​scalanie jest niezwykle żmudne i podatne na błędy.

Próbowałem przekonwertować arkusze kalkulacyjne do formatu xml i zrobić zwykły diff, ale naprawdę wydaje się, że to ostatnia deska ratunku.

Chciałbym przeprowadzić porównywanie (i scalanie) gittak samo, jak robię to z plikami tekstowymi. Jak bym to zrobił, np. Przy wydawaniu git diff?

neu242
źródło
4
Myślę, że tagi testowanie jednostkowe i dbunit są tutaj nieprawidłowo stosowane. Pytanie dotyczy porównania plików dla określonego formatu pliku i nie ma nic wspólnego z testowaniem jednostkowym.
Hamish Smith
1
Nie odpowiedź (wymaga programu Excel i jest produktem handlowym), ale dla ludzi sprowadzonych przez GooBinghoo - formulasoft.com/excel-compare.html działa dobrze dla mnie.
Facet z CAD
1
Używam tego skryptu w Pythonie do porównywania Excela, z którym meldujemy się w git. Przeniesowałem ten kod GO (który został przeniesiony z Perla) do Pythona: github.com/tokuhirom/git-xlsx-textconv#see-also Pozwala na użycie git diffigitk
nmz787
Prostym sposobem byłoby wyeksportowanie danych z obu arkuszy kalkulacyjnych jako CSV / tekst i wykonanie zwykłego porównania (z preferowanym edytorem lub plikami różnic)
PPC

Odpowiedzi:

109

Dokładnie ten sam problem napotkaliśmy w naszej współpracy. Nasze testy generują skoroszyty programu Excel. Różnica binarna nie wchodziła w grę. Dlatego wprowadziliśmy nasze własne proste narzędzie wiersza poleceń. Sprawdź projekt ExcelCompare . W rzeczywistości pozwala nam to całkiem ładnie zautomatyzować nasze testy. Prośby o poprawki / funkcje są mile widziane!

na_ka_na
źródło
2
@KimStacks yes działa dla wszystkich xls, xlsx, ods. I może nawet porównać dowolny typ z innym, np. Xls v / s xlsx.
na_ka_na
1
Świetne narzędzie ... ale jest tam napisane „Błąd porównania: błąd odczytu jako pliku Excela:” dla niektórych doskonale poprawnych plików xls. Dla każdego, kto szuka (znacznie gorszej, ze wszystkich innych punktów widzenia) alternatywy: zobacz github.com/toobaz/xlrd_diff
Pietro Battiston
2
@PietroBattiston pls zaloguj zgłoszenie na githubie i przyjrzę się temu.
na_ka_na
@na_ka_na Dziękujemy za stworzenie tego narzędzia!
jgpawletko
111

Szybko i łatwo bez zewnętrznych narzędzi, działa dobrze, o ile dwa porównywane arkusze są podobne:

  • Utwórz trzeci arkusz kalkulacyjny
  • Wpisz =if(Sheet1!A1 <> Sheet2!A1, "X", "")w lewą górną komórkę (lub równoważną: kliknij rzeczywiste komórki, aby automatycznie wstawić odniesienia do formuły)
  • Ctrl+C(kopiuj), Ctrl+A(zaznacz wszystko), Ctrl+V(wklej), aby wypełnić arkusz.

Jeśli arkusze są podobne, ten arkusz kalkulacyjny będzie pusty, z wyjątkiem kilku komórek z X, co podkreśla różnice. Zmniejsz powiększenie do 40%, aby szybko zobaczyć, co się zmieniło.

Laurent
źródło
6
Czy to nie daje porównania komórki do komórki? Mam na myśli to, że jeśli lewa strona ma jeden dodatkowy wiersz u góry, wszystkie pozostałe wiersze (i komórki) będą inne. Jeśli tak jest, nie jest to zbyt przydatne.
Hammad Khan
1
@Thecrocodilehunter: zawsze możesz usunąć ten wiersz u góry, a następnie porównać resztę. Jeśli różnice są znacznie bardziej złożone, potrzebujesz oczywiście innego narzędzia. Jest to przydatne w przypadku szybkich jednorazowych porównań, na przykład gdy program Excel mówi, że zmieniłeś arkusz kalkulacyjny i obawiasz się, że przypadkowo edytowałeś pole.
ikonoklast
1
Podobał mi się ten. Zamiast robić X, możesz też zrobić „1” i mieć SUMĘ jako pierwsze wiersze i kolumny. Dodaj som na pierwszym polu, a szybko zobaczysz, ile pól się różni.
Konerak
5
Zmieniłem nieco formułę, więc nie musiałem szukać dokładnych różnic. = JEŻELI (Arkusz1! A1 <> Arkusz2! A1, CONCATENATE ("Arkusz 1 =", Arkusz1! A1, "Arkusz 2 =", Arkusz2! A1), "")
Martyn
1
Możesz po prostu wpisać =Sheet1!A1=Sheet2!A1. Spowoduje to wydrukowanie TRUE lub FALSE. Następnie możesz wykonać formatowanie warunkowe =countif(A1:B2, FALSE)lub coś podobnego.
user2023861
12

W przeszłości wiele razy porównywałem skoroszyty programu Excel. Moja technika działa bardzo dobrze w przypadku skoroszytów z wieloma arkuszami roboczymi, ale porównuje tylko zawartość komórek, a nie formatowanie komórek, makra itp. Jest też zaangażowane pewne kodowanie, ale warto, jeśli musisz wielokrotnie porównywać wiele dużych plików. Oto jak to działa:

A) Napisz prosty program zrzutowy, który przechodzi przez wszystkie arkusze i zapisuje wszystkie dane w plikach rozdzielonych tabulatorami. Utwórz jeden plik na arkusz (użyj nazwy arkusza jako nazwy pliku, np. „MyWorksheet.tsv”) i utwórz nowy folder dla tych plików za każdym razem, gdy uruchamiasz program. Nazwij folder po nazwie pliku programu Excel i dodaj sygnaturę czasową, np. „20080922-065412-MyExcelFile”. Zrobiłem to w Javie, używając biblioteki o nazwie JExcelAPI . To naprawdę całkiem proste.

B) Dodaj rozszerzenie powłoki systemu Windows, aby uruchomić nowy program Java od kroku A po kliknięciu prawym przyciskiem myszy pliku Excel. To sprawia, że ​​uruchomienie tego programu jest bardzo łatwe. Potrzebujesz Google, jak to zrobić, ale jest to tak proste, jak napisanie pliku * .reg.

C) Uzyskaj BeyondCompare . Ma bardzo fajną funkcję porównywania ograniczonych danych, pokazując je w ładnej tabeli, patrz zrzut ekranu .

D) Teraz możesz z łatwością porównywać pliki Excela. Kliknij prawym przyciskiem myszy plik Excel 1 i uruchom program zrzutowy. Utworzy folder z jednym plikiem na arkusz roboczy. Kliknij prawym przyciskiem myszy plik Excela 2 i uruchom program zrzutowy. Utworzy drugi folder z jednym plikiem na arkusz roboczy. Teraz użyj BeyondCompare (BC), aby porównać foldery. Każdy plik reprezentuje arkusz roboczy, więc jeśli istnieją różnice w arkuszu, BC to pokaże i możesz przejść do szczegółów i przeprowadzić porównanie plików. BC pokaże porównanie w ładnym układzie tabeli i możesz ukryć wiersze i kolumny, które Cię nie interesują.

thvo
źródło
12

Możesz wypróbować to bezpłatne narzędzie online - www.cloudyexcel.com/compare-excel/

Daje dobry efekt wizualny online, pod względem dodanych, usuniętych, zmienionych wierszy itp.

wprowadź opis obrazu tutaj

Ponadto nie musisz niczego instalować.

Shashank Singla
źródło
Niestety działa tylko dla plików <2 MB. W każdym razie może zadziałać dla kogoś innego.
MikeVelazco
10

Znalazłem wtyczkę xdocdiff WinMerge . Jest to wtyczka do WinMerge (zarówno OpenSource, jak i Freeware , nie musisz pisać VBA ani zapisywać excela do csv lub xml). Działa tylko dla zawiera celd.

Ta wtyczka obsługuje również:

  • .rtf Tekst sformatowany
  • .docx / .docm Microsoft WORD 2007 (OOXML)
  • .xlsx / .xlsm Microsoft Excel 2007 (OOXML)
  • .pptx / .pptm Microsoft PowerPoint 2007 (OOXML)
  • .doc Microsoft WORD w wersji 5.0 / 95/97/2000 / XP / 2003
  • .xls Microsoft Excel w wersji 5.0 / 95/97/2000 / XP / 2003
  • .ppt Microsoft PowerPoint 97/2000 / XP / 2003
  • .sxw / .sxc / .sxi / .sxd OpenOffice.org
  • .odt / .ods / .odp / .odg Otwórz dokument
  • .wj2 / wj3 / wk3 / wk4 / 123 Lotus 123
  • .wri Windows 3.1 Zapis
  • .pdf Adobe PDF
  • .mht Archiwum internetowe
  • .eml Wyeksportowane pliki z OutlookExpress

Pozdrawiam, Andres

Andres
źródło
1
Niestety nie pozwala na zapisywanie zmian w rozpakowanych plikach, więc nie jest przydatna do scalania. Jest to jednak bezpłatne.
Sogger,
6

Hmmm. Z menu Excela wybierz Okno -> Porównaj obok siebie?


źródło
+1 działa dobrze, ale nie podkreśla różnic w Office 2007. Myślę, że w starszych wersjach tak. Nadal bardzo dobry do wizualnego porównania.
Hammad Khan
2
tak, nie ma podświetlania, więc jedyną korzyścią jest synchroniczne przewijanie.
Sogger,
5

Czy używasz TortoiseSVN do wykonywania zatwierdzeń i aktualizacji w Subversion? Ma narzędzie do porównywania, jednak porównywanie plików Excela nadal nie jest przyjazne dla użytkownika. W moim środowisku (Win XP, Office 2007) otwiera dwa pliki Excela do porównania.

Kliknij prawym przyciskiem myszy dokument> Tortoise SVN> Pokaż dziennik> wybierz wersję> kliknij prawym przyciskiem myszy „Porównaj z kopią roboczą”.

Kacper
źródło
4

Nowsze wersje MS Office są wyposażone w funkcję Porównywanie arkuszy kalkulacyjnych , która wykonuje całkiem niezłą różnicę w GUI. Wykrywa większość rodzajów zmian.

Zły duch
źródło
Chociaż ta odpowiedź prawdopodobnie nie pomoże w sytuacji OP przy diffscalaniu opartym na wierszu poleceń , to narzędzie porównywania arkuszy kalkulacyjnych było idealne do moich celów (sprawdzanie różnic między wynikami automatyzacji OpenXML a danymi wyjściowymi automatyzacji Excel COM).
ErrCode
Uwaga: próbowałem zbadać automatyzację za pomocą tego narzędzia, ale nie zadziałało (narzędzie po prostu ulegało awarii): stackoverflow.com/a/35905262/7270462
ErrCode
4

Istnieje biblioteka daff (skrót od data diff), która pomaga w porównywaniu tabel, tworzeniu podsumowania ich różnic i używaniu takiego podsumowania jako pliku łatki.

Jest napisany w języku Haxe, więc można go skompilować w głównych językach.

Stworzyłem narzędzie Excel Diff w Javascript z pomocą tej biblioteki. Działa dobrze z liczbami i małymi ciągami, ale wynik nie jest idealny dla długich ciągów (np. Długiego zdania z niewielkimi zmianami znaków).

shubhu
źródło
3

Wiem, że kilka odpowiedzi sugerowało wyeksportowanie pliku do csv lub innego formatu tekstowego, a następnie porównanie ich. Nie widziałem tego konkretnie, ale Beyond Compare 3 ma wiele dodatkowych formatów plików, które obsługuje. Zobacz Dodatkowe formaty plików . Korzystając z jednego z formatów plików programu Microsoft Excel, można łatwo porównać dwa pliki programu Excel bez konieczności eksportowania do innej opcji formatu.

mattsmith321
źródło
2

Użyłbym formatu pliku SYLK, jeśli ważne jest wykonywanie różnic. Jest to format tekstowy, dzięki czemu porównania powinny być łatwiejsze i bardziej zwarte niż format binarny. Jest również kompatybilny z Excel, Gnumeric i OpenOffice.org, więc wszystkie trzy narzędzia powinny dobrze ze sobą współpracować. Artykuł SYLK w Wikipedii

Adam Hawkes
źródło
Jest to świetne rozwiązanie, które powinno być przyjęte jako powszechna praktyka w środowiskach, które często używają git z plikami Excel (i innymi plikami). Jest zdecydowanie przyjazny dla "git" (chociaż różnice nie są czytelne dla ludzi) i nie wymaga żadnych dodatkowych narzędzi poza "nowoczesnym" Excelem (teraz jest 2019). Jest to również „dwukierunkowe”, co oznacza, że ​​inni użytkownicy mogą zapisywać swoje arkusze kalkulacyjne Excela w formacie .slk (SYLK), a następnie otwierać je z całym odpowiednim formatowaniem itp. W programie Excel w razie potrzeby.
D. Woods,
2

Użyj Altova DiffDog

Użyj trybu różnicowania XML diffdog i widoku siatki, aby przejrzeć różnice w łatwym do odczytania formacie tabelarycznym. Różnicowanie tekstu jest DUŻO TRUDNIEJSZE w przypadku arkuszy kalkulacyjnych o dowolnej złożoności. Dzięki temu narzędziu co najmniej dwie metody są możliwe w różnych okolicznościach.

  1. Zapisz jako .xml

    Aby wykryć różnice w prostym, jednoarkuszowym arkuszu kalkulacyjnym, zapisz arkusze kalkulacyjne programu Excel w celu porównania jako arkusz kalkulacyjny XML 2003 z rozszerzeniem .xml.

  2. Zapisz jako .xlsx

    Aby wykryć różnice między większością arkuszy kalkulacyjnych w modelu dokumentu modułowego, zapisz arkusze kalkulacyjne programu Excel w celu porównania jako skoroszyt programu Excel w formacie .xlsx. Otwórz pliki do porównania z diffdog. Informuje, że plik jest archiwum ZIP i pyta, czy chcesz go otworzyć w celu porównania katalogów. Po wyrażeniu zgody na porównanie katalogów staje się stosunkowo prostą kwestią dwukrotnego kliknięcia logicznych części dokumentu w celu ich porównania (w trybie porównywania XML). Większość części dokumentu .xslx to dane w formacie XML. Widok siatki jest niezwykle przydatny. Łatwo jest odróżnić poszczególne arkusze, aby skupić analizę na obszarach, o których wiadomo, że uległy zmianie.

Skłonność Excela do modyfikowania niektórych nazw atrybutów przy każdym zapisie jest irytująca, ale możliwości różnicowania XML przez diffdog obejmują możliwość filtrowania pewnych rodzajów różnic. Na przykład, arkusze kalkulacyjne Excel w postaci XML zawierają rowi celementy, które mają satrybutów (styl), które Zmień nazwę przy każdym zapisywaniu. Skonfigurowanie takiego filtra c:sznacznie ułatwia przeglądanie tylko zmian treści.

diffdog ma wiele możliwości różnicowania. Wymieniłem tryby różnic XML tylko dlatego, że nie korzystałem z innego narzędzia, które bardziej mi się podobało, jeśli chodzi o różnicowanie dokumentów Excel.

kbulgrien
źródło
1

Znalazłem tutaj makro openoffice , które wywoła funkcję porównywania dokumentów openoffice na dwóch plikach. Niestety, porównanie arkusza kalkulacyjnego openoffice wydaje się trochę niepewne; Właśnie kazałem przyciskowi „Odrzuć wszystko” wstawić zbędną kolumnę w moim dokumencie.


źródło
1

Wtyczka xdocdiff dla SVN

graveDust
źródło
xdocdiff wygląda ładnie, ale wydaje się, że wymaga
TortioseSVN
xdocdiff ma również wtyczkę WinMerge, oba używają xdoc2txt za kulisami
Sogger,
1

Jeśli używasz Javy, możesz spróbować simple-excel .

Porówna arkusze kalkulacyjne za pomocą dopasowań Hamcrest i wyświetli coś takiego.

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)

Powinienem zakwalifikować, że napisaliśmy to narzędzie (tak jak zaznaczona odpowiedź wyrzuciła własną).

Toby
źródło
2
Dziękujemy za przesłanie odpowiedzi! Przeczytaj uważnie często zadawane pytania dotyczące autopromocji . Należy również pamiętać, że jest to konieczne , aby umieścić disclaimer każdym razem, gdy odwołują się do swojej własnej strony / produktu.
Andrew Barber,
1

Jeśli masz TortoiseSVN, możesz CTRLkliknąć dwa pliki, aby wybrać je w Eksploratorze Windows, a następnie kliknąć prawym przyciskiem myszy, TortoiseSVN-> Porównaj.

Działa to szczególnie dobrze, jeśli szukasz niewielkiej zmiany w dużym zestawie danych.

Chris B.
źródło
Nie działa to jednak szczególnie dobrze w przypadku plików binarnych, takich jak format XLS programu Excel.
Charles Wood
1
@CharlesWood - faktycznie to robi pracę szczególnie dobrze. Tortoise używa samego Excela, aby zapewnić różnicę i podświetla różne komórki na czerwono. Nie próbowałem tego, ale jestem prawie pewien, że robi to samo z plikami Word .doc i .docx (używając Worda jako przeglądarki różnic).
Chris B
Whaaat! Mój tego nie robi. Czy to nowa funkcja, czy zainstalowałeś wtyczkę?
Charles Wood
:-D Mam TortoiseSVN 1.7.12 i robi to po wyjęciu z pudełka. Plik pomocy stwierdza, że ​​obsługuje to - tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-diff.html . Używa skryptu do porównywania plików, które na moim komputerze to C: \ Program Files \ TortoiseSVN \ Diff-Scripts \ diff-xls.js. Czy to możliwe, że masz na komputerze zasady grupy, które wyłączyły skrypty?
Chris B,
1

Mam problem tak jak Ty, więc zdecydowałem się napisać małe narzędzie, które mi pomoże. Proszę sprawdzić ExcelDiff_Tools . Zawiera kilka kluczowych punktów:

  • Obsługa xls, xlsx, xlsm.
  • Z komórką formuły. Porównuje zarówno formułę, jak i wartość.
  • Staram się, aby interfejs użytkownika wyglądał jak standardowa przeglądarka tekstu różnicowego ze statusem: zmodyfikowano, usunięto, dodano, niezmieniony. Proszę spojrzeć na poniższy obrazek, na przykład: wprowadź opis obrazu tutaj
kokichi88
źródło
1

Jestem współautorem darmowego rozszerzenia Git o otwartym kodzie źródłowym:

https://github.com/ZoomerAnalytics/git-xltrail

Dzięki temu Git działa z dowolnym formatem pliku skoroszytu programu Excel bez żadnych obejść.

Bjoern Stiel
źródło
0

Diff Doc może być tym, czego szukasz.

  • Porównaj dokumenty MS Word (DOC, DOCX itp.), Excel, PDF, Rich Text (RTF), Tekst, HTML, XML, PowerPoint lub Wordperfect i zachowaj formatowanie
  • Wybierz dowolną część dowolnego dokumentu (pliku) i porównaj ją z dowolną częścią tego samego lub innego dokumentu (pliku).
Conroy P.
źródło
2
Diff Doc jest zamkniętym źródłem tylko dla systemu Windows, naprawdę nie pasuje do moich potrzeb.
neu242
0

Nie znam żadnych narzędzi, ale przychodzą mi do głowy dwa rozwiązania typu roll-your-own, oba wymagają Excela:

  1. Możesz napisać kod VBA, który przechodzi przez każdy arkusz roboczy, wiersz, kolumnę i komórkę w dwóch skoroszytach, zgłaszając różnice.

  2. Jeśli używasz programu Excel 2007, możesz zapisać skoroszyty w formacie Open-XML (* .xlsx), wyodrębnić XML i porównać to. Plik Open-XML to po prostu plik .zip zawierający pliki .xml i manifesty.

W obu przypadkach skończysz z dużym „szumem”, jeśli Twoje arkusze kalkulacyjne nie są strukturalnie „zamknięte” na początku.

lesscode
źródło
Począwszy od programu Excel 2002 można również zapisywać w formacie „arkusza kalkulacyjnego XML”, co jest prostsze niż w przypadku plików xlsx.
Sam Warwick,
0

Konwertuj na cvs, a następnie prześlij do systemu kontroli wersji, a następnie porównaj za pomocą zaawansowanego narzędzia do porównywania kontroli wersji. Kiedy używałem sił, było to świetne narzędzie do porównywania, ale zapomniałem jego nazwy.

patrick
źródło