【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