原文:VSTO学习笔记(九)浅谈Excel内容比较

说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速、准确的比较,有详细的差异报告,非常便于分析。其实,各种版本控制软件中也包含有或多或少的比较功能,如TFS、CVS、SVN等。但是如果待比较的文件不是基于文本类型的,那就无能为力了。今天我就来谈一谈Excel的比较方法及其特点,也和大家共同探讨一下,如果你有更好的方法,欢迎分享。

一、Excel的文件架构

Excel的文件结构,一个Excel是一个工作簿,其中可以包含若干个工作表,正式由于这个架构,造成比较Excel中的内容比较困难,尤其当工作表中的数据量很大时,常规的比较软件更是无能为力。

二、三种比较方法

下面我分别用三种方法来比较两个Excel中的内容,首先准备两个测试Excel,为了简单起见,两个Excel都只包含一个工作表,其中填充了一些数字:

图1、1.xlsx

图2、2.xlsx

1、首先我用比较笨的方法,写一段程序,逐个比较单元格(假设两个Excel中包含的工作表的命名和个数完全相同):

代码

; j <= sheet.UsedRange.Columns.Count; j++)
                    {
                        string src = sheet.Cells[i, j].Value2 == null ? string.Empty : sheet.Cells[i, j].Value2.ToString();
                        string dest = destBook.Worksheets[sheet.Name].Cells[i, j].Value2 == null ? string.Empty : destBook.Worksheets[sheet.Name].Cells[i, j].Value2.ToString();

                        if (src != dest)
                        {
                            msg = DateTime.Now.ToString() + "------" + sheet.Name + " 【" + this.fnGetExcelAddress(i, j) + "】单元格中的内容不相同\n";
                            this.__int内容不同单元格个数++;
                            this.__dic内容不同.Add(this.__int内容不同单元格个数, msg);
                            writer.WriteLine(msg);
                        }
                    }
                }
            }
            writer.WriteLine("*********************************************************************************\n");

            srcBook.Save();
            destBook.Save();

            app.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(srcBook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(destBook);
            app = null;
            srcBook = null;
            destBook = null;
            GC.Collect();
        }

2、使用OpenXML SDK 2.0

前面的文章讲过OpenXML SDK及其相关工具的简单用法,其实还可以用它来比较Excel,当然,仅限于比较Excel 2007、Excel 2010。

如果你还没有安装OpenXML SDK 2.0,可以在这里下载。

下载完毕,一步步安装结束后,就可以使用了。

1)打开Productivity Tool:

2)对这个工具做一些简单配置:

可以选择显示行号、忽略命名空间、忽略声明:

选择待比较的Excel版本,我使用的Excel 2010,故选择第二个:

3)点击【Compare Files】,然后选择两个待比较的Excel文件,点击【OK】:

4)可以看到Excel被分拆成了一个个part,标记为绿色的表示内容中有不同:

5)选择一个标记为绿色的part,点击【View Par Diff】,可以查看具体的明细:

这个界面与传统的比较软件中的界面非常相似,可以很容易的看出不同之处。

这种方法的缺点是比较结果不够直观,难以获取比较的汇总结果,当数据量很大时更是如此。

3、使用SpreadshCompare

SpreadshCompare是国外人写的一个VBA插件,开源免费,可以在sourceforge上下载,最新版本是1.15,支持Excel 2003,Excel 2007,目前还不支持Excel 2010 x64。由于我使用的是Excel 2010 x64,故暂时在虚拟机中进行测试。

我使用的Hyper-V,安装了Windows Server 2003 R2,Office 2007。

1)下载完毕安装后,在Excel的【加载项】中可以看到一个天平的小图标:

2)先打开两个待比较的Excel:1.xlsx、2.xlsx,然后分别选择两个待比较的Excel,点击【Next】:

3)选择逐单元格比较,保持大小写敏感,其他选项默认:

4)分别选择待比较的工作表,点击【Next】:

5)选择比较所有的区域,点击【Next】:

6)选择生成汇总表选项,保持默认即可:

7)设置工作表的顺序,然后点击【Compare】:

8)首先会给出一个简短的汇总信息:

9)点击【确定】后会生成两个工作簿,一个记录所有不同之处,另一个给出单元格对比分析:

10)同时对源文件也用颜色进行了标示,黄色表示不同:

经过大量数据测试,该插件性能很高,速度较快。以后我会试着修改下这个插件的源代码,争取支持Excel 2010 x64。

其他类似的还有Compare Spreadsheet For Excel(商业软件)、Excel Compare(商业软件)、Synkronizer for Excel(商业软件)等。

三、小结

本次我们畅谈了下Excel的比较问题,给出了三种解决方案,三种方案各有优劣,只是适用场合不同,请根据你的需求进行选择。

VSTO学习笔记(九)浅谈Excel内容比较的更多相关文章

  1. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  2. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  3. Android开发学习笔记:浅谈GridView

    GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的.主要用于设置Adapter. GridView常用的X ...

  4. Docker学习笔记之浅谈虚拟化和容器技术

    0x00 概述 相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识. ...

  5. Android开发学习笔记:浅谈显示Intent和隐式Intent

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/655132 ...

  6. Android开发学习笔记:浅谈WebView(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  7. Android开发学习笔记:浅谈WebView

    本文转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页 ...

  8. 转 Android开发学习笔记:浅谈WebView

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  9. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

随机推荐

  1. CxSkinButton按钮皮肤类

    在codeproject 发现一个很强大的按钮皮肤类,之前的版本有内存泄露,但是作者已经修复了,原文网址是:http://www.codeproject.com/KB/buttons/cxskinbu ...

  2. 【数位DP】 HDU 4722 Good Numbers

    原题直通车: HDU  4722  Good Numbers 题意: 求区间[a,b]中各位数和mod 10==0的个数. 代码: #include<iostream> #include& ...

  3. [置顶] 程序员面试之道(《程序员面试笔试宝典》)之看着别人手拿大把的offer,不淡定了怎么办?

    不管是在哪里,不管发生什么事,不要随便放下自己. ——<当男人恋爱时> 很多求职者都会面临一个问题:别人手拿大把大把的offer了,而自己却是两手空空,别人签约之后已经过着“猪狗不如”的悠 ...

  4. Swift - 制作一个录音机(声音的录制与播放)

    1,技术介绍 (1)AVFoundation.framework框架提供了AVAudioRecorder类.它可以实现录音功能. (2)而使用该框架的AVAudioPlayer类,可以实现声音的播放. ...

  5. VS2010+QT4.8.5 +FastReport教程

    如需转载请标明出处:http://blog.csdn.net/itas109 採用QT 的QAxObject方式执行FastReport特别麻烦,并且无法在编译的时候知道代码是否正确,并且大部分的函数 ...

  6. WF4.0——升级技能:托付应用

    回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...

  7. sql: PL/SQL proc

    A PL/SQL block has the following structure: [DECLARE declaration_statements ] BEGIN executable_state ...

  8. 理解javascript中的for语句

    程序实现中经常要用到循环语句,其中for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面就分别来讲述我的理解. 第一种:(通常情况,循环执行相关操作) var ob ...

  9. 使用mex进行混合编程的一些注意事项

    1.mxGetPr的使用: Use mxGetPr on arrays of type double only. Use mxIsDouble to validate the mxArray type ...

  10. UVA 311 Packets 贪心+模拟

    题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个. 一开始以为能箱子套箱子,原来不是... 装箱规则:可以把箱子都看 ...