我们的源代码库中有很多电子表格(xls)。这些通常使用gnumeric或openoffice.org进行编辑,主要用于使用dbUnit填充数据库进行单元测试。在我知道的xls文件上没有简单的方法可以做差异,这使得合并非常繁琐且容易出错。
我试图将电子表格转换为xml并进行常规差异,但它确实感觉它应该是最后的手段。
我想像git
那样使用文本文件执行差异化(和合并)。我该怎么做,例如何时发出git diff
?
答案 0 :(得分:108)
无需外部工具即可快速轻松地工作,只要您要比较的两张纸相似:
=if(Sheet1!A1 <> Sheet2!A1, "X", "")
(或等效的:点击实际的单元格以自动将引用插入到公式中)如果工作表相似,则此电子表格将为空,除了包含X的几个单元格,突出显示差异。取消缩放至40%以快速查看不同之处。
答案 1 :(得分:103)
我们在公司面临同样的问题。我们的测试输出excel工作簿。二元差异不是一种选择。所以我们推出了自己的简单命令行工具。查看ExcelCompare project。事实上,这使我们可以很好地自动化我们的测试。补丁/功能请求非常欢迎!
答案 2 :(得分:12)
我过去做过很多Excel工作簿的比较。我的技术适用于具有许多工作表的工作簿,但它只比较单元格内容,而不是单元格格式,宏等。此外,还涉及一些编码,但如果你必须反复比较很多大文件,这是非常值得的。以下是它的工作原理:
A)编写一个简单的转储程序,遍历所有工作表并将所有数据保存到制表符分隔的文件中。每个工作表创建一个文件(使用工作表名称作为文件名,例如“MyWorksheet.tsv”),并在每次运行程序时为这些文件创建一个新文件夹。在excel文件名后面命名文件夹并添加时间戳,例如“20080922-065412-MyExcelFile”。我在Java中使用名为JExcelAPI的库来完成此操作。这真的很容易。
B)在右键单击Excel文件时,添加Windows外壳扩展以从步骤A运行新的Java程序。这使得运行该程序变得非常容易。您需要Google如何执行此操作,但这与编写* .reg文件一样简单。
C)获取BeyondCompare。它有一个非常酷的功能,通过在一个漂亮的表see screenshot中显示它来比较分隔数据。
D)您现在可以轻松地比较Excel文件了。右键单击Excel文件1并运行转储程序。它将创建一个文件夹,每个工作表包含一个文件。右键单击Excel文件2并运行转储程序。它将创建第二个文件夹,每个工作表包含一个文件。现在使用BeyondCompare(BC)来比较文件夹。每个文件代表一个工作表,因此如果工作表中存在差异,BC将显示此信息,您可以向下钻取并进行文件比较。 BC将以漂亮的表格布局显示比较,您可以隐藏您不感兴趣的行和列。
答案 3 :(得分:11)
答案 4 :(得分:9)
我找到了xdocdiff WinMerge Plugin。它是WinMerge的插件( OpenSource 和免费软件,你不需要编写VBA也不需要将excel保存到csv或xml)。它适用于celd的包含。
此插件也支持:
注意,安德烈斯
答案 5 :(得分:6)
嗯。从Excel菜单中选择Window - &gt;并排比较?
答案 6 :(得分:5)
您是否使用TortoiseSVN进行颠覆的提交和更新?它有一个diff工具,但比较Excel文件仍然不是真正用户友好。在我的环境(Win XP,Office 2007)中,它会打开两个excel文件进行并排比较。
右键单击文档&gt; Tortoise SVN&gt;显示日志&gt;选择修订版&gt;右键单击“与工作副本比较”。
答案 7 :(得分:3)
较新版本的MS Office附带Spreadsheet Compare,它在GUI中执行相当不错的差异。它可以检测到大多数变化。
答案 8 :(得分:3)
我知道有几个回复建议将文件导出为csv或其他文本格式,然后比较它们。我没有看到它具体提到,但Beyond Compare 3有许多其支持的附加文件格式。见Additional File Formats。使用其中一种Microsoft Excel文件格式,您可以轻松地比较两个Excel文件,而无需通过导出到另一种格式选项。
答案 9 :(得分:2)
有一个daff库(数据差异的缩写),它可以帮助比较表,产生其差异摘要以及将摘要用作补丁文件。
它是用Haxe编写的,因此可以用主要语言进行编译。
借助此库,我用Java语言制作了Excel Diff Tool。它适用于数字和小字符串,但输出不适用于长字符串(例如,字符变化较小的长句子)。
答案 10 :(得分:2)
使用diffdog的XML diff模式和Grid View以易于阅读的表格格式查看差异。对于任何复杂的电子表格来说,文本差异很大。使用此工具,在各种情况下至少有两种方法是可行的。
另存为.xml
要检测简单的单页电子表格的差异,请保存Excel电子表格,将其作为XML Spreadsheet 2003与.xml扩展名进行比较。
另存为.xlsx
要检测模块化文档模型中大多数电子表格的差异,请将Excel电子表格另存为.xlsx格式的Excel工作簿。使用diffdog打开要扩散的文件。它会通知您该文件是ZIP存档,并询问您是否要打开它以进行目录比较。在同意目录比较时,双击文档的逻辑部分以区分它们(使用XML diff模式)变得相对简单。 .xslx文档的大多数部分都是XML格式的数据。网格视图非常有用。分析单个工作表以将分析重点放在已知已发生变化的区域上是微不足道的。
Excel倾向于在每次保存时调整某些属性名称都很烦人,但是diffdog的XML差异功能包括过滤某些差异的能力。例如,XML格式的Excel电子表格包含row
和c
元素,这些元素具有s
属性(样式),每次保存都会重命名。设置c:s
之类的过滤器可以更轻松地仅查看内容更改。
diffdog具有很多差异化能力。我只列出了XML diff模式,因为我没有使用过另一种我喜欢的差异Excel文档的工具。
答案 11 :(得分:1)
SVN的xdocdiff插件
答案 12 :(得分: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)
我应该有资格说我们编写了这个工具(就像自己编写的答案一样)。
答案 13 :(得分:1)
我找到了一个openoffice宏here,它将在两个文件上调用openoffice的比较文档函数。不幸的是,openoffice的电子表格比较看起来有点不稳定;我只是让'拒绝所有'按钮在我的文档中插入一个多余的列。
答案 14 :(得分:1)
如果您有TortoiseSVN,那么您可以 CTRL 单击这两个文件在Windows资源管理器中选择它们,然后右键单击TortoiseSVN-&gt; Diff。
如果您正在寻找大型数据集中的小变化,这种方法效果特别好。
答案 15 :(得分:1)
如果执行差异很重要,我会使用SYLK文件格式。它是一种基于文本的格式,应该使比较比二进制格式更容易和更紧凑。它与Excel,Gnumeric和OpenOffice.org兼容,因此所有这三个工具都应该能够很好地协同工作。 SYLK Wikipedia Article
答案 16 :(得分:1)
我遇到了像你这样的问题所以我决定写一些小工具来帮助我。请检查ExcelDiff_Tools。它有几个关键点:
答案 17 :(得分:0)
我是免费的开源Git扩展的共同作者:
https://github.com/ZoomerAnalytics/git-xltrail
它使Git可以使用任何Excel工作簿文件格式,而无需任何变通办法。
答案 18 :(得分:0)
Diff Doc可能就是你要找的东西。
- 比较MS Word(DOC,DOCX等),Excel,PDF,富文本(RTF),文本,HTML,XML,PowerPoint或Wordperfect的文档并保留格式
- 选择任何文档(文件)的任何部分,并将其与相同或不同文档(文件)的任何部分进行比较。
答案 19 :(得分:0)
转换为cvs然后上传到版本控制系统,然后使用高级版本控制差异工具进行差异处理。当我使用perforce它有一个伟大的差异工具,但我忘了它的名字。
答案 20 :(得分:0)
我不知道有任何工具,但有两种自行解决方案可以想到,都需要Excel:
您可以编写一些VBA代码,逐步执行两个工作簿的每个工作表,行,列和单元格,报告差异。
如果使用Excel 2007,则可以将工作簿保存为Open-XML(* .xlsx)格式,提取XML并对其进行区分。 Open-XML文件本质上只是.xml文件和清单的.zip文件。
如果您的电子表格在结构上并非“接近”,那么在任何一种情况下都会产生很多“噪音”。