Làm cách nào để tạo một khác biệt có thể đọc được của hai bảng tính bằng git diff?


168

Chúng tôi có rất nhiều bảng tính (xls) trong kho lưu trữ mã nguồn của mình. Chúng thường được chỉnh sửa bằng gnumeric hoặc openoffice.org và chủ yếu được sử dụng để điền vào cơ sở dữ liệu để kiểm tra đơn vị với dbUnit . Không có cách dễ dàng nào để thực hiện các khác biệt trên các tệp xls mà tôi biết và điều này làm cho việc hợp nhất trở nên vô cùng tẻ nhạt và dễ bị lỗi.

Tôi đã cố gắng chuyển đổi bảng tính thành xml và thực hiện một khác thường xuyên, nhưng nó thực sự cảm thấy như đó là phương sách cuối cùng.

Tôi muốn thực hiện phân biệt (và hợp nhất) gitnhư tôi làm với các tệp văn bản. Làm thế nào tôi có thể làm điều này, ví dụ như khi ban hành git diff?


4
Tôi nghĩ rằng các thẻ kiểm thử đơn vị và dbunit được áp dụng không chính xác ở đây. Câu hỏi là về so sánh tệp cho một định dạng tệp cụ thể và không liên quan gì đến kiểm tra đơn vị.
Hamish Smith

1
Không phải là một câu trả lời (nó đòi hỏi Excel & là một sản phẩm thương mại) nhưng đối với người mang tới đây bởi GooBinghoo - formulasoft.com/excel-compare.html hoạt động tốt đối với tôi.
CAD bloke

1
Tôi sử dụng tập lệnh Python này để phân biệt Excel mà chúng tôi đăng ký để git. Tôi đã chuyển mã GO này (được chuyển từ Perl) sang Python: github.com/tokuhirom/git-xlsx-textconv#see-also Nó cho phép bạn sử dụng git diffgitk
nmz787


Một cách đơn giản để đi là xuất dữ liệu của cả hai bảng tính dưới dạng CSV / văn bản và thực hiện tìm khác biệt thông thường (với trình chỉnh sửa ưa thích hoặc tệp khác của bạn)
PPC

Câu trả lời:


109

Chúng tôi phải đối mặt với cùng một vấn đề trong đồng của chúng tôi. Bài kiểm tra đầu ra excel của chúng tôi. Nhị phân khác biệt không phải là một lựa chọn. Vì vậy, chúng tôi đã triển khai công cụ dòng lệnh đơn giản của riêng mình. Kiểm tra dự án ExcelCompare . Thực tế điều này cho phép chúng tôi tự động hóa các bài kiểm tra của chúng tôi khá độc đáo. Bản vá lỗi / Yêu cầu tính năng khá hoan nghênh!


2
@KimStacks có hoạt động cho tất cả xls, xlsx, ods. Và thậm chí có thể so sánh bất kỳ loại nào với loại khác, ví dụ xls v / s xlsx.
na_ka_na

1
Công cụ tuyệt vời ... nhưng nó nói "Diff fail: Không thể đọc dưới dạng tệp excel:" đối với một số tệp xls hoàn toàn hợp lệ. Đối với bất kỳ ai đang tìm kiếm một sự thay thế (nghèo hơn nhiều, từ tất cả các quan điểm khác): xem github.com/toobaz/xlrd_diff
Pietro Battiston

2
@PietroBattiston vui lòng đăng nhập một vé trong github và tôi sẽ xem xét nó.
na_ka_na

@na_ka_na Cảm ơn bạn đã tạo ra công cụ này!
jgpawletko

111

Nhanh chóng và dễ dàng không có công cụ bên ngoài, hoạt động tốt miễn là hai tờ bạn đang so sánh là tương tự nhau:

  • Tạo bảng tính thứ ba
  • Kiểu =if(Sheet1!A1 <> Sheet2!A1, "X", "") vào ô trên cùng bên trái (hoặc tương đương: nhấp vào các ô thực tế để tự động chèn các tham chiếu vào công thức)
  • Ctrl+C(sao chép), Ctrl+A(chọn tất cả), Ctrl+V(dán) để điền vào tờ.

Nếu các trang tính tương tự nhau, bảng tính này sẽ trống, ngoại trừ một vài ô có X trong đó, làm nổi bật sự khác biệt. Unzoom đến 40% để nhanh chóng thấy những gì khác biệt.


6
Điều này không làm tế bào bằng cách so sánh tế bào? Ý tôi là nếu bên trái có thêm một hàng ở trên cùng, nó sẽ cung cấp cho tất cả các hàng còn lại (và các ô) khác nhau. Nếu nó là như thế, điều đó không hữu ích.
Hammad Khan

1
@Thecrocodhunter: bạn luôn có thể xóa hàng đó ở trên cùng và sau đó so sánh phần còn lại. Nếu sự khác biệt phức tạp hơn nhiều, thì tất nhiên bạn cần một công cụ khác. Điều này hữu ích để so sánh nhanh một lần, như khi Excel nói rằng bạn đã thay đổi bảng tính và bạn sợ bạn vô tình chỉnh sửa một trường.
iconoclast

1
Tôi thích cái này Thay vì làm X, bạn cũng có thể thực hiện "1" và có SUM làm hàng & cột đầu tiên. Thêm một som trên trường đầu tiên và bạn sẽ nhanh chóng thấy có bao nhiêu trường khác nhau.
Konerak

5
Tôi đã thay đổi công thức một chút để tôi không phải nhìn vào sự khác biệt chính xác là gì. = IF (Trang tính 1! A1 <> Trang2! A1, CONCATENATE ("Trang tính 1 =", Trang tính 1! A1, "Trang tính 2 =", Trang2! A1), "")
Martyn

1
Bạn chỉ có thể gõ =Sheet1!A1=Sheet2!A1. Điều này sẽ in TRUE hoặc FALSE. Sau đó, bạn có thể thực hiện định dạng có điều kiện =countif(A1:B2, FALSE)hoặc một cái gì đó tương tự.
2023861

12

Tôi đã thực hiện rất nhiều so sánh các sách bài tập Excel trong quá khứ. Kỹ thuật của tôi hoạt động rất tốt đối với sổ làm việc có nhiều bảng tính, nhưng nó chỉ so sánh nội dung ô, không định dạng ô, macro, v.v. Ngoài ra, có một số mã liên quan nhưng nó cũng đáng nếu bạn phải so sánh nhiều tệp lớn. Đây là cách nó hoạt động:

A) Viết chương trình kết xuất đơn giản, bước qua tất cả các trang tính và lưu tất cả dữ liệu vào các tệp được phân tách bằng tab. Tạo một tệp trên mỗi trang tính (sử dụng tên bảng tính làm tên tệp, ví dụ: "MyWorksheet.tsv") và tạo một thư mục mới cho các tệp này mỗi khi bạn chạy chương trình. Đặt tên thư mục theo tên tệp excel và thêm dấu thời gian, ví dụ: "20080922-065412-MyExcelFile". Tôi đã làm điều này trong Java bằng cách sử dụng một thư viện có tên là JExcelAPI . Nó thực sự khá dễ dàng.

B) Thêm tiện ích mở rộng Windows shell để chạy chương trình Java mới của bạn từ bước A khi nhấp chuột phải vào tệp Excel. Điều này làm cho nó rất dễ dàng để chạy chương trình này. Bạn cần Google cách thực hiện việc này, nhưng cũng dễ như viết tệp * .reg.

C) Nhận BeyondCompare . Nó có một tính năng rất hay để so sánh dữ liệu được phân tách bằng cách hiển thị nó trong một bảng đẹp, xem ảnh chụp màn hình .

D) Bây giờ bạn đã sẵn sàng để so sánh các tệp Excel một cách dễ dàng. Nhấp chuột phải vào tệp Excel 1 và chạy chương trình kết xuất của bạn. Nó sẽ tạo một thư mục với một tệp trên mỗi bảng tính. Nhấp chuột phải vào tệp Excel 2 và chạy chương trình kết xuất của bạn. Nó sẽ tạo một thư mục thứ hai với một tệp trên mỗi trang tính. Bây giờ sử dụng BeyondCompare (BC) để so sánh các thư mục. Mỗi tệp đại diện cho một bảng tính, vì vậy nếu có sự khác biệt trong bảng tính BC sẽ hiển thị điều này và bạn có thể xem chi tiết và thực hiện so sánh tệp. BC sẽ hiển thị so sánh trong một bố cục bảng đẹp và bạn có thể ẩn các hàng và cột mà bạn không quan tâm.


12

Bạn có thể dùng thử công cụ trực tuyến miễn phí này - www.cloudyexcel.com/compare-excel/

Nó cung cấp một đầu ra trực quan tốt trực tuyến, về các hàng được thêm, xóa, thay đổi, v.v.

nhập mô tả hình ảnh ở đây

Thêm vào đó bạn không phải cài đặt bất cứ thứ gì.


Đáng buồn là nó chỉ hoạt động cho các tệp <2MB. Dù sao, nó có thể làm việc cho người khác.
MikeVelazco

10

Tôi đã tìm thấy Plugin xMocdiff WinMerge . Nó là một plugin cho WinMerge (cả OpenSourceFreeware , bạn không cần phải viết VBA cũng như không lưu excel vào csv hoặc xml). Nó hoạt động chỉ cho chứa celd.

Plugin này cũng hỗ trợ:

  • .rtf Văn bản phong phú
  • .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 Tài liệu mở
  • .wj2 / wj3 / wk3 / wk4 / 123 Hoa sen 123
  • .wri Windows3.1 Viết
  • .pdf Adobe PDF
  • .mht Lưu trữ web
  • .eml Đã xuất tệp từ OutlookExpress

Trân trọng


1
Thật không may, nó không cho phép lưu các thay đổi vào các tệp được giải nén, vì vậy nó không hữu ích cho việc hợp nhất. Nó là miễn phí mặc dù.
Sogger

6

Hừm. Từ menu Excel chọn Window -> So sánh cạnh nhau?


+1 hoạt động tốt nhưng không làm nổi bật sự khác biệt trong văn phòng năm 2007. Tôi đoán là trong các phiên bản cũ hơn. Vẫn rất tốt để so sánh trực quan.
Hammad Khan

2
yeah, không có đánh dấu, vì vậy lợi ích duy nhất là cuộn đồng bộ.
Sogger

5

Bạn có sử dụng TortoiseSVN để thực hiện các cam kết và cập nhật của mình trong lật đổ không? Nó có một công cụ khác, tuy nhiên việc so sánh các tệp Excel vẫn không thực sự thân thiện với người dùng. Trong môi trường của tôi (Win XP, Office 2007), nó sẽ mở ra hai tệp excel để so sánh cạnh nhau.

Nhấp chuột phải vào tài liệu> Rùa SVN> Hiển thị Nhật ký> chọn sửa đổi> nhấp chuột phải cho "So sánh với bản sao làm việc".


4

Các phiên bản mới hơn của MS Office đi kèm với So sánh bảng tính , thực hiện một khác biệt khá đẹp trong GUI. Nó phát hiện hầu hết các loại thay đổi.


Mặc dù câu trả lời này có thể sẽ không giúp ích gì cho tình huống của OP với diffhợp nhất dựa trên dòng lệnh , công cụ So sánh Bảng tính này hoàn hảo cho mục đích của tôi (kiểm tra sự khác biệt giữa đầu ra tự động hóa OpenXML so với đầu ra tự động hóa COM của Excel).
ErrCode

Lưu ý: Tôi đã cố gắng điều tra tự động hóa bằng công cụ này, nhưng nó không hoạt động đối với tôi (công cụ chỉ bị
sập

4

Có một thư viện daff (viết tắt của diff diff) giúp so sánh các bảng, tạo ra một bản tóm tắt về các khác biệt của chúng và sử dụng một bản tóm tắt như một tệp vá.

Nó được viết bằng Haxe, vì vậy nó có thể được biên dịch bằng các ngôn ngữ chính.

Tôi đã tạo một Excel Diff Tool trong Javascript với sự trợ giúp của thư viện này. Nó hoạt động tốt với số & chuỗi nhỏ nhưng đầu ra không lý tưởng cho chuỗi dài (ví dụ: một câu dài có thay đổi ký tự nhỏ).


3

Tôi biết một số phản hồi đã đề xuất xuất tệp sang csv hoặc một số định dạng văn bản khác, sau đó so sánh chúng. Tôi chưa thấy nó được đề cập cụ thể, nhưng Beyond So 3 có một số định dạng tệp bổ sung mà nó hỗ trợ. Xem định dạng tệp bổ sung . Sử dụng một trong các Định dạng tệp Microsoft Excel, bạn có thể dễ dàng so sánh hai tệp Excel mà không cần thông qua tùy chọn xuất sang định dạng khác.


2

Tôi sẽ sử dụng định dạng tệp SYLK nếu thực hiện khác biệt là quan trọng. Nó là một định dạng dựa trên văn bản, sẽ làm cho việc so sánh dễ dàng và gọn hơn so với định dạng nhị phân. Nó cũng tương thích với Excel, Gnumeric và OpenOffice.org, vì vậy cả ba công cụ sẽ có thể hoạt động tốt với nhau. Bài viết của SYLK Wikipedia


Đây là một giải pháp tuyệt vời nên được áp dụng như một cách thông thường trong các môi trường thường xuyên sử dụng git với các tệp Excel (và các tệp khác). Nó chắc chắn là "git" thân thiện (mặc dù các khác biệt không phải là siêu nhân có thể đọc được) và không yêu cầu bất kỳ công cụ bổ sung nào ngoài Excel "hiện đại" (bây giờ là năm 2019). Nó cũng là "hai chiều", có nghĩa là những người dùng khác có thể lưu bảng tính Excel của họ ở định dạng .slk (SYLK) và sau đó họ mở với tất cả các định dạng phù hợp, v.v. trong Excel khi cần.
D. Rừng

2

Sử dụng Altova DiffDog

Sử dụng chế độ khác biệt XML và Chế độ xem lưới của diffdog để xem xét sự khác biệt ở định dạng bảng dễ đọc. Khác biệt văn bản là RẤT NHIỀU cho bảng tính của bất kỳ sự phức tạp. Với công cụ này, ít nhất hai phương pháp khả thi trong các trường hợp khác nhau.

  1. Lưu dưới dạng .xml

    Để phát hiện sự khác biệt của bảng tính đơn giản, một trang tính, hãy lưu bảng tính Excel để so sánh dưới dạng Bảng tính XML 2003 với phần mở rộng .xml.

  2. Lưu dưới dạng .xlsx

    Để phát hiện sự khác biệt của hầu hết các bảng tính trong mô hình tài liệu đã được mô đun hóa, hãy lưu bảng tính Excel để so sánh dưới dạng Sổ làm việc Excel ở dạng .xlsx. Mở các tập tin để diff với diffdog. Nó thông báo cho bạn rằng tệp là một tệp lưu trữ ZIP và hỏi bạn có muốn mở nó để so sánh thư mục không. Khi đồng ý so sánh thư mục, việc nhấp đúp vào các phần logic của tài liệu sẽ trở thành một vấn đề tương đối đơn giản (với chế độ khác biệt XML). Hầu hết các phần của tài liệu .xslx là dữ liệu được định dạng XML. Chế độ xem lưới cực kỳ hữu ích. Thật là tầm thường khi các tờ riêng lẻ khác nhau để tập trung phân tích vào các khu vực được biết là đã thay đổi.

Xu hướng của Excel để điều chỉnh các tên thuộc tính nhất định với mỗi lần lưu là khó chịu, nhưng các khả năng khác biệt XML của diffdog bao gồm khả năng lọc các loại khác biệt nhất định. Ví dụ: bảng tính Excel ở dạng XML chứa rowccác thành phần có sthuộc tính (kiểu) đổi tên với mỗi lần lưu. Thiết lập bộ lọc như c:sgiúp dễ dàng hơn khi chỉ xem các thay đổi nội dung.

diffdog có rất nhiều khả năng khác nhau. Tôi đã liệt kê các chế độ khác nhau của XML chỉ đơn giản vì tôi chưa sử dụng một công cụ khác mà tôi thích hơn khi nói đến việc phân biệt các tài liệu Excel.


1

Tôi đã tìm thấy một macro openoffice ở đây sẽ gọi hàm tài liệu so sánh của openoffice trên hai tệp. Thật không may, so sánh bảng tính của openoffice có vẻ hơi khó hiểu; Tôi vừa có nút 'Từ chối tất cả' chèn một cột không cần thiết vào tài liệu của mình.


1

plugin xdocdiff cho SVN


xdocdiff trông rất đẹp, nhưng dường như cần phải có TortioseSVN
neu242

xdocdiff cũng có một plugin WinMerge, cả hai đều sử dụng xdoc2txt đằng sau hậu trường
Sogger

1

Nếu bạn đang sử dụng Java, bạn có thể thử đơn giản - excel .

Nó sẽ khác bảng tính bằng cách sử dụng các công cụ đối sánh Hamcrest và xuất ra một cái gì đó như thế này.

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)

Tôi nên đủ điều kiện rằng chúng tôi đã viết công cụ đó (như câu trả lời được đánh dấu là của riêng họ).


2
Cảm ơn đã gửi câu trả lời của bạn! Hãy chắc chắn đọc Câu hỏi thường gặp về Tự quảng cáo một cách cẩn thận. Cũng lưu ý rằng nó là cần thiết mà bạn gửi một từ chối trách nhiệm mỗi khi bạn liên kết đến trang web / sản phẩm của riêng bạn.
Andrew Barber

1

Nếu bạn có TortoiseSVN thì bạn có thể CTRLnhấp vào hai tệp để chọn chúng trong Windows Explorer và sau đó nhấp chuột phải, TortoiseSVN-> Diff.

Điều này đặc biệt hiệu quả nếu bạn đang tìm kiếm một thay đổi nhỏ trong một tập dữ liệu lớn.


Tuy nhiên, điều này không hoạt động đặc biệt tốt đối với các tệp nhị phân như định dạng XLS của Excel.
Charles Wood

1
@CharlesWood - thực sự nó làm công việc đặc biệt tốt. Rùa sử dụng chính Excel để cung cấp khác biệt và làm nổi bật các ô khác nhau bằng màu đỏ. Tôi đã không thử nó nhưng tôi khá chắc chắn rằng nó cũng làm tương tự đối với các tệp Word .doc và .docx (sử dụng Word là trình xem khác biệt).
Chris B

Ai vậy! Của tôi không làm điều đó. Đây có phải là một tính năng mới hay bạn đã cài đặt một plugin?
Charles Wood

:-D Tôi đã có TortoiseSVN 1.7.12 và nó thực hiện được điều đó. Tệp trợ giúp nói rằng nó có hỗ trợ cho việc này - tortoisesvn.net/docs/release/TortoirSVN_en/tsvn-dug-diff.html . Nó sử dụng tập lệnh để tìm khác biệt các tập tin trên máy của tôi là C: \ Program Files \ TortoiseSVN \ Diff-Sc Script \ diff-xls.js. Có thể bạn có chính sách nhóm trên máy đã vô hiệu hóa tập lệnh không?
Chris B

1

Tôi gặp vấn đề như bạn nên tôi quyết định viết một công cụ nhỏ để giúp tôi. Vui lòng kiểm tra ExcelDiff_Tools . Nó đi kèm với một số điểm chính:

  • Hỗ trợ xls, xlsx, xlsm.
  • Với tế bào công thức. Nó sẽ so sánh cả công thức và giá trị.
  • Tôi cố gắng làm cho UI trông giống như trình xem văn bản khác với: sửa đổi, xóa, thêm, không thay đổi trạng thái. Xin hãy xem hình ảnh dưới đây chẳng hạn: nhập mô tả hình ảnh ở đây


0

Diff Doc có thể là những gì bạn đang tìm kiếm.

  • So sánh các tài liệu của MS Word (DOC, DOCX, v.v.), Excel, PDF, Rich Text (RTF), Text, HTML, XML, PowerPoint hoặc Wordperinf và giữ lại định dạng
  • Chọn bất kỳ phần nào của bất kỳ tài liệu (tệp) nào và so sánh nó với bất kỳ phần nào của cùng một tài liệu (tệp) khác nhau.

2
Diff Doc chỉ là cửa sổ và nguồn đóng, nó thực sự không phù hợp với nhu cầu của tôi.
neu242

0

Tôi không biết về bất kỳ công cụ nào, nhưng có hai giải pháp do chính bạn nghĩ ra, cả hai đều yêu cầu Excel:

  1. Bạn có thể viết một số mã VBA bước qua từng Bảng tính, Hàng, Cột và Ô của hai Sổ làm việc, báo cáo sự khác biệt.

  2. Nếu bạn sử dụng Excel 2007, bạn có thể lưu Sổ làm việc dưới định dạng Open-XML (* .xlsx), trích xuất XML và tìm khác. Tệp Open-XML về cơ bản chỉ là một tệp .zip gồm các tệp và tệp kê khai .xml.

Bạn sẽ kết thúc với rất nhiều "tiếng ồn" trong cả hai trường hợp nếu bảng tính của bạn không có cấu trúc "đóng" để bắt đầu.


Từ Excel 2002 trở đi, bạn cũng có thể lưu ở định dạng 'Bảng tính XML' đơn giản hơn so với xử lý các tệp xlsx.
Sam Warwick

0

Chuyển đổi sang cvs sau đó tải lên hệ thống kiểm soát phiên bản sau đó tìm khác biệt với công cụ khác biệt kiểm soát phiên bản nâng cao. Khi tôi sử dụng perforce, nó có một công cụ tìm khác biệt tuyệt vời, nhưng tôi quên tên của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.