昔に比べて C# からも扱いやすくなったって話を聞いたんで C# でやってみました。
確かに扱いやすくなっている。
VBA の時にスルーしている Workbooks とか Worksheets とか Cells あたり、VSTO の記事ではきちんと漏らさず参照しては解放してあげないとならないって話だったけど、今回は VBA のようにスルーしてみた。
ドキュメント レベルのカスタマイズで、こいつが中心となって 2種類のファイルを読み込み、新規ブックにシートを 3つ作成してデータを吐き出す。 特に Excel のプロセスが残るようなトラブルもありませんでした。
いやー面倒くさくない。 楽ちん楽ちん。

とは言え、所詮は Excel の COM オブジェクトのラッパーでしかないので、セルへのアクセスが多いと速度が出ないですね。
Worksheet オブジェクトのインスタンス内包し、各種の独自メソッドなどを組み込んだクラスを作成してガツガツと数万件のデータを読み込んでは加工して出力していったんですけれど、数万件のデータを 1件ずつセルから入出力してるとスピードの遅さが気になって仕方がない。
ならば処理の進捗をカスタム作業ウィンドウにプログレスバーなどで表示してみようと思ったのですが、これも所詮は Excel です。 長い処理を行うプロセスから進捗具合を Excel の作業ウィンドウで受け取る術がない。
スレッドを分けるとかできないんですね。
というか VBA のようにカスタム作業ウィンドウのコードに処理を詰め込んでしまえばプログレスバーに進捗を表示できるんでしょうが、いくらなんでも開発言語のメリットを殺してますよね。

Excel アプリケーション自体を駆動することを諦め、Excel のドキュメントをコントロールするライブラリを探す時間がなかった。
2年ぐらい前に ClosedXML ってライブラリを使ったんだけど、ライブラリの完成度がいまいちだったのでいろいろ泣かされた記憶がある。
今はもっと成熟してるのかなぁ。 ほかにも同種のライブラリが出てきたりしてるのかなぁ。

ともかくそういう調査をしている時間がなかったので泣く泣く VBA で行うことになりました。
VBA ならば Office Developer Tools for Visual Studio 2013 を使うよりも処理は速そうだけど、やっぱ数万件のデータってのが気になる。 データが書き込まれているファイルを開いたら、シート上のデータを 2次元配列に一気に読み取って、すべての中間加工処理は配列の中で済ませることにした。
書き込みは処理の都合上 1件ずつセルに書き込むしかない。
それでも 3万件のデータ処理が 10秒ぐらいで終わる爆速ぶり。
VBA すげーな。
そしてこの種の処理に VSTO (というか Office Developer Tools for Office) は向かないのかもしれないね。
私のスキルが低いだけか。