JavaScript
正規表現
Excel
WSH

WSHでExcelのテキスト差分取得ツールを作るよ

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型の取り扱いで、嵌った。
  • ソースに美意識が足りなかった。