【C#】Excelの読み込みと書き込みをしてみる(その1)
おはようございます。
久しぶりのC#ネタ。
Excelの読み書きは最近では COM は利用せずに、Open Xml SDK、ClosedXML、NPOI などが主流っぽいですが、
xls、xlsx 両方に対応するのは COM の方がサクッとできそうなので昔ながらの方法を試します。
スポンサーリンク
画面
Windows Forms でプロジェクトを作成し、画面にテキストボックス、ボタン等を配置。
参照ライブラリの追加
ソリューションエクスプローラーからプロジェクトの「参照」を右クリックし、「参照の追加」を選択。
参照マネージャーで、「Microsoft Excel xx.x Object Library」にチェックし、「OK」ボタンをクリックします。
プログラム
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace SampleExcel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 参照ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_file_Click(object sender, EventArgs e)
{
OpenFileDialog ofDialog = new OpenFileDialog();
ofDialog.InitialDirectory = @"C:\wk\tmp";
ofDialog.RestoreDirectory = true;
ofDialog.Title = "対象ファイルを選択";
//ダイアログを表示する
if (ofDialog.ShowDialog() == DialogResult.OK)
{
this.txb_file.Text = ofDialog.FileName;
}
}
/// <summary>
/// 書き込みボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_output_Click(object sender, EventArgs e)
{
// Excel起動
Excel.Application app = new Excel.Application();
app.DisplayAlerts = false;
app.Visible = false;
// ブック、シート定義
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
try
{
// ブック選択
book = app.Workbooks.Open(txb_file.Text);
// シート選択
sheet = book.ActiveSheet;
try
{
string value = "";
// セル値読み込み
var obj = sheet.Range[txb_cell_range.Text].Value;
if (obj is string)
{
value = obj;
}
else if (obj is double)
{
value = ((double)obj).ToString();
}
sheet.Range[txb_cell_range.Text].Value = txb_value.Text;
}
finally
{
Marshal.ReleaseComObject(sheet);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (book != null)
{
book.Close(true, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(book);
}
if (app != null)
{
app.Quit();
Marshal.ReleaseComObject(app);
}
}
}
/// <summary>
/// 読み込みボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_input_Click(object sender, EventArgs e)
{
// Excel起動
Excel.Application app = new Excel.Application();
app.DisplayAlerts = false;
app.Visible = false;
// ブック、シート定義
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
try
{
// ブック選択
book = app.Workbooks.Open(txb_file.Text);
// シート選択
sheet = book.ActiveSheet;
try
{
string value = "";
// セル値読み込み
var obj = sheet.Range[txb_cell_range.Text].Value;
if (obj is string)
{
value = obj;
}
else if (obj is double)
{
value = ((double)obj).ToString();
}
MessageBox.Show(value, "Excelサンプル");
}
finally
{
Marshal.ReleaseComObject(sheet);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (book != null)
{
book.Close(true, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(book);
}
if (app != null)
{
app.Quit();
Marshal.ReleaseComObject(app);
}
}
}
}
}
ビジュアルエディタにて、ボタンのイベントを追加して処理を記述していきます。
とりあえず、対象の Excel を選択させる「参照」ボタン、読み込み処理の「読み込み」ボタン、書き込み処理の「書き込み」ボタンにイベントを追加。
※デザイナーソースは割愛
起動してみる
サンプルの Excel を用意し、「C:\wk\temp」に格納しておきます。
起動後、ファイル選択、対象に「C2」を指定して読み込みボタン押下で、内容が表示されました。
値に「test」を指定して書き込み後、再度読み込みボタンを押下で、表示が変わったことを確認。
Excelを開いてもちゃんと反映されていましたので、無事完了。
まとめ
COMの場合、しっかりプログラミングしないと Excel のプロセスが残ってしまう問題が
まあ多発するらしいので、次回はそこら辺をやってみようかと思います。
何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
ご熱心の解説をいただいてありがとうございます!C#を使用しているとあらゆるコンポーネントを参照する場合がよくありますね、Spireというオフィスドキュメント処理の専門家として、WordやExcel、presentationやPDFなどのファイルをコードで簡単に各種の操作を実現できます、しかも無料版もありますし、とても便利です、是非試してみてください:https://www.e-iceblue.com/Download/office-for-net-free.html