如何使用git diff创建两个电子表格的可读差异比较?

180
我们的源代码库中有很多电子表格(xls)文件。这些文件通常使用gnumeric或openoffice.org进行编辑,并且主要用于使用dbUnit填充数据库进行单元测试。据我所知,没有简单的方法来比较xls文件,这使得合并变得非常繁琐和容易出错。
我尝试将电子表格转换为xml并进行常规比较,但这真的感觉应该是最后的选择。
我想像处理文本文件一样使用git来进行比较(和合并)。当我发出git diff命令时,我该如何做?

4
我认为标签“unit-testing”和“dbunit”在这里被错误地应用了。这个问题是关于特定文件格式的文件比较,与单元测试无关。 - Hamish Smith
1
这不是答案(它需要Excel并且是商业产品),但对于被GooBinghoo带到这里的人来说,http://www.formulasoft.com/excel-compare.html 对我很有效。 - CAD bloke
2
我使用这个Python脚本来比较我们在git中提交的Excel文件。我将这段GO代码(它是从Perl移植过来的)移植到了Python中: https://github.com/tokuhirom/git-xlsx-textconv#see-also它允许您使用git diffgitk - nmz787
BeyondCompare? http://www.scootersoftware.com/features.php?zz=features_multifaceted - Nishant Sharma
一个简单的方式是将两个电子表格的数据导出为CSV /文本文件,然后使用您喜欢的编辑器或diff文件进行常规比较。 - PPC
@PPC 这就是我试图避免的。请再次阅读原帖 ;) - neu242
22个回答

120

我们公司也遇到了同样的问题。我们的测试输出为Excel工作簿,因此二进制比较不是一个选项。所以我们开发了自己的简单命令行工具。请查看ExcelCompare项目。实际上,这使我们能够非常好地自动化测试。欢迎提交补丁/功能请求!


2
@KimStacks 是的,它适用于所有的 xls、xlsx、ods 文件。而且甚至可以将任何一种类型与另一种进行比较,例如 xls 对比 xlsx。 - na_ka_na
1
很棒的工具...但是对于一些完全有效的xls文件,它会显示“Diff失败:无法读取为Excel文件:”。对于任何寻找(从其他所有方面来看都更差的)替代方案的人,请参阅https://github.com/toobaz/xlrd_diff。 - Pietro Battiston
2
@PietroBattiston 请在 GitHub 上提交一个工单,我会查看它。 - na_ka_na
@na_ka_na 谢谢您创建这个工具! - jgpawletko

116

快速简便,无需外部工具,只要两个表格相似就能很好地发挥作用:

  • 创建第三个电子表格
  • 在左上角单元格中输入=if(Sheet1!A1 <> Sheet2!A1, "X", "")(或同等语句:单击实际单元格可自动插入引用)
  • Ctrl+C (复制), Ctrl+A (全选), Ctrl+V (粘贴)以填充该表。

如果这两个表格相似,则该电子表格除了一些带有“ X” 的单元格突出显示差异外,将为空。缩小到40%以快速查看不同之处。


8
这难道不是逐个单元格比较吗?我的意思是,如果左侧在顶部有一个额外的行,它会使所有剩下的行(和单元格)都变成不同的。如果是这样的话,那就没有什么用了。 - TheTechGuy
1
我喜欢这个。你可以不做X,而是做“1”,并将SUM作为第一行和列。在第一个字段上添加一个som,你很快就会看到有多少个字段不同。 - Konerak
6
我稍微修改了公式,这样我就不必去查找确切的差异了。=IF(Sheet1!A1 <> Sheet2!A1, CONCATENATE("Sheet 1=",Sheet1!A1, " Sheet 2=",Sheet2!A1), "") - Martyn
2
此答案比较的是单元格的值而不是公式。如果您想比较单元格公式而不是这些公式产生的值,请先将所有公式转换为静态值,然后使用此答案中的技术。要进行转换(首先备份电子表格),请在“=”上执行查找/替换操作,并用%%%之类的其他内容进行替换。现在可以对结果使用此比较技术。 - jlpp
1
你可以直接输入=Sheet1!A1=Sheet2!A1。这将打印TRUE或FALSE。然后,您可以进行条件格式化或=countif(A1:B2, FALSE)或类似操作。 - user2023861
显示剩余3条评论

15
你可以尝试使用这个免费的在线工具-www.cloudyexcel.com/compare-excel/。 它会在网页中给出良好的可视化输出,显示行数的增加、删除、更改等情况。 此外,你不需要安装任何东西。

很遗憾,它只适用于小于2MB的文件。无论如何,对于其他人可能会有用。 - MikeVelazco

13

我曾经对Excel工作簿进行了很多比较。我的技巧适用于有许多工作表的工作簿,但仅比较单元格内容,而不是单元格格式、宏等。此外,需要编写一些代码,但如果您需要重复比较大量文件,则非常值得。以下是具体步骤:

A) 编写一个简单的转储程序,遍历所有工作表并将所有数据保存到以制表符分隔的文件中。每个工作表创建一个文件(使用工作表名称作为文件名,例如“MyWorksheet.tsv”),每次运行程序时都创建一个新文件夹。将文件夹命名为Excel文件名,并添加时间戳,例如“20080922-065412-MyExcelFile”。我使用一个叫做JExcelAPI的库在Java中完成了这个步骤。非常简单易学。

B) 添加Windows shell扩展程序,在右键单击Excel文件时运行步骤A中的Java程序。这样可以轻松运行该程序。您需要Google如何做到这一点,但只需要编写一个*.reg文件即可。

C) 获取BeyondCompare。它有一个非常酷的功能,可以通过在漂亮的表格中显示分隔的数据进行比较,请参见屏幕截图

D) 您现在已经可以轻松地比较Excel文件了。右键单击Excel文件1并运行转储程序。它将创建一个文件夹,其中每个工作表都有一个文件。右键单击Excel文件2并运行转储程序。它将创建第二个文件夹,并为每个工作表创建一个文件。然后使用BeyondCompare(BC)比较这两个文件夹。每个文件代表一个工作表,因此如果工作表中存在差异,则BC将显示这一点,并且您可以深入了解并进行文件比较。BC会以漂亮的表格布局显示比较结果,您可以隐藏不感兴趣的行和列。


截图链接已损坏。 - Pedro A

10

我发现了 xdocdiff WinMerge 插件。它是WinMerge的插件(开源和免费软件,您无需编写VBA或将Excel保存为CSV或XML),它只适用于单元格内容。

此插件还支持以下格式:

  • .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 Open Document
  • .wj2/wj3/wk3/wk4/123 Lotus 123
  • .wri Windows3.1 Write
  • .pdf Adobe PDF
  • .mht Web Archive
  • .eml OutlookExpress导出文件

敬礼,安德烈斯


1
不幸的是,它不允许保存对未打包文件的更改,因此对于合并没有用处。但它是免费的。 - Sogger

6
嗯,从Excel菜单中选择“窗口”->“并排比较”?

1
+1 在比较中表现良好,但在 Office 2007 中无法突出显示差异。我猜在旧版本中它可以。仍然非常适合进行视觉比较。 - TheTechGuy
3
好的,这是翻译的结果:是的,没有高亮显示,所以唯一的好处就是同步滚动。 - Sogger

5
你是否使用TortoiseSVN来提交和更新你的subversion代码?它有一个差异工具,但是比较Excel文件仍然不太友好。在我的环境中(Win XP,Office 2007),它会打开两个Excel文件进行并排比较。
右键单击文档 > Tortoise SVN > 显示日志 > 选择修订版本 > 右键单击 "与工作副本比较"。

4

3

我知道有几种方法建议将文件导出为csv或其他文本格式,然后进行比较。尽管没有特别提到,但Beyond Compare 3支持多种附加文件格式。请参见附加文件格式。使用Microsoft Excel文件格式之一,您可以轻松比较两个Excel文件,而无需通过导出到另一种格式的选项。


3

虽然这个答案可能对OP的命令行diff合并没有帮助,但这个电子表格比较工具非常适合我的需求(检查OpenXML自动化输出与Excel COM自动化输出之间的差异)。 - ErrCode
注意:我尝试使用这个工具进行自动化调查,但它对我没有起作用(工具一直崩溃):https://dev59.com/YGYr5IYBdhLWcg3waJdT#35905262 - ErrCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接