SVN操作 -- TortoiseSVN中的Excel文件比较

TortoiseSVN自带的比较工具

在使用TortoiseSVN时,经常需要在提交前比较本地修改的文件和版本库上的文件之间的差异。TortoiseSVN自带了一个比较工具TortoiseMerge,不过这个比较工具只能比较文本文件,不能比较二进制文件,对Excel文件的差异同样也是无能为力。
除了TortoiseMerge之外,TortoiseSVN还自带了一组vbs和js的脚本,用来比较一些非文本类型的文件。这些脚本放在TortoiseSVN安装路径的Diff-Scripts目录中。对Excel文件可以通过diff-xls.js来比较,不过这个脚本的作用仅仅是并排打开了两个Excel窗口,并没有进行真正的比较操作。

Excel文件比较工具

既然TortoiseSVN自带的比较工具不能比较Excel文件,那么是否有其他工具可以用来比较Excel文件呢,答案是肯定的,事实上有很多这样的第三方软件可以用来比较Excel文件。
例如著名的文件比较工具Beyond Compare就可以用来比较Excel文件, 不过Beyond Compare只能比较两个Excel文件的其中一个工作表,如果Excel中包含多个工作表,Beyond Compare只会在两个Excel的当前工作表之间进行比较,这里的当前工作表指这个Excel文件当前正在使用的工作表,也就是文件打开后显示的第一个工作表。
例如1.xlsx中包含两个sheet,分别为Sheet1和Sheet2,2.xlsx中同样也包含两个sheet,同样是Sheet1和Sheet2,但1.xlsx当前工作表是Sheet1,2.xlsx当前工作表是Sheet2,则Beyond Compare比较这两个文件时比较的是1.xlsx中Sheet1和2.xlsx中的Sheet2。而不是期望的1.xlsx中Sheet1和2.xlsx中的Sheet1比较,1.xlsx中Sheet2和2.xlsx中的Sheet2比较。

Spreadsheet Compare工具

Spreadsheet Compare工具是Office2013中自带的Excel文件比较工具,它能够同时比较多个工作表,相比Beyond Compare来说要更加好用。
Spreadsheet Compare工具在按照Office2013后默认会在 C:\Program Files (x86)\Microsoft Office\Office15\DCF目录中,文件名是SPREADSHEETCOMPARE.EXE。在开始菜单项Microsoft Office 2013下面也有对应的快捷方式。

下面讲如何在TortoiseSVN中集成Spreadsheet Compare,使得TortoiseSVN中比较Excel文件时默认使用Spreadsheet Compare来比较。由于Spreadsheet Compare工具只在Office2013版本中才有,所以前提是已安装好Office2013(Office2013之后的版本没有用过,不知道有没有包含这个工具)。

在TortoiseSVN中集成Spreadsheet Compare

  1. 将如下内容保存为.bat的批处理文件,文件名任意。然后将文件放置到Spreadsheet Compare工具所在的目录。

    @echo off
    chcp 65001
    set toolpath=%~dp0
    echo %~1> "%toolpath%temp.txt"
    echo %~2>> "%toolpath%temp.txt"
    "%toolpath%SPREADSHEETCOMPARE.EXE" "%toolpath%temp.txt"
    
  2. 打开TortoiseSVN设置窗口(任意目录右键 – TortoiseSVN – 设置),左侧选择"差异查看器",点击右侧的"高级设置"按钮。
    SVN操作 -- TortoiseSVN中的Excel文件比较_第1张图片

  3. 在打开的高级差异比较设置对话框中点击"增加"按钮,然后在扩展名中填入.xlsx,在外部程序中填入C:\Program Files (x86)\Microsoft Office\Office15\DCF\new.bat %base %mine。批处理文件就是刚刚步骤1中保存的文件,路径和文件名根据实际来设置。然后点击确定即可。
    SVN操作 -- TortoiseSVN中的Excel文件比较_第2张图片
    设置完成之后,在TortoiseSVN提交窗口中,双击.xlsx文件,就会使用Spreadsheet Compare来比较Excel文件了。

实现原理

实现原理非常简单,在TortoiseSVN提交窗口中,双击.xlsx文件就会调用C:\Program Files (x86)\Microsoft Office\Office15\DCF\new.bat %base %mine,参数%base是版本库文件的完整路径,%mine本地修改文件的完整路径。然后new.bat将这两个文件路径保存到一个文本文件temp.txt中(这个文件名没有什么特殊的要求,可以随便取),然后调用Spreadsheet Compare工具(SPREADSHEETCOMPARE.EXE),参数为刚生成的文本文件temp.txt。然后Spreadsheet Compare就会根据这个文件来分别读取两个Excel文件,并进行比较。

这里有几点需要注意,尤其是第二点需要特别注意,以免丢失数据。

  1. SPREADSHEETCOMPARE.exe的参数是一个文本文件,把要比较的文件分成两行分别放到这个文本文件中。这和其他常见的比较工具的参数不一样,通常其他比较工具都是直接把要比较的两个文件作为参数。
  2. SPREADSHEETCOMPARE.exe读取文本文件后会自动删除该文件,不需要在bat脚本中删除该临时文件了。此外,由于SPREADSHEETCOMPARE.exe总是把第一个参数作为临时文件,使用完自动删除,所以千万不要直接把要比较的Excel文件作为参数传给SPREADSHEETCOMPARE.exe,因为这不仅会导致SPREADSHEETCOMPARE.exe执行异常,还会导致第一个参数的Excel文件被删除。
  3. 如果要比较的Excel文件路径,或文件名中包含中文,则临时文件temp.txt一定要使用无BOM的utf-8编码格式。如果使用ANSI,会导致文件名解析失败。这也是为什么需要在批处理脚本中执行chcp 65001,切换代码页为utf-8。
  4. 在TortoiseSVN设置界面填写比较程序时,扩展名一定要包含.,也就是.xlsx,而不能是xlsx。此外,填入的外部程序路径一定要包含扩展名.bat,也就是C:\Program Files (x86)\Microsoft Office\Office15\DCF\new.bat %base %mine,而不能是C:\Program Files (x86)\Microsoft Office\Office15\DCF\new %base %mine。
  5. Spreadsheet Compare功能仍然不完善,有时比较的行和列会出现错位,不支持手动指定比较的行和列,也不支持手动指定Sheet来比较。

你可能感兴趣的:(批处理脚本)