C#エクセル編集
C#エクセル出力1
グーグル先生調べ
エクセルを使うと言うことで、ライブラリを追加しないとだめです。
プロジェクト > 参照の追加 >「COM」のタブ から
- Microsoft Excel [適当なバージョン] Object Library
- Microsoft Office [適当なバージョン] Object Library
以上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”が返ってきます。
まあ、条件とかつければその辺どうとでもなるので・・・