WSHでExcelのテキスト差分取得ツールを作るよ
以下の仕様
- セル内テキストを比較
- Drag & Dropで、2ファイルを比較
- 比較結果をCsv出力
- 比較結果で、改行は半角スペースで表現
本体(XlsxDiff.wsf)
// UTF-16LEで保存すること.
<job>
<script language="JavaScript" src="CommonUtil.js"></script>
<script language="JavaScript" src="XlsxUtil.js"></script>
<script language="JavaScript">
// 引数チェック.
if ( WScript.Arguments.length !== 2 ){
$.info( "2ファイルをD&Dしてください.", "エラー" );
WScript.Quit();
}
// セル値取得.
var leftPath = WScript.Arguments( 0 );
var rigthPath = WScript.Arguments( 1 );
var leftCellMap = getCellMap( leftPath );
var rightCellMap = getCellMap( rigthPath );
// making result.
var result = [];
for ( var key in leftCellMap ){
if ( leftCellMap[key] != rightCellMap[key] ){
result.push( getResultString( key, leftCellMap, rightCellMap ) );
}
}
for ( var key in rightCellMap ){
if ( !( key in leftCellMap ) ){
result.push( getResultString( key, leftCellMap, rightCellMap ) );
}
}
result.sort();
result.unshift(
"シート, セル位置, " + $.Fso.getFilename( leftPath ) + ", " + $.Fso.getFilename( rigthPath )
);
// CSV出力
$.AdoDbStream.writeFile(
$.Fso.getParentFolderName( WScript.ScriptFullName ) + $.FileSeparator + "result.csv",
result.join( "\n" ), "utf-8"
);
// 終了.
$.info( "done.", "end" );
WScript.Quit();
// cellMap.
function getCellMap( path ){
var tmpCellMap = {};
$.Xlsx.withXlsx( path, function( ole, book ){
$.mapX( book.Worksheets, function( sheet ){
$.assignObject( tmpCellMap, $.Xlsx.range2AddressMap( sheet.name, sheet.usedrange ) );
});
});
return tmpCellMap;
}
// resultString.
function getResultString( key, leftCellMap, rightCellMap ){
var sheetName = key.split( "!" )[0];
var cellAddress = key.split( "!" )[1];
var leftCellValue = getCellValue( key, leftCellMap );
var rightCellValue = getCellValue( key, rightCellMap );
return sheetName + "," + cellAddress + "," + leftCellValue + "," + rightCellValue;
}
// cell string.
function getCellValue( key, cellMap ){
var cellValue = cellMap[key] ? cellMap[key] : "<no value>";
return cellValue.replace( /\r?\n/g, " " );
}
</script>
</job>
共通FW(CommonUtil.js)
Excel用FWっぽいの(XlsxUtil.js)
総括・ハマりポイント
- ExcelのDate型の取り扱いで、嵌った。
- ソースに美意識が足りなかった。