我们的源代码存储库中有很多电子表格(xls)。这些通常使用gnumeric或openoffice.org编辑,并且通常用于填充数据库以使用dbUnit进行单元测试。据我所知,没有简单的方法可以对xls文件进行比较,这使得合并变得非常繁琐且容易出错。
我曾尝试将电子表格转换为xml并进行常规的比较,但确实感觉应该是不得已了。
我想像git
对文本文件一样进行比较(和合并)。在发行时,我将如何做git diff
?
git diff
和gitk
我们的源代码存储库中有很多电子表格(xls)。这些通常使用gnumeric或openoffice.org编辑,并且通常用于填充数据库以使用dbUnit进行单元测试。据我所知,没有简单的方法可以对xls文件进行比较,这使得合并变得非常繁琐且容易出错。
我曾尝试将电子表格转换为xml并进行常规的比较,但确实感觉应该是不得已了。
我想像git
对文本文件一样进行比较(和合并)。在发行时,我将如何做git diff
?
git diff
和gitk
Answers:
我们在公司中面临着完全相同的问题。我们的测试输出excel工作簿。二进制差异不是一个选择。因此,我们推出了自己的简单命令行工具。签出ExcelCompare项目。实际上,这使我们可以很好地自动化测试。补丁/功能要求非常受欢迎!
只要您比较的两张纸相似,那么无需外部工具即可轻松快捷地工作:
=if(Sheet1!A1 <> Sheet2!A1, "X", "")
在左上方的单元格中键入(或等效项:单击实际单元格以将引用自动插入到公式中)如果工作表相似,则此电子表格将为空,但其中包含几个带有X的单元格,以突出显示差异。放大至40%即可快速查看有什么不同。
=Sheet1!A1=Sheet2!A1
。这将打印TRUE或FALSE。然后,您可以进行条件格式化或=countif(A1:B2, FALSE)
类似的操作。
过去,我已经做了很多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将以一种不错的表格布局显示比较,并且您可以隐藏不感兴趣的行和列。
我已经找到xdocdiff WinMerge插件。它是WinMerge的插件(包括OpenSource和Freeware,您无需编写VBA或将excel保存为csv或xml)。它仅适用于celd的容器。
该插件还支持:
问候,安德烈斯
嗯 从Excel菜单中选择“窗口”->“并排比较?”。
较新版本的MS Office带有Spreadsheet Compare,它在GUI中执行了相当不错的差异。它检测大多数变化。
diff
合并来解决OP的情况,但此Spreadsheet Compare工具非常适合我的用途(检查OpenXML自动化输出与Excel COM自动化输出之间的差异)。
有一个图书馆工作人员(数据diff的缩写),它可以帮助比较表,产生其差异的摘要以及将此类摘要用作补丁文件。
它是用Haxe编写的,因此可以用主要语言进行编译。
借助此库,我已经用Java语言制作了一个Excel Diff工具。它适用于数字和小字符串,但输出不适用于长字符串(例如,带有微小字符变化的长句子)。
如果执行差异比较重要,我将使用SYLK文件格式。它是一种基于文本的格式,与二进制格式相比,它应该使比较更容易且更紧凑。它也与Excel,Gnumeric和OpenOffice.org兼容,因此这三个工具都应该能够很好地协同工作。 SYLK维基百科文章
使用diffdog的XML diff模式和“网格视图”以易于阅读的表格格式查看差异。对于任何复杂程度的电子表格,文本区分都是非常困难的。使用此工具,在各种情况下至少可以使用两种方法。
另存为.xml
要检测一个简单的一张工作表电子表格的差异,请保存Excel电子表格以将其与扩展名为.xml的XML Spreadsheet 2003进行比较。
另存为.xlsx
要检测模块化文档模型中大多数电子表格的差异,请将Excel电子表格保存为.xlsx格式以作为Excel工作簿进行比较。用diffdog打开要比较的文件。它会通知您该文件是一个ZIP存档,并询问您是否要打开该文件以进行目录比较。同意目录比较后,双击文档的逻辑部分进行差异化(使用XML差异模式)变得相对简单。.xslx文档的大部分是XML格式的数据。网格视图非常有用。区分单个工作表以将分析集中在已知已更改的区域上是微不足道的。
Excel每次保存都会调整某些属性名称的倾向很烦人,但是diffdog的XML diffing功能包括过滤某些类型差异的功能。例如,XML格式的Excel电子表格包含row
和c
元素,这些元素具有s
随每次保存重命名的属性(样式)。设置类似的过滤器c:s
可以使仅查看内容更改更加容易。
diffdog具有很大的区分能力。我之所以列出XML差异模式仅是因为我没有使用在区分Excel文档时更喜欢使用的另一个工具。
我在这里找到一个openoffice宏,它将在两个文件上调用openoffice的比较文档功能。不幸的是,openoffice的电子表格比较似乎有些不稳定。我只是使用“全部拒绝”按钮在文档中插入了多余的列。
SVN的xdocdiff插件
如果您使用的是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)
我应该证明我们编写了该工具(就像被打勾的答案一样)。
如果您有TortoiseSVN,则可以 CTRL单击两个文件在Windows资源管理器中选择它们,然后右键单击TortoiseSVN-> Diff。
如果您要在大型数据集中查找较小的更改,则此方法特别有用。
我遇到了像您这样的问题,所以我决定写一些小工具来帮助我。请检查ExcelDiff_Tools。它具有几个关键点:
我是免费的开源Git扩展的合著者:
https://github.com/ZoomerAnalytics/git-xltrail
它使Git可以使用任何Excel工作簿文件格式,而无需任何变通办法。
我不知道任何工具,但想到的是两种自带解决方案,都需要Excel:
您可以编写一些VBA代码,逐步遍历两个工作簿的每个工作表,行,列和单元格,报告差异。
如果使用Excel 2007,则可以将工作簿另存为Open-XML(* .xlsx)格式,提取XML并进行比较。Open-XML文件本质上只是.xml文件和清单的.zip文件。
如果您的电子表格在结构上并非一开始就“关闭”,那么在任何一种情况下,您都会遇到很多“噪音”。