目次

C#エクセル編集

C#エクセル出力1

グーグル先生調べ

エクセルを使うと言うことで、ライブラリを追加しないとだめです。

プロジェクト > 参照の追加 >「COM」のタブ から

以上2つを追加しました。

見ためはウィンドウにボタン一個貼り付けただけのものです。
ソースはだいぶ端折ってますが、分かる人しか見ないだろうからこれで良し。

using Excel=Microsoft.Office.Interop.Excel;
private void button1_Click(object sender, EventArgs e){
    Excel.Application app = new   Excel.Application();
    Microsoft.Office.Interop.Excel._Workbook wb = app.Workbooks.Add(Type.Missing);
    wb.Application.Visible = true;
    Excel._Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
    ws.Cells[1, 1] = "入力してみるテスト";
    ws.Cells[5, 5] = "ここに入力";
}

一個しかないボタンを押すとエクセルが立ち上がり、A1とE5に文字が入力されているはずです。

icrosoft.Office.Interop.Excelはusingに入れてみたが、なんかうまく認識されなかったので、
長ったらしくなりますが仕方なく全部書いてます。

usingの書き方がいつもと違うのがちょっとしたポイントかもしれない。

C#エクセル入力

開くファイルは、A1~A20まで列数に対応する数字(例: A3 ⇒ 3 )が入ってます。そのほかに、B10に値「999」が入っています。

try
{
    Excel.Application app = new Excel.Application();
    //エクセルのファイルを開く
    Excel._Workbook wb = app.Workbooks.Open(@"C:\Book1.xls",
    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value);
 
    //エクセルが起動 なくてもokっぽい
    wb.Application.Visible = true;
    Excel._Worksheet ws = (Excel.Worksheet)wb.Sheets[1]; <-一枚目のシート指定
 
    //読み込む範囲の指定A1からB20までの範囲。セル数40
    Excel.Range range=ws.get_Range("A1","B20");
    object[,] saRet;
    saRet = (System.Object[,])range.get_Value(Missing.Value);
 
    long iRows = saRet.GetUpperBound(0);
    long iCols = saRet.GetUpperBound(1);
    //表示させる文字列を作る(?)ループたち
    for (long rowCounter = 1; rowCounter <= iRows; rowCounter++)
    {
        for (long colCounter = 1; colCounter <= iCols; colCounter++)
        {
            if (saRet[rowCounter, colCounter] != null) <-参照なしがポイントです
            {
                valueString += String.Concat("値" + rowCounter + "," + colCounter + ":",
                saRet[rowCounter, colCounter].ToString() + "\n");
            }
        }
    }
    MessageBox.Show(valueString);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

ていうか、Microsoftのサポートページだかにあったものほぼそのままです。あえて言うなら、「参照なしがポイントです」の部分。

range.get_Value でObject型配列を取得しているけど、

特にB行は空欄のセルがあって、その部分はnullが入るので、nullをどうにかしないと

例外吐いて止まるので、そこだけです。

C#エクセル出力2

Excelファイルの末尾行にデータを追加するため、最終行を判定する部分。

適当に作ったFormには、ボタンが一つとテキストボックスが3つあり、値を読み込んで一番最後の列に追加します。

ワークシートの読込とかはコンストラクタで処理済みです。

private void button2_Click(object sender, EventArgs e)
{
    object box1, box2, box3;

    box1 = textBox1.Text;
    box2 = textBox2.Text;
    box3 = textBox3.Text;

    ※ws=ワークシートを表すオブジェクト
  long count=ws.UsedRange.Rows.Count;

    ws.Cells[count + 1, 1] = box1;
    ws.Cells[count + 1, 2] = box2;
    ws.Cells[count + 1, 3] = box3;

}

型とかかなり適当です。

挙動としては、たとえばA行に3列、B行に4列入力されているとしたら、5列目に追加されます。

また、既存のファイルを読み込んでいるせいかもしれませんが、

データが何もない状態だと、countの値は”1”が返ってきます。

まあ、条件とかつければその辺どうとでもなるので・・・