【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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Windows.Forms; usingSystem.Runtime.InteropServices; usingExcel=Microsoft.Office.Interop.Excel; namespaceSampleExcel { publicpartial classForm1:Form { publicForm1() { InitializeComponent(); } /// <summary> /// 参照ボタンクリック /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbtn_file_Click(objectsender,EventArgse) { OpenFileDialog ofDialog=newOpenFileDialog(); 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> privatevoidbtn_output_Click(objectsender,EventArgse) { // Excel起動 Excel.Application app=newExcel.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 { stringvalue=""; // セル値読み込み varobj=sheet.Range[txb_cell_range.Text].Value; if(obj isstring) { value=obj; } elseif(obj isdouble) { 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> privatevoidbtn_input_Click(objectsender,EventArgse) { // Excel起動 Excel.Application app=newExcel.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 { stringvalue=""; // セル値読み込み varobj=sheet.Range[txb_cell_range.Text].Value; if(obj isstring) { value=obj; } elseif(obj isdouble) { 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