C#からExcelを操作して計算結果をエクスポートする例を求められた.
レイトバインディングならdllへの依存性が減らせるが,プログラムの作成中に面倒なことにオートコンプリートが効かない.Microsoft.Office.Interop.Excelを参照に追加するアーリーバインディングが普通です.
using Excel = Microsoft.Office.Interop.Excel;
これが参考に載っていたやり方.ただし,using Microsoft.Office.Interopでもよいかも.
namespace app
{
public partial class Form1 : Form
{
private Excel.Application objApp;
private Excel.Workbook objWorkbook;
private Excel.Worksheet objWorksheet;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
objApp = new Excel.Application();
objWorkbook = objApp.Workbooks.Add();
objWorksheet = (Excel.Worksheet)objWorkbook.Sheets[1];
Excel.Range objRange = objWorksheet.Range["A1..B2"];//objApp.get_Range("A1");
object[,] tbl = new object[2, 2];
tbl[0, 0] = "TEST";
tbl[0, 1] = "TEST2";
tbl[1, 0] = 0;
tbl[1, 1] = 0.1;
objRange.Value = tbl;
objApp.Visible = true;
}
}
}
いったんここまで出来上がってからレイトバインディングに直すのが宜しい.
昔は,VBとC#では大きな違いがあったが,最近はC#でもdynamicなる属性が追加されており,InvokeMember関数を最小限にして置き換えができるようになった.
dynamic属性に付け替えExcel.Application()の部分を汎用のType.GetTypeFromProgID()に変更するだけでよい
public partial class Form1 : Form
{
private dynamic objApp;
private dynamic objWorkbook;
private dynamic objWorksheet;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Type t = Type.GetTypeFromProgID("Excel.Application");
objApp = Activator.CreateInstance(t);
objWorkbook = objApp.Workbooks.Add();
objWorksheet = objWorkbook.Sheets[1];
dynamic objRange = objWorksheet.Range["A1..B2"];
object[,] tbl = new object[2, 2];
tbl[0, 0] = "TEST";
tbl[0, 1] = "TEST2";
tbl[1, 0] = 0;
tbl[1, 1] = 0.1;
objRange.Value = tbl;
objApp.Visible = true;
}
}
参考
【Excelの起動から】 C#でExcelを操作する【保存まで】 ( Milk's Memo Note: https://www.milkmemo.com/entry/csharp_excel)