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


168

我们的源代码存储库中有很多电子表格(xls)。这些通常使用gnumeric或openoffice.org编辑,并且通常用于填充数据库以使用dbUnit进行单元测试。据我所知,没有简单的方法可以对xls文件进行比较,这使得合并变得非常繁琐且容易出错。

我曾尝试将电子表格转换为xml并进行常规的比较,但确实感觉应该是不得已了。

我想像git对文本文件一样进行比较(和合并)。在发行时,我将如何做git diff


4
我认为标签单元测试和dbunit此处未正确应用。问题是关于特定文件格式的文件比较,与单元测试无关。
Hamish Smith,

1
不是答案(它需要Excel和是一个商业产品),但通过GooBinghoo带到这里来的人- formulasoft.com/excel-compare.html很适合我。
CAD bloke'Aug

1
我使用此Python脚本将我们签到git的Excel进行比较。我移植这个GO代码(这是在Perl移植)到Python:github.com/tokuhirom/git-xlsx-textconv#see-also 它允许你使用git diffgitk
nmz787


一种简单的方法是将两个电子表格的数据导出为CSV /文本并进行常规差异(使用您喜欢的编辑器或差异文件)
PPC

Answers:


109

我们在公司中面临着完全相同的问题。我们的测试输出excel工作簿。二进制差异不是一个选择。因此,我们推出了自己的简单命令行工具。ExcelCompare项目。实际上,这使我们可以很好地自动化测试。补丁/功能要求非常受欢迎!


2
@KimStacks yes适用于所有xls,xlsx和ods。并且甚至可以将任何一种类型与另一种类型进行比较,例如xls v / s xlsx。
na_ka_na 2014年

1
很棒的工具...但是对于某些完全有效的xls文件,它说“ Diff失败:无法作为excel文件读取:”。对于正在寻找替代方案的人(从其他所有角度来看,情况都更糟
Pietro Battiston,

2
@PietroBattiston请在github中记录票证,我来看一下。
na_ka_na 2015年

@na_ka_na感谢您创建此工具!
jgpawletko

111

只要您比较的两张纸相似,那么无需外部工具即可轻松快捷地工作:

  • 创建第三个电子表格
  • =if(Sheet1!A1 <> Sheet2!A1, "X", "")在左上方的单元格中键入(或等效项:单击实际单元格以将引用自动插入到公式中)
  • Ctrl+C(复制),Ctrl+A(全选),Ctrl+V(粘贴)填充工作表。

如果工作表相似,则此电子表格将为空,但其中包含几个带有X的单元格,以突出显示差异。放大至40%即可快速查看有什么不同。


6
这不是按单元比较吗?我的意思是,如果左侧顶部多了一行,它将使所有其余的行(和单元格)有所不同。如果那样,那不是很有用。
Hammad Khan

1
@Thecrocodilehunter:您始终可以删除顶部的该行,然后比较其余的行。如果差异要复杂得多,那么您当然需要其他工具。这对于快速的一次性比较很有用,例如当Excel提示您更改了电子表格并且您担心自己不小心编辑了字段时。
iconoclast 2012年

1
我喜欢这个。除了执行X,您还可以执行“ 1”,并且将SUM作为第一行和列。在第一个字段上添加一个som,您将很快看到有多少个字段不同。
Konerak 2013年

5
我对公式进行了一些更改,因此不必查看确切的区别。= IF(Sheet1!A1 <> Sheet2!A1,CONCATENATE(“ Sheet 1 =”,Sheet1!A1,“ Sheet 2 =”,Sheet2!A1),“”)
Martyn

1
您可以输入=Sheet1!A1=Sheet2!A1。这将打印TRUE或FALSE。然后,您可以进行条件格式化或=countif(A1:B2, FALSE)类似的操作。
user2023861 2014年

12

过去,我已经做了很多Excel工作簿的比较。我的技术适用于具有许多工作表的工作簿,但它只比较单元格内容,而不比较单元格格式,宏等。此外,涉及一些编码,但是如果您必须反复比较许多大文件,则非常值得。运作方式如下:

A)编写一个简单的转储程序,逐步浏览所有工作表并将所有数据保存到制表符分隔的文件中。每个工作表创建一个文件(使用工作表名称作为文件名,例如“ MyWorksheet.tsv”),并在每次运行程序时为这些文件创建一个新文件夹。用excel文件名命名该文件夹并添加时间戳,例如“ 20080922-065412-MyExcelFile”。我使用称为JExcelAPI的库在Java中进行了此操作。这真的很容易。

B)添加一个Windows shell扩展,以在右键单击Excel文件时从步骤A运行新的Java程序。这使得运行该程序非常容易。您需要向Google查询如何执行此操作,但这就像编写* .reg文件一样简单。

C)获得超越比较。它具有一个很酷的功能,可以通过在漂亮的表格中显示分隔的数据来比较定界的数据,请参见截图

D)现在您可以轻松比较Excel文件了。右键单击Excel文件1,然后运行转储程序。它将创建一个文件夹,每个工作表包含一个文件。右键单击Excel文件2,然后运行转储程序。它将创建第二个文件夹,每个工作表一个文件。现在使用BeyondCompare(BC)比较文件夹。每个文件都代表一个工作表,因此,如果工作表中存在差异,则BC会显示此文件,您可以向下钻取并进行文件比较。BC将以一种不错的表格布局显示比较,并且您可以隐藏不感兴趣的行和列。



10

我已经找到xdocdiff WinMerge插件。它是WinMerge的插件(包括OpenSourceFreeware,您无需编写VBA或将excel保存为csv或xml)。它仅适用于celd的容器。

该插件还支持:

  • .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打开文档
  • .wj2 / wj3 / wk3 / wk4 / 123 Lotus 123
  • .wri Windows3.1写入
  • .pdf Adob​​e PDF
  • .mht网站存档
  • .eml从OutlookExpress导出的文件

问候,安德烈斯


1
不幸的是,它不允许将更改保存到解压缩的文件中,因此对合并没有用。它是免费的。
索格2012年

6

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


+1可以很好地工作,但不能突出显示Office 2007中的差异。我猜在较旧的版本中可以。对于视觉比较仍然非常好。
Hammad Khan

2
是的,没有突出显示,所以唯一的好处就是同步滚动。
索格2012年

5

您是否使用TortoiseSVN在Subversion中进行提交和更新?它具有差异工具,但是比较Excel文件仍然不是真正的用户友好。在我的环境(Win XP,Office 2007)中,它打开了两个excel文件并排比较。

右键单击文档> Tortoise SVN>显示日志>选择修订版>右键单击“与工作副本比较”。


4

较新版本的MS Office带有Spreadsheet Compare,它在GUI中执行了相当不错的差异。它检测大多数变化。


尽管此答案可能无法通过基于命令行的diff合并来解决OP的情况,但此Spreadsheet Compare工具非常适合我的用途(检查OpenXML自动化输出与Excel COM自动化输出之间的差异)。
错误代码

注意:我确实尝试使用此工具调查自动化,但对我而言不起作用(工具一直崩溃):stackoverflow.com/a/35905262/7270462
ErrCode

4

有一个图书馆工作人员(数据diff的缩写),它可以帮助比较表,产生其差异的摘要以及将此类摘要用作补丁文件。

它是用Haxe编写的,因此可以用主要语言进行编译。

借助此库,我已经用Java语言制作了一个Excel Diff工具。它适用于数字和小字符串,但输出不适用于长字符串(例如,带有微小字符变化的长句子)。


3

我知道有几个建议建议将文件导出为csv或其他某种文本格式,然后进行比较。我还没有看到它专门提到的内容,但是“超越比较3”还提供了许多其他文件格式支持。请参阅其他文件格式。使用一种Microsoft Excel文件格式,您可以轻松比较两个Excel文件,而无需执行导出到另一种格式选项的操作。


2

如果执行差异比较重要,我将使用SYLK文件格式。它是一种基于文本的格式,与二进制格式相比,它应该使比较更容易且更紧凑。它也与Excel,Gnumeric和OpenOffice.org兼容,因此这三个工具都应该能够很好地协同工作。 SYLK维基百科文章


这是一个很好的解决方案,在经常将git与Excel文件(和其他文件)结合使用的环境中,应采用tat作为常规做法。它绝对是“ git”友好的(尽管差异不是人类可读的),并且除了“现代” Excel(现在是2019年)之外,不需要任何其他工具。这也是“双向”方式,这意味着其他用户可以将他们的Excel电子表格保存为.slk(SYLK)格式,然后在需要时使用Excel中的所有正确格式打开。
D. Woods,

2

Altova DiffDog

使用diffdog的XML diff模式和“网格视图”以易于阅读的表格格式查看差异。对于任何复杂程度的电子表格,文本区分都是非常困难的。使用此工具,在各种情况下至少可以使用两种方法。

  1. 另存为.xml

    要检测一个简单的一张工作表电子表格的差异,请保存Excel电子表格以将其与扩展名为.xml的XML Spreadsheet 2003进行比较。

  2. 另存为.xlsx

    要检测模块化文档模型中大多数电子表格的差异,请将Excel电子表格保存为.xlsx格式以作为Excel工作簿进行比较。用diffdog打开要比较的文件。它会通知您该文件是一个ZIP存档,并询问您是否要打开该文件以进行目录比较。同意目录比较后,双击文档的逻辑部分进行差异化(使用XML差异模式)变得相对简单。.xslx文档的大部分是XML格式的数据。网格视图非常有用。区分单个工作表以将分析集中在已知已更改的区域上是微不足道的。

Excel每次保存都会调整某些属性名称的倾向很烦人,但是diffdog的XML diffing功能包括过滤某些类型差异的功能。例如,XML格式的Excel电子表格包含rowc元素,这些元素具有s随每次保存重命名的属性(样式)。设置类似的过滤器c:s可以使仅查看内容更改更加容易。

diffdog具有很大的区分能力。我之所以列出XML差异模式仅是因为我没有使用在区分Excel文档时更喜欢使用的另一个工具。


1

我在这里找到一个openoffice宏,它将在两个文件上调用openoffice的比较文档功能。不幸的是,openoffice的电子表格比较似乎有些不稳定。我只是使用“全部拒绝”按钮在文档中插入了多余的列。



1

如果您使用的是Java,则可以尝试simple-excel

它将使用Hamcrest匹配器比较电子表格,并输出类似的内容。

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)

我应该证明我们编写了该工具(就像被打勾的答案一样)。


2
感谢您发布答案!请务必仔细阅读有关自我促销常见问题解答。另请注意,每次链接到您自己的站点/产品,您都必须发布免责声明。
安德鲁·巴伯

1

如果您有TortoiseSVN,则可以 CTRL单击两个文件在Windows资源管理器中选择它们,然后右键单击TortoiseSVN-> Diff。

如果您要在大型数据集中查找较小的更改,则此方法特别有用。


这并没有工作特别好,但是,对于二进制文件,如Excel的XLS格式。
查尔斯·伍德

1
@CharlesWood-实际上它确实工作得特别好。乌龟使用Excel本身提供差异,并以红色突出显示不同的单元格。我还没有尝试过,但是我很确定它对Word .doc和.docx文件也具有相同的功能(使用Word作为差异查看器)。
克里斯·B

哇!我不这样做。它是一项新功能还是您安装了插件?
查尔斯伍德

:-D我有TortoiseSVN 1.7.12,它开箱即用。帮助文件指出它对此具有支持-tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-diff.html。它使用脚本来比较我计算机上的文件C:\ Program Files \ TortoiseSVN \ Diff-Scripts \ diff-xls.js。您的计算机上是否有一个已禁用脚本的组策略?
克里斯·B

1

我遇到了像您这样的问题,所以我决定写一些小工具来帮助我。请检查ExcelDiff_Tools。它具有几个关键点:

  • 支持xls,xlsx,xlsm。
  • 具有公式单元格。它将比较公式和值。
  • 我尝试使UI看起来像标准的差异文本查看器,其状态为:已修改,已删除,已添加,未更改。请以下面的图片为例: 在此处输入图片说明


0

Diff Doc可能就是您想要的。

  • 比较MS Word(DOC,DOCX等),Excel,PDF,RTF,文本,HTML,XML,PowerPoint或Wordperfect的文档并保留格式
  • 选择任何文档(文件)的任何部分,并将其与相同或不同文档(文件)的任何部分进行比较。

2
Diff Doc是仅Windows且关闭的源代码,它确实不符合我的需求。
neu242

0

我不知道任何工具,但想到的是两种自带解决方案,都需要Excel:

  1. 您可以编写一些VBA代码,逐步遍历两个工作簿的每个工作表,行,列和单元格,报告差异。

  2. 如果使用Excel 2007,则可以将工作簿另存为Open-XML(* .xlsx)格式,提取XML并进行比较。Open-XML文件本质上只是.xml文件和清单的.zip文件。

如果您的电子表格在结构上并非一开始就“关闭”,那么在任何一种情况下,您都会遇到很多“噪音”。


从Excel 2002开始,您还可以以“ XML Spreadsheet”格式保存文件,该格式比处理xlsx文件更简单。
Sam Warwick

0

转换为cvs,然后上传到版本控制系统,然后使用高级版本控制diff工具进行diff。当我使用perforce时,它具有出色的diff工具,但我忘记了它的名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.