*

[Excel,C#]C#でExcelにデータを一括出力する

公開日: : 最終更新日:2014/12/28 C#, Excel, プログラミング

大体いつも忘れるこのやり方。

Excelにデータを出力する

方法論

単純な方法ではデータを一行ずつ作って一行ずつ出力すればいいんです。
しかし、実はC#を絡めて一行ごとに処理させるとすごい時間がかかります
やってみるとわかるのですが、

1レコード分を準備する

Excelの行を指定する

データを出力する

1レコード分を準備する

という感じで記述すると、Excelの行指定の部分でCOMに投げるので、
ものすごい処理に負担がかかります

ぶっちゃけ耐えられないほど遅い。

VBAで書けば、耐えられなくもないですが、それでも遅いです。

ではどうするか

Excelにアクセスする部分がボトルネックになっているのであれば、アクセスする回数を減らせばいいんです。
だから一括で出力をします。

さて、一括で出力するにはどうすればいいでしょうか。
そこで、配列を使います。

C#で記述

ソース

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

public class TestClass{
	public void Test() {

		string[,] strs = new string[1000, 50];
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 50; j++) {
				strs[i, j] = "i=" + i.ToString() + " j=" + j.ToString();
			}
		}
		object[,] datas = new object[1000, 50];
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 50; j++) {
				datas[i, j] = strs[i, j];
			}
		}
		Excel.Application app = Globals.ThisAddIn.Application;
		Excel.Workbook wBook = app.ActiveWorkbook;
		Excel.Worksheet wSheet = wBook.ActiveSheet;
		Excel.Range range = wSheet.Range[wSheet.Cells[1, 1], wSheet.Cells[1000, 50]];
		range.Value2 = datas;
	}
}

実行イメージ

wannabenote

解説

渡すデータの作り方

適当に1000行*50列のデータを作成して、それをExcelに一括で出力しています。
Excelに渡すデータはObject型の二次元配列(ジャグ配列は不可)にします。
またObject型なので、intやstringを混在させることが出来ます

Excelの出力先指定方法

		Excel.Application app = Globals.ThisAddIn.Application;
		Excel.Workbook wBook = app.ActiveWorkbook;
		Excel.Worksheet wSheet = wBook.ActiveSheet;
		Excel.Range range = wSheet.Range[wSheet.Cells[1, 1], wSheet.Cells[1000, 50]];
		range.Value2 = datas;

ExcelのアプリケーションをThisAddInから取得して、
そのアクティブなワークブック、ワークシートを取得します。
ThisAddInで取得するにはアドインのプロジェクトにする必要があります。
もしもアドインプロジェクトの作り方がわからなければこちらを参考ください→[C#,Excel]visual studio tools for office(VSTO)を利用してExcelのAddInをC#で作る
もちろんCOMを参照設定して、自力で取ってきても構いません。
Excel.Applicationさえ手に入ればそれで大丈夫です。

rangeで範囲を指定するのですが、このとき[]を利用することによって数字を使うことが出来ます。
get_Range()を利用すると”A1″とか列名などを変換しなくてはならないため面倒ですので、こちらの方法がお勧め。

そして最後にValue2に代入することで一括出力が出来ます。

なお、rangeを配列よりも大きく指定すると、#N/Aになります。
また、逆にrangeを配列よりも小さく指定すると、あふれた部分は切り捨てられます。
データが一部出ないというときは配列の大きさ指定が合っているかを確認してください。

大体いつも私が忘れるのは wSheet.Range[wSheet.Cells[1, 1], wSheet.Cells[1000, 50]] の書き方を忘れるので書いておきました。
さぁ、皆さんも脱VBA!

ad

関連記事

Unity_

[Unity]Unity2Dチュートリアル 画面上のGameObjectを左下から取得する

前回、画面上のオブジェクトを一括で手に入れる方法はわかりました。 しかし、これではどのオブジェクト

記事を読む

Wannabenote

[Unity]Unity2Dチュートリアル 繰り返しパズルを消す その2

Unityまとめページはこちら。 前回の続き。 準備が出来たので、ソースを変更致しましょ

記事を読む

Unity_

[Unity]Unity2Dチュートリアル 同じ色で繋がったパズルを消去する ソース解説

◆全文 using UnityEngine; using System.Collecti

記事を読む

Unity_

[Unity]Unity2Dチュートリアル スプライトを利用する その2

前回で、タイルを置いて、全部消えちまうじゃねぇか! 色一個一個つけるのめんどくせぇ!! というところ

記事を読む

logo

[C#, Linq]foreach構文は書けるけど、Linqはよくわからなくて勉強する気がなくなった貴方に

Linq普及委員会エントリです。 いまさらすぎるわ! とか言わないで。 小難しい話はなしに、

記事を読む

logo

[C#]パスワード暗号化プログラムの初歩

パスワード暗号化の初歩的方法。 子供だましみたいなプログラムですね。 これは入社四か月の頃にプロ

記事を読む

Excel vsto 印刷設定 print setting

[C#, VSTO]Excelの印刷設定をする

印刷設定 VSTO(Visual Studio Tool for Office)Excelなんぞを

記事を読む

Unity_

[Unity]Unity2Dチュートリアル 直線で3つ同色のパズルを消去する

前回の続き。 パズドラじゃなくて、パズドラ+ぷよぷよの謎パズルを作ってしまったので、 今回は

記事を読む

cwbx.dll 参照の追加

[C#,AS400]C#でAS400のプログラムCallとコマンドの実行方法。

PCのプログラムからCall AS400のRPGPGMをPCから呼び出ししたいときがあります。

記事を読む

socket p2p unity

[Unity]Socket通信でP2Pすっぞ ホストへ接続

前回はホストが待ちうけするところまで作りました。 今回はクライアントがホストへ接続できるように

記事を読む

ad

Comment

  1. kaoru より:

    using Microsoft.Office.Tools.Excel;//[.NET] タブにある一覧から、”Microsoft.Office.Tools.Excel” を選択。

    に見つからないとなってしまいます。

    Windows8.1, Visual Studio 2013, Excel(office personal 2013)の組み合わせです。

    何を追加したらよいか、ご示唆ください。

    よろしくお願いします。

    • わな び より:

      using Microsoft.Office.Tools.Excel;
      で、エラーが出てる感じですかね。

      たぶん参照設定が上手くいっていないかと。
      ・ソリューションエクスプローラを開く
      ・参照設定を右クリック
      ・出てきたウィンドウのアセンブリ -> 拡張 -> Microsoft.Office.Tools.Excel にチェックを入れてOKを押す

      これでどうでしょうか。

      もしくはこっち -> http://wannabe-note.com/392

わな び にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑