*

[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

関連記事

Wannabenote

[Unity]Unity2Dチュートリアル パズルを落下させる。

前回の続き。 とりあえず、パズルが消えたので、パズルを落としましょう。 以下のようにソースを

記事を読む

unity rotate worldpoint

[Unity]コードリファレンス GameObjectを回転する。

くるくる回します。 rotationプロパティ Objectの向きをワールド座標で指定します

記事を読む

logo

[Unity, C#]曲線を描こう エルミート曲線とベジエ曲線

演出を作る際に綺麗な曲線を描きたいですよね。 というわけでC#でエルミート曲線とベジエ曲線を計算す

記事を読む

addcomp

[Unity]コードリファレンス コンポーネントをアタッチする。

コンポーネントをプログラム実行時に追加します。 AddComponent() AddComp

記事を読む

logo

[Unity]Unity 2Dチュートリアル スプライトをドラッグ(タップ)して移動する ソース解説

◆全文 using UnityEngine; using System.Collection

記事を読む

wannabenote_unity

[Unity]コードリファレンス ゲーム時間を表示する。

ゲーム内の時間を表示します。 Timeクラス 時間のためのクラスです。 ゲームが起動してか

記事を読む

logo

[C#, AS400]列挙体の文字列化&DB2/400にODBC接続

定数をなるべく書きたくないんです。 あとからメンテをするときに複数箇所変更しなくてはいけないから。

記事を読む

Excel Csharp

[C#]DataGridViewにプロパティを利用しながら配列をバインドする。

DataGridView C#のFormにデータを表示するのに便利なコントロールがあります。 デ

記事を読む

logo

プログラミング概論 導入

プログラミングは基礎から覚えた私ですので、やはり基礎から書いていきます。 よくプログラミングのサイ

記事を読む

logo

[C#,Access]microsoft AccessにODBC接続する

「client AccessのODBC」というタイトルのために、AccessのODBC接続を知りたく

記事を読む

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

Message

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

次の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 ↑