LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-31

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3