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

我们的原始码储存库中有很多电子表格(xls)。它们通常使用 gnumeric 或 openoffice. org 进行编辑,主要用于填充数据库,以便使用 DbUnit进行单元测试。据我所知,对 xls 文件进行差异处理并没有简单的方法,这使得合并非常繁琐,而且容易出错。

我尝试过将电子表格转换为 xml 并执行常规的 diff 操作,但我真的觉得这应该是最后的手段。

我希望像处理文本文件一样使用 git执行差异(和合并)。我应该怎样做,例如在发出 git diff时?

166764 次浏览

我不知道有什么工具,但我想到了两种自己动手的解决方案,它们都需要 Excel:

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

  2. 如果使用 Excel2007,则可以将工作簿另存为 Open-XML (* 。Xlsx)格式,提取 XML 并对其进行区分。Open-XML 文件本质上只是一个。的压缩文件。Xml 文件和清单。

无论哪种情况,如果您的电子表格在结构上一开始就不“接近”,那么您最终都会遇到很多“噪音”。

您是否使用 TortoiseSVN 在 subversion 中进行提交和更新?它有一个 diff 工具,但是比较 Excel 文件仍然不是真正的用户友好。在我的环境(WinXP,Office2007)中,它打开两个 Excel 文件并排比较。

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

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

没有外部工具,快速简单,只要你比较的两张纸相似,就可以很好地工作:

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

如果表格是相似的,这个电子表格将是空的,除了几个单元格中的 X,突出显示了差异。放大到40% ,以便快速查看有什么不同。

我以前对 Excel 工作簿做过很多比较。我的技术适用于有许多工作表的工作簿,但它只比较单元格内容,而不比较单元格格式、宏等。此外,还涉及到一些编码,但是如果您必须反复比较大型文件,那么这是非常值得的。它是这样运作的:

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

B)在右键单击 Excel 文件时,添加一个 Windows shell 扩展,从步骤 A 运行新的 Java 程序。这使得运行这个程序非常容易。你需要谷歌如何做到这一点,但这是一样容易写一个 * 。注册文件。

C)使用 BeyondCompare。它有一个非常酷的功能来比较分隔数据显示在一个很好的表,看屏幕截图

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

从 Excel 菜单中选择 Window-> Compare side by side?

我找到了一个 openoffice 宏 给你,它将在两个文件上调用 openoffice 的比较文档功能。不幸的是,openoffice 的电子表格比较似乎有点古怪; 我刚刚让“拒绝所有”按钮在我的文档中插入了一个多余的列。

我找到 WinMerge 插件了。它是 WinMerge 的一个插件(开放源码免费软件,不需要编写 VBA,也不需要将 Excel 保存到 csv 或 xml)。它只对电池的容器有效。

这个插件还支持:

  • 。 rtf 富文本
  • . docx/. docm MicrosoftWORD2007(OOXML)
  • . xlsx/. xlsm MicrosoftExcel2007(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 Write
  • . PDF AdobePDF
  • 。 mht 网络档案馆
  • 从 OutlookExpress 导出文件

注意,安德烈斯

转换到简历,然后上传到一个版本控制系统,然后差异与先进的版本控制差异工具。当我使用 perforce 的时候,它有一个非常不同的工具,但是我忘记了它的名字。

用于 SVN 的 xdocdiff 插件

我知道一些回复建议将文件导出为 csv 或其他文本格式,然后比较它们。我没有特别提到它,但是 Beyond Compare 3支持许多其他的文件格式。参见 附加文件格式。使用 MicrosoftExcel 文件格式之一,您可以很容易地比较两个 Excel 文件,而无需通过导出到另一种格式选项。

我们公司也面临着同样的问题。我们的测试输出 Excel 练习簿。二进制差分不是一个选项。因此,我们推出了自己的简单命令行工具。看看 ExcelCompare 项目。事实上,这允许我们很好地自动化我们的测试。非常欢迎补丁/功能请求!

如果你使用 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)

我应该有资格说,我们编写的工具(就像打勾的答案滚动自己)。

使用 阿尔托娃区分狗

使用 defdog 的 XML diff 模式和 Grid View 以一种易于阅读的表格格式检查差异。对于任何复杂的电子表格来说,文本差异化都要困难得多。使用这个工具,至少有两种方法在不同的情况下是可行的。

  1. 另存为. xml

    为了检测一个简单的工作表电子表格之间的差异,请保存 Excel 电子表格,以便将其作为 XMLSpreadsheet 2003与。Xml 扩展名。

  2. 另存为.xlsx

    若要检测模块化文档模型中大多数电子表格的差异,请将 Excel 电子表格保存为。Xlsx 表格。打开这些文件,以便区别对待。它通知您该文件是一个 ZIP 归档文件,并询问您是否要打开它进行目录比较。在同意目录比较之后,双击文档的逻辑部分来区分它们(使用 XML diff 模式)就变成了一个相对简单的问题。大部分地区。Xslx 文档是 XML 格式的数据。网格视图非常有用。将分析集中在已知发生变化的领域,区分不同的工作表是微不足道的。

Excel 在每次保存时调整特定属性名称的倾向令人讨厌,但是 defdog 的 XML 差异化功能包括过滤特定类型差异的能力。例如,XML 形式的 Excel 电子表格包含 rowc元素,这些元素具有 s属性(样式) ,每次保存时都会重命名。设置像 c:s这样的过滤器使得只查看内容更改变得更加容易。

迪夫狗有很多不同的能力。我之所以列出 XML diff 模式,仅仅是因为我还没有使用另一个我更喜欢的工具来区分 Excel 文档。

如果你有 TortoiseSVN,那么你可以点击这两个文件来选择它们的文件资源管理器,然后右键点击,TortoiseSVN-> Diff。

如果您正在寻找大型数据集中的小更改,那么这种方法尤其有效。

你可以试试这个免费的在线工具 -Www.cloudyexcel.com/compare-excel/

它提供了一个很好的视觉输出在线,在行添加,删除,更改等方面。

enter image description here

而且你不需要安装任何东西。

我和你一样有这个问题,所以我决定写一个小工具来帮助我。请检查 ExcelDiff _ Tools。它有几个关键点:

  • 支持 xls,xlsx,xlsm。
  • 用公式单元格。它将比较公式和值。
  • 我试图让 UI 看起来像标准的差异文本查看器: 修改,删除,添加,不变的状态。 请看下面的图片,例如: enter image description here

较新版本的 MS Office 附带了 电子表格比较,它在 GUI 中表现得相当不错。它检测大多数类型的变化。

有一个 达夫库(data diff 的缩写) ,它可以帮助比较表,生成差异的摘要,并将这种摘要用作补丁文件。

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

在这个库的帮助下,我用 Javascript 编写了一个 差分工具。它可以很好地处理数字和小字符串,但是对于长字符串(例如一个带有小字符变化的长句)输出并不理想。

我是一个免费开源 Git 扩展的合著者:

Https://github.com/zoomeranalytics/git-xltrail

它使 Git 可以使用任何 Excel 工作簿文件格式,而不需要任何变通方法。