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

Posted

技术标签:

【中文标题】如何使用 git diff 创建两个电子表格的可读差异?【英文标题】:How do I create a readable diff of two spreadsheets using git diff? 【发布时间】:2010-09-11 23:56:08 【问题描述】:

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

我尝试将电子表格转换为 xml 并进行常规 diff,但感觉它应该是最后的手段。

我想使用git 执行差异(和合并),就像处理文本文件一样。我将如何做到这一点,例如当发出git diff?

【问题讨论】:

我认为标签 unit-testing 和 dbunit 在这里应用不正确。问题是关于特定文件格式的文件比较,与单元测试无关。 不是答案(它需要 Excel 并且是商业产品),但对于 GooBinghoo 带来的人来说 - formulasoft.com/excel-compare.html 对我来说效果很好。 我使用这个 Python 脚本来区分我们签入到 git 的 Excel。我将此 GO 代码(从 Perl 移植)移植到 Python:github.com/tokuhirom/git-xlsx-textconv#see-also 它允许您使用 git diffgitk 超越比较? scootersoftware.com/features.php?zz=features_multifaceted 一种简单的方法是将两个电子表格的数据导出为 CSV/文本,并进行常规比较(使用您喜欢的编辑器或比较文件) 【参考方案1】:

我们在公司遇到了完全相同的问题。我们的测试输出 excel 工作簿。二进制差异不是一种选择。所以我们推出了我们自己的简单命令行工具。查看ExcelCompare project。事实上,这使我们能够很好地自动化我们的测试。非常欢迎补丁/功能请求!

【讨论】:

@KimStacks 是的,适用于所有 xls、xlsx、ods。甚至可以将任何一种类型与另一种进行比较,例如xls v/s xlsx. 很棒的工具...但对于一些完全有效的 xls 文件,它会显示“Diff failed: Failed to read as excel file:”。对于正在寻找(从所有其他角度来看更差)替代方案的任何人:请参阅github.com/toobaz/xlrd_diff @PietroBattiston 请在 github 上注册一张票,我会看看。 @na_ka_na 感谢您创建此工具!【参考方案2】:

无需外部工具即可快速简便,只要您要比较的两张纸相似,就可以正常工作:

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

如果工作表相似,则此电子表格将是空的,除了一些带有 X 的单元格,突出显示了不同之处。取消缩放至 40% 以快速查看不同之处。

【讨论】:

这不是逐个单元格比较吗?我的意思是如果左​​侧在顶部有一个额外的行,它将使所有剩余的行(和单元格)不同。如果是那样的话,那用处不大。 @Thecrocodilehunter:您始终可以删除顶部的那一行,然后比较其余的行。如果差异要复杂得多,那么您当然需要不同的工具。这对于快速的一次性比较很有用,例如当 Excel 说您更改了电子表格并且您担心您不小心编辑了一个字段时。 我喜欢这个。除了执行 X,您还可以执行“1”,并将 SUM 作为第一行和列。在第一个字段上添加一个 som,您会很快看到有多少字段不同。 我稍微改变了公式,所以我不必去查看确切的差异是什么。 =IF(Sheet1!A1 Sheet2!A1, CONCATENATE("Sheet 1=",Sheet1!A1, " Sheet 2=",Sheet2!A1), "") 这个答案比较单元格值而不是公式。如果要比较单元格公式而不是这些公式生成的值,请首先将所有公式转换为静态值,然后使用此答案中的技术。要转换(首先备份您的电子表格),请在 = 上执行查找/替换并替换为 %%% 之类的其他内容。现在对结果使用这种比较技术。【参考方案3】:

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

它在添加、删除、更改等方面提供了良好的在线视觉输出。

另外,您无需安装任何东西。

【讨论】:

遗憾的是它只适用于 【参考方案4】:

过去我对 Excel 工作簿进行了很多比较。我的技术非常适用于具有许多工作表的工作簿,但它只比较单元格内容,而不是单元格格式、宏等。此外,还涉及一些编码,但如果您必须反复比较大量大文件,这是非常值得的。以下是它的工作原理:

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

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

C) 获取BeyondCompare。它有一个非常酷的功能,可以通过将分隔数据显示在一个漂亮的表格中来比较分隔数据,see screenshot。

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

【讨论】:

截图链接失效【参考方案5】:

我找到了xdocdiff WinMerge Plugin。它是 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 莲花123 .wri Windows3.1 写入 .pdf Adob​​e PDF .mht 网络档案 .eml 从 OutlookExpress 导出的文件

尊敬的安德烈斯

【讨论】:

不幸的是,它不允许保存对解压文件的更改,因此它对合并没有用处。不过它是免费的。【参考方案6】:

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

【讨论】:

+1 效果很好,但没有突出 Office 2007 中的差异。我猜在旧版本中确实如此。仍然非常适合进行视觉比较。 是的,没有高亮显示,所以唯一的好处是同步滚动。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

虽然这个答案可能不会帮助 OP 基于命令行的diff 合并的情况,这个电子表格比较工具非常适合我的目的(检查 OpenXML 自动化输出与 Excel COM 自动化输出之间的差异)。 注意:我确实尝试使用此工具研究自动化,但它对我不起作用(工具一直崩溃):***.com/a/35905262/7270462【参考方案9】:

有一个库daff(data diff 的缩写),它有助于比较表,生成它们的差异摘要,并将此类摘要用作补丁文件。

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

在这个库的帮助下,我在 javascript 中创建了一个Excel Diff Tool。它适用于数字和小字符串,但输出不适用于长字符串(例如,带有少量字符变化的长句子)。

【讨论】:

【参考方案10】:

我知道一些回复建议将文件导出为 csv 或其他文本格式,然后进行比较。我没有看到特别提到它,但是 Beyond Compare 3 有许多它支持的其他文件格式。见Additional File Formats。使用其中一种 Microsoft Excel 文件格式,您可以轻松比较两个 Excel 文件,而无需通过导出到另一种格式选项。

【讨论】:

【参考方案11】:

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

【讨论】:

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

使用Altova DiffDog

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

    另存为 .xml

    要检测简单的单张电子表格的差异,请将 Excel 电子表格保存为带有 .xml 扩展名的 XML 电子表格 2003 进行比较。

    另存为 .xlsx

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

Excel 倾向于在每次保存时调整某些属性名称,这很烦人,但 diffdog 的 XML diff'ing 功能包括过滤某些差异的能力。例如,XML 格式的 Excel 电子表格包含 rowc 元素,这些元素具有在每次保存时重命名的 s 属性(样式)。设置像c:s 这样的过滤器可以更轻松地仅查看内容更改。

diffdog 有很多 diff'ing 能力。我列出了 XML 差异模式只是因为我没有使用其他我更喜欢的工具来区分 Excel 文档。

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

SVN 的 xdocdiff 插件

【讨论】:

xdocdiff 看起来不错,但似乎需要 TortioseSVN xdocdiff 也有一个 WinMerge 插件,这两个都在后台使用 xdoc2txt【参考方案15】:

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

我应该证明我们编写了那个工具(就像勾选的答案是他们自己的)。

【讨论】:

感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。【参考方案16】:

如果你有 TortoiseSVN,那么你可以 CTRL 在 Windows 资源管理器中单击这两个文件,然后右键单击 TortoiseSVN->Diff。

如果您正在寻找大型数据集中的微小变化,这尤其适用。

【讨论】:

工作得特别好,但是,对于 Excel 的 XLS 格式等二进制文件。 @CharlesWood - 实际上它确实工作得特别好。 Tortoise 使用 Excel 本身来提供差异并以红色突出显示不同的单元格。我没有尝试过,但我很确定它对 Word .doc 和 .docx 文件也有同样的效果(使用作为差异查看器的 Word)。 哇!我的不这样做。是新功能还是你安装了插件? :-D 我有 TortoiseSVN 1.7.12,它开箱即用。帮助文件声明它对此提供支持 - tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-diff.html。它使用脚本来区分我机器上的文件是 C:\Program Files\TortoiseSVN\Diff-Scripts\diff-xls.js。您的机器上是否有禁用脚本的组策略?【参考方案17】:

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

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

【讨论】:

【参考方案18】:

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

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

它使 Git 可以处理任何 Excel 工作簿文件格​​式,而无需任何变通方法。

【讨论】:

【参考方案19】:

Diff Doc 可能就是您要找的。​​p>

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

【讨论】:

Diff Doc 仅适用于 Windows 并且是封闭源代码,它确实不符合我的需求。【参考方案20】:

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

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

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

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

【讨论】:

从 Excel 2002 开始,您还可以保存为比处理 xlsx 文件更简单的“XML 电子表格”格式。【参考方案21】:

转换为 cvs,然后上传到版本控制系统,然后使用高级版本控制差异工具进行差异。当我使用 perforce 时,它​​有一个很棒的 diff 工具,但我忘记了它的名字。

【讨论】:

以上是关于如何使用 git diff 创建两个电子表格的可读差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 git diff 比较不在存储库中的两个远程文件?

怎么把.repo缓存区的代码弄成本地的可读文件呢

如何在 2 次提交之间创建一个 git diff/diff-tree/archive 与此时的文件版本(不是头)

Git diff 比较两个版本文件之间的差异

git diff 比较两个版本的差异

创建与 FormData 一起使用的可读流