比对xls文件
使用bat运行diff-xls.js文件
bat代码
@echo off
Cscript "路径\diff-xls.js" %1 %2
JS代码
// extensions: xls;xlsx;xlsm;xlsb;xlam
//
// TortoiseSVN Diff script for Excel files
//
// Copyright (C) 2004-2008, 2012-2016, 2019 the TortoiseSVN team
// This file is distributed under the same license as TortoiseSVN
//
// Last commit by:
// $Author: stefankueng $
// $Date: 2019-08-04 12:31:04 +0200 (So., 04 Aug 2019) $
// $Rev: 28647 $
//
// Authors:
// Hiroki Najima <h.najima at gmail.com>, 2013
// Michael Joras <michael@joras.net>, 2008
// Suraj Barkale, 2006
//
// ----- configuration -----
// Fast mode switch
// Fast mode does not copy Worksheets but require opened base document at the same time.
var bFastMode = false;
// ----- constants -----
var vbCritical = 0x10;
var vbExclamation = 0x30;
//var vbInformation = 0x40;
var xlNone = -4142;
var xlMaximized = -4137;
var xlArrangeStyleHorizontal = -4128;
var xlCellValue = 1;
//var xlExpression = 2;
//var xlEqual = 3;
var xlNotEqual = 4;
//var vOffice95 = 7;
//var vOffice97 = 8;
//var vOffice2000 = 9;
//var vOffice2002 = 10;
var vOffice2003 = 11;
//var vOffice2007 = 12;
//var vOffice2010 = 14;
//var vOffice2013 = 15;
// ----- main -----
var aWarningMessages = [];
var objArgs = WScript.Arguments;
if (objArgs.length < 2)
{
Abort("Usage: [CScript | WScript] diff-xls.js base.xls new.xls", "Invalid arguments");
}
var sBaseDoc = objArgs(0);
var sNewDoc = objArgs(1);
var objScript = new ActiveXObject("Scripting.FileSystemObject");
if (objScript.GetBaseName(sBaseDoc) === objScript.GetBaseName(sNewDoc))
{
Abort("File '" + sBaseDoc + "' and '" + sNewDoc + "' is same file name.\nCannot compare the documents.", "Same file name");
}
if (!objScript.FileExists(sBaseDoc))
{
Abort("File '" + sBaseDoc + "' does not exist.\nCannot compare the documents.", "File not found");
}
if (!objScript.FileExists(sNewDoc))
{
Abort("File '" + sNewDoc + "' does not exist.\nCannot compare the documents.", "File not found");
}
sBaseDoc = objScript.GetAbsolutePathName(sBaseDoc);
sNewDoc = objScript.GetAbsolutePathName(sNewDoc);
objScript = null;
var objExcelApp;
try
{
objExcelApp = WScript.CreateObject("Excel.Application");
}
catch (e)
{
Abort("You must have Excel installed to perform this operation.", "Excel Instantiation Failed");
}
// disable all macros
objExcelApp.AutomationSecurity = 3; //msoAutomationSecurityForceDisable
var fExcelVersion = parseInt(objExcelApp.Version, 10);
// Open base Excel book
var objBaseWorkbook;
try
{
objBaseWorkbook = objExcelApp.Workbooks.Open(sBaseDoc, null, true);
}
catch (e)
{
Abort("Failed to open '" + sBaseDoc + "'\nIt might not be a valid Excel file.", "File open error");
}
// Open new Excel book
var objNewWorkbook;
try
{
objNewWorkbook = objExcelApp.Workbooks.Open(sNewDoc, null, true);
}
catch (e)
{
Abort("Failed to open '" + sNewDoc + "'\nIt might not be a valid Excel file.", "File open error");
}
// Show Excel window
objExcelApp.Visible = true;
// Arrange windows
if (objBaseWorkbook.ProtectWindows || objNewWorkbook.ProtectWindows)
{
StoreWarning("Unable to arrange windows because one or both Workbooks are protected.");
}
else
{
// Make windows a compare side by side view
if (fExcelVersion >= vOffice2003)
{
objExcelApp.Windows.CompareSideBySideWith(objExcelApp.Windows(2).Caption);
}
objExcelApp.Application.WindowState = xlMaximized;
objExcelApp.Windows.Arrange(xlArrangeStyleHorizontal);
}
if (!bFastMode && objNewWorkbook.ProtectWindows)
{
StoreWarning("Fall back to fast mode because " + objNewWorkbook.Name + " is protected.");
bFastMode = true;
}
// Create a special workbook for formula conversion.
var objSpecialWorkbook = objExcelApp.Workbooks.Add;
// Mark differences in sNewDoc red
var length = objNewWorkbook.Worksheets.Count;
for (var i = 1; i <= length; i++)
{
var objBaseWorksheet = null;
if (i <= objBaseWorkbook.Worksheets.Count) {
objBaseWorksheet = objBaseWorkbook.Worksheets(i);
}
var objNewWorksheet = objNewWorkbook.Worksheets(i);
if (objBaseWorksheet !== null) {
UnhideWorksheet(objBaseWorksheet);
}
UnhideWorksheet(objNewWorksheet);
if (!bFastMode && objBaseWorksheet !== null)
{
objBaseWorkbook.Sheets(i).Copy(null, objNewWorkbook.Sheets(objNewWorkbook.Sheets.Count));
var objDummyWorksheet = objNewWorkbook.Sheets(objNewWorkbook.Sheets.Count);
objDummyWorksheet.Name = "Dummy_for_Comparison" + i;
objDummyWorksheet.Visible = true;
if (fExcelVersion >= vOffice2003)
{
objDummyWorksheet.Tab.ColorIndex = 16; // 16: Dark gray RGB(128,128,128)
}
}
if (objNewWorksheet.ProtectContents)
{
StoreWarning("Unable to mark differences to " +
ToAbsoluteReference(objNewWorksheet) +
" because the Worksheet is protected.");
}
else
{
objNewWorksheet.Cells.FormatConditions.Delete();
var sFormula;
if (bFastMode && objBaseWorksheet !== null)
{
sFormula = "=INDIRECT(\"" + ToAbsoluteReference(objBaseWorksheet) + "!\"&ADDRESS(ROW(),COLUMN()))";
}
else
{
sFormula = "=INDIRECT(\"Dummy_for_Comparison" + i + "!\"&ADDRESS(ROW(),COLUMN()))";
}
sFormula = convertFormula(sFormula);
objNewWorksheet.Cells.FormatConditions.Add(xlCellValue, xlNotEqual, sFormula);
objNewWorksheet.Cells.FormatConditions(1).Interior.ColorIndex = 3; // 3:Red RGB(128,0,0)
}
}
// Close the special workbook quietly
objSpecialWorkbook.Saved = true;
objSpecialWorkbook.Close();
// Activate first Worksheet
objBaseWorkbook.Sheets(1).Activate();
objNewWorkbook.Sheets(1).Activate();
// Suppress save dialog if nothing changed
objBaseWorkbook.Saved = true;
objNewWorkbook.Saved = true;
// Show warnings if exist
ShowWarning();
WScript.Quit(0);
// ----- functions -----
// Show Message Dialog
// VBcript's MsgBox emulation
function MsgBox(sMessage, iButtons, sTitle)
{
var objShell = new ActiveXObject("WScript.Shell");
objShell.popup(sMessage, 0, sTitle, iButtons);
}
// Show an error message and quit script with cleanup Excel Application Object.
function Abort(sMessage, sTitle)
{
MsgBox(sMessage, vbCritical, sTitle);
if (objExcelApp)
{
objExcelApp.Quit();
}
WScript.Quit(1);
}
// Unhide the Worksheet if it is hidden.
// This also sets color to the tab, if Office2003 or later.
// - 46 (Orange) : Hidden Worksheet
// - xlNone (default) : Not hidden Worksheet
function UnhideWorksheet(objWorksheet)
{
if (objWorksheet.Visible)
{
if (fExcelVersion >= vOffice2003)
{
if (objWorksheet.Tab.ColorIndex !== xlNone)
{
if (objWorksheet.Parent.ProtectStructure)
{
StoreWarning("Unable to set tab color to " +
ToAbsoluteReference(objWorksheet) +
" because the Workbook's structure is protected.");
}
else
{
objWorksheet.Tab.ColorIndex = xlNone;
}
}
}
}
else if (objWorksheet.Parent.ProtectStructure)
{
StoreWarning("Unable to unhide " +
ToAbsoluteReference(objWorksheet) +
" because the Workbook's structure is protected.");
}
else
{
objWorksheet.Visible = true;
if (fExcelVersion >= vOffice2003)
{
objWorksheet.Tab.ColorIndex = 10; // 10:Green RGB(0,128,0)
}
}
}
// Generate Absolute Reference Formula of Worksheet.
function ToAbsoluteReference(objWorksheet)
{
return "[" + objWorksheet.Parent.Name + "]" + objWorksheet.Name;
}
// Convert a formula for workaround in some situation.
// Actually I don't know what will be changed between sFormula and FormulaLocal.
function convertFormula(sFormula)
{
var worksheet = objSpecialWorkbook.Sheets(1);
var originalContent = worksheet.Cells(1, 1).Formula;
worksheet.Cells(1, 1).Formula = sFormula;
sFormula = worksheet.Cells(1, 1).FormulaLocal;
worksheet.Cells(1, 1).Formula = originalContent;
return sFormula;
}
// Accumulate a warning message.
function StoreWarning(sMessage)
{
aWarningMessages[aWarningMessages.length] = sMessage;
}
// Show accumulated warning messages if exist.
// To avoid make huge message dialog, this limits message count to show.
function ShowWarning()
{
var aWarningMessagesLength = aWarningMessages.length;
if (aWarningMessagesLength === 0)
{
return;
}
var sMessage = "The following warnings occurred while processing.\n";
for (var j = 0; j < aWarningMessagesLength; j++)
{
if (j >= 10)
{
sMessage += "... And more " + (aWarningMessagesLength - j) + " messages";
break;
}
sMessage += "[" + (j + 1) + "] " + aWarningMessages[j] + "\n";
}
MsgBox(sMessage, vbExclamation, "Warning");
}
比对xls文件的更多相关文章
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- 用DataGridView导入TXT文件,并导出为XLS文件
使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据.也可以导出.txt,.xls等格式的文件.今天我们就先介绍一下用DataGridView把导入txt文件,导出x ...
- sharepoint2013爬xls文件:Error initializing IFilter for extension的解决方案
最近sharepoint2013爬网出现: error initializing IFilter for extension '.xls' (Error code is 0x80030002). Th ...
- java上传xls文件
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...
- Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据
背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...
- Excel的文件打开特别慢,xls文件特别大解决一例
Excel的文件打开特别慢,xls文件特别大解决一例 打开Excel的xls文件打开特别慢,而且操作也非常慢,动辄需要10几20分钟,很不正常.一个简单的Excel的xls文件有10几兆,甚至几百兆的 ...
- Excel 关于新建xls文件 新建sheet 合并sheet的VBA操作代码
Sub 合并一个文件夹下全部xls文件中sheet到一个xls的sheet()workDir = ThisWorkbook.Path '当前xls文件所在的目录绝对路径'MsgBox workDir, ...
- poi excel文件上传并解析xls文件
1.jsp页面 <form action="hw/pe_xls_upload" method="post" enctype="multipart ...
- php中使用PHPExcel操作excel(xls)文件
读取中文的xls.csv文件会有问题,网上找了下资料,发现PHPExcel类库好用,官网地址:http://phpexcel.codeplex.com/ 1.读取xls文件内容 代码如下 复制代码 ...
- java poi导入EXCEL xls文件代码
/** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...
随机推荐
- #PowerBi Superchange PowerBi 开篇(1)
本书由B站京西漫步老师推荐,并提供了相应的学习资源,有同感兴趣的朋友,可以加我好友免费分享资源. 本书主要以总结笔记,原文+译文+部分案例实操为主. 预计更新时间为23年6月-23年7月. 本系列笔记 ...
- Libgdx游戏开发(5)——碰撞反弹的简单实践
原文: Libgdx游戏开发(5)--碰撞反弹的简单实践-Stars-One的杂货小窝 本篇简单以一个小球运动,一步步实现碰撞反弹的效果 本文代码示例以kotlin为主,且需要有一定的Libgdx入门 ...
- 小白也能懂的Mysql数据库索引详解
核心概念 主键索引/二级索引 聚簇索引/非聚簇索引 回表/索引覆盖 索引下推 联合索引/最左联合匹配 前缀索引 explain 一.[索引定义] 1.索引定义 在数据之外,数据库系统还维护着满足特定查 ...
- VSCode中设置用IPython运行Python代码
VSCode中设置用IPython运行Python代码 在IPython中运行所选的代码: 在设置中, 找到python.terminal.launchArgs这一项, 设置为如下内容. " ...
- Docker Harbor的安装配置
1.先安装docker-compose curl -L http://github.com/docker/compose/releases/download/1.21.2/docker-compose ...
- 网络化的控制系统简介(NCS)
作为一个搞物联网应用的,最近才接触到NCS这个概念.有点东西,赶紧记录一下. NCS由通过网络连通的控制环路组成,控制信号和反馈信号会在控制器和本地系统间交换.典型的方块图如下: 其中,本地(Plan ...
- Java开发框架演变过程
JavaWeb开发简史 Java框架创始人 Java框架说明 Spring: 把应用程序中的bean统一交给Spring进行管理控制,简化了我们的代码操作,和降低了代码的耦合度,Spring框架基本上 ...
- react上传文件显示上传进度
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在使用react, vue框架的时候, 如果需要监听文件上传可以使用axios里的onUploadPro ...
- Acwing周赛分享
Acwing 周赛28 题面1 给定一个由大写字母构成的字符串 s,请计算其中有多少个子序列 QAQ. 注意,子序列不需要连续. 提示:本题数据范围较小,可以直接三重循环枚举三个字母的位置. 输入格式 ...
- eclipse取消默认工作空间的两种方法
对于eclipse的默认的工作空间,如果不需要正常切换workspace的用户很方便,打开eclipse便自动进入默认的工作空间.而如果用户经常在多个workspace之间切换的话,启动eclipse ...