DataGridViewにEXCELファイルを読み込み一覧表示するサンプルです。
良く使う、データ型(文字列、数値、日付、Boolean)を使用しています。
サンプルの内容
・EXCELファイルを読み込み一覧に表示します。
・同名ファイルが既に開かれている場合は、メッセージを表示して処理を抜けます。
・EXCEL読み込み前に確認メッセージを表示します。「はい」でなければ処理を抜けます。
使用部品
No | 項目名 | Text | name | 部品 |
1 | 一覧 | 空 | dataGridView1 | DataGridView |
2 | クリアボタン | クリア | button1 | Button |
3 | EXCEL出力ボタン | EXCEL出力 | button2 | Button |
4 | EXCEL読込ボタン | EXCEL読込 | button3 | Button |
プログラミング
参照の追加
EXCELを使うために提供されている、オブジェクト ライブラリの参照を追加します。
[プロジェクト] メニューの [参照の追加] を選択して、[参照マネージャー] ダイアログ ボックスを表示します。
[COM]を選択します。「Microsoft EXCEL xx Object Library」にチェックを入れ「OK」をクリックします。(xxはインストールしているEXCELによって異なります。)参照が追加されます。
言語:C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
namespace sample
{
public partial class Form1 : Form
{
// 書籍在庫一覧の列順
public enum BookItem : int
{
NO = 1, // NO
TITLE, // 書名
AUTHOR_NAME, // 著者名
PRICE, // 価格
PUBLISHER, // 出版社名
PUBLICATION_DATE, // 出版年月日
STOCK, // 在庫
}
/// <summary>
/// 起動時処理
/// </summary>
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 表示クリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// 一覧をクリアする
DataTable dt = (DataTable)dataGridView1.DataSource;
dt.Clear();
//// データを作成する
//DataTable dt = createData();
//// 一覧を表示する
//dataGridViewDisp(dt);
}
// <summary>
/// EXCEL出力処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
// 出力先
string FILE_PATH = @"d:\" + dataGridView1.Tag + ".xlsx";
// メッセージ文字列
string msg = "";
// データがなければ処理を抜ける
if (dataGridView1.RowCount <= 0)
{
msg = "出力データがありません。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// 出力ファイル名の
if (fileOpenCheck(FILE_PATH) == false)
{
msg = "EXCELファイルを閉じてから出力を行って下さい。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// 確認「はい」でなければ処理を抜ける
msg = "EXCELファイルを出力します。" + "\n" + "宜しいですか?";
DialogResult result = MessageBox.Show(msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result != DialogResult.Yes)
{
return;
}
// Excelアプリケーション初期化
Excel.Application application = null;
// Excelオブジェクト初期化
Excel.Workbooks workbooks = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet worksheet = null;
Excel.Range range1 = null;
Excel.Range range2 = null;
Excel.Range range3 = null;
try
{
// Excelアプリケーション作成する
application = new Excel.Application();
// ワークブックを作成する
workbooks = application.Workbooks;
workbook = workbooks.Add();
// 先頭シート(左からの順)を選択する
sheets = workbook.Sheets;
worksheet = sheets[1];
worksheet.Select(Type.Missing);
// applicationを非表示にする
application.Visible = false;
// 確認メッセージを非表示にする
application.DisplayAlerts = false;
// ヘッダー出力
// 列ループ
for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
{
// 列幅を設定する(dataGridViewの列幅×0.14)
worksheet.Columns[iCol + 1].ColumnWidth = dataGridView1.Columns[iCol].Width * 0.14;
string valueType = dataGridView1.Columns[iCol].ValueType.ToString();
// 日時型の場合「YYYY/MM/DD」を列に設定する
if (valueType.Equals("System.DateTime"))
{
worksheet.Columns[iCol + 1].NumberFormat = "yyyy/mm/dd";
}
// 日時型の場合「YYYY/MM/DD」を列に設定する
if (valueType.Equals("System.Decimal"))
{
worksheet.Columns[iCol + 1].NumberFormat = "#,###";
}
// Excelオブジェクト初期化(セル)
Excel.Range range = null;
try
{
// Excelのcell指定
range = worksheet.Cells[1, iCol + 1];
// ヘッダーの値を取得する
String sCell = dataGridView1.Columns[iCol].HeaderCell.Value.ToString();
// ヘッダーの背景色を設定
range.Interior.Color = Color.FromArgb(dataGridView1.ColumnHeadersDefaultCellStyle.BackColor.ToArgb());
// ヘッダーの文字色を設定
range.Font.Color = Color.FromArgb(dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor.ToArgb());
// 列の文字位置をセットする
switch (dataGridView1.Columns[iCol].DefaultCellStyle.Alignment)
{
case DataGridViewContentAlignment.MiddleLeft:
worksheet.Columns[iCol + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
break;
case DataGridViewContentAlignment.MiddleCenter:
worksheet.Columns[iCol + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
break;
case DataGridViewContentAlignment.MiddleRight:
worksheet.Columns[iCol + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
break;
default:
worksheet.Columns[iCol + 1].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
break;
}
// ヘッダーの文字位置をセットする
switch (dataGridView1.Columns[iCol].HeaderCell.Style.Alignment)
{
case DataGridViewContentAlignment.MiddleLeft:
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
break;
case DataGridViewContentAlignment.MiddleCenter:
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; ;
break;
case DataGridViewContentAlignment.MiddleRight:
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
break;
default:
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; ;
break;
}
// Excelにデータをセット
range.Value2 = sCell;
}
finally
{
if (range != null)
{
{
// range解放
Marshal.ReleaseComObject(range);
range = null;
}
}
}
}
// 追加行を除く行数を求める
int maxRowsCount = dataGridView1.Rows.Count;
if (dataGridView1.AllowUserToAddRows)
{
// 追加行が含まれているので、そのカウントを除く
maxRowsCount = maxRowsCount - 1;
}
// データ出力
// 行ループ
for (int iRow = 0; iRow < maxRowsCount; iRow++)
{
// 列ループ
for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
{
// セルの値を取得する
String sCell = dataGridView1[iCol, iRow].Value.ToString();
// Excelオブジェクト初期化(セル)
Excel.Range range = null;
try
{
// ワーク文字列にセルの値を追加する
range = worksheet.Cells[iRow + 2, iCol + 1];
// Boolean型の場合、Trueは■、Falseは□で出力する
string valueType = dataGridView1[iCol, iRow].ValueType.ToString();
if (valueType.Equals("System.Boolean"))
{
if (sCell.Equals("True"))
{
sCell = "■";
}
else
{
sCell = "□";
}
}
// Excelにデータをセット
range.Value2 = sCell;
}
finally
{
// range解放
Marshal.ReleaseComObject(range);
range = null;
}
}
}
// 範囲指定で罫線設定
range1 = worksheet.Cells[1, 1];
range2 = worksheet.Cells[maxRowsCount + 1, dataGridView1.Columns.Count];
range3 = worksheet.get_Range(range1, range2);
range3.Borders.LineStyle = true;
//excelファイルの保存
workbook.SaveAs(FILE_PATH);
workbook.Close(false);
msg = "EXCELファイルの出力が完了しました。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
// EXCELファイルの出力失敗
MessageBox.Show(ex.Message);
}
finally
{
// range1解放
if (range1 != null)
{
Marshal.ReleaseComObject(range1);
range1 = null;
}
// range2解放
if (range2 != null)
{
Marshal.ReleaseComObject(range2);
range2 = null;
}
// range3解放
if (range3 != null)
{
Marshal.ReleaseComObject(range3);
range3 = null;
}
// worksheet 解放
if (worksheet != null)
{
Marshal.ReleaseComObject(worksheet);
worksheet = null;
}
// sheets 解放
if (sheets != null)
{
Marshal.ReleaseComObject(sheets);
sheets = null;
}
// workbook 解放
if (workbook != null)
{
Marshal.ReleaseComObject(workbook);
workbook = null;
}
// workbooks 解放
if (workbooks != null)
{
Marshal.ReleaseComObject(workbooks);
workbooks = null;
}
// applicationの終了前にガベージ コレクトを強制する
GC.Collect();
if (workbooks != null)
{
// application終了と解放
application.Quit();
Marshal.ReleaseComObject(application);
application = null;
}
// 最後に再度ガベージ コレクトを強制する。
GC.Collect();
}
}
// □□□□□□□□□□□□□□□□□
// □ 今回のサンプル --->
// □□□□□□□□□□□□□□□□□
/// <summary>
/// EXCEL読込処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
// 読込先
string FILE_PATH = @"d:\" + dataGridView1.Tag + ".xlsx";
// DataTableを作成する
DataTable dt = createDataTable();
// メッセージ文字列
string msg = "";
// 読込力ファイルが開いているかのチェック
if (fileOpenCheck(FILE_PATH) == false)
{
msg = "EXCELファイルを閉じてから読込を行って下さい。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
// 確認「はい」でなければ処理を抜ける
msg = "EXCELファイルを読込します。" + "\n" + "宜しいですか?";
DialogResult result = MessageBox.Show(msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result != DialogResult.Yes)
{
return;
}
// Excelアプリケーション初期化
Excel.Application application = null;
// Excelオブジェクト初期化
Excel.Workbooks workbooks = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet worksheet = null;
Excel.Range range1 = null;
Excel.Range range2 = null;
// 読込データ格納配列初期化
object[,] excelData = null;
try
{
// Excelアプリケーション作成する
application = new Excel.Application();
// ワークブックを作成する
workbooks = application.Workbooks;
workbook = workbooks.Open(FILE_PATH);
// 先頭シート(左からの順)を選択する
sheets = workbook.Sheets;
worksheet = sheets[1];
worksheet.Select(Type.Missing);
// applicationを非表示にする
application.Visible = false;
// 確認メッセージを非表示にする
application.DisplayAlerts = false;
// 最終行を取得する
int maxRow = worksheet.UsedRange.Rows.Count;
// 範囲指定の始点
range1 = worksheet.Cells[1, 1];
// 範囲指定の終点
range2 = worksheet.Cells[maxRow, dataGridView1.Columns.Count];
// 取得データを格納する配列
excelData = new object[maxRow, dataGridView1.Columns.Count];
// 範囲指定でデータを取得する
excelData = worksheet.get_Range(range1, range2).Value;
// workbook 閉じる
workbook.Close(false);
}
catch (Exception ex)
{
// EXCELファイルの読込失敗
MessageBox.Show(ex.Message);
}
finally
{
// range1解放
if (range1 != null)
{
Marshal.ReleaseComObject(range1);
range1 = null;
}
// range2解放
if (range2 != null)
{
Marshal.ReleaseComObject(range2);
range2 = null;
}
// worksheet 解放
if (worksheet != null)
{
Marshal.ReleaseComObject(worksheet);
worksheet = null;
}
// sheets 解放
if (sheets != null)
{
Marshal.ReleaseComObject(sheets);
sheets = null;
}
// workbook 解放
if (workbook != null)
{
Marshal.ReleaseComObject(workbook);
workbook = null;
}
// workbooks 解放
if (workbooks != null)
{
Marshal.ReleaseComObject(workbooks);
workbooks = null;
}
// applicationの終了前にガベージ コレクトを強制する
GC.Collect();
if (workbooks != null)
{
// application終了と解放
application.Quit();
Marshal.ReleaseComObject(application);
application = null;
}
// 最後に再度ガベージ コレクトを強制する。
GC.Collect();
}
try
{
// 取得データを一覧に格納する
// 行ループ
for (int i = 1; i < excelData.GetLength(1); i++)
{
if (i == 1)
{
// 1行目を無視する(ヘッダー)
}
else
{
// 行データを格納する配列
object[] rowData = new object[dataGridView1.Columns.Count];
// 列ループ
for (int j = 1; j < dataGridView1.Columns.Count + 1; j++)
{
// セルのデータを行データに格納する
switch ((BookItem)j)
{
case BookItem.STOCK: // 在庫の場合
// ■、□をtrue、falseにする
if (excelData[i, j].Equals("■"))
{
rowData[j - 1] = true;
}
else
{
rowData[j - 1] = false;
}
break;
default:
rowData[j - 1] = excelData[i, j];
break;
}
}
// DataTableに行のデータを追加する
dt.Rows.Add(rowData);
}
}
// 一覧を表示する
dataGridViewDisp(dt);
msg = "EXCELファイルの読込が完了しました。";
MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
// EXCELファイルの読込失敗
MessageBox.Show(ex.Message);
}
}
// □□□□□□□□□□□□□□□□□
// □ <--- 今回のサンプル
// □□□□□□□□□□□□□□□□□
/// <summary>
/// DataTable作成処理
/// </summary>
/// <returns></returns>
private DataTable createDataTable()
{
// DataTableを宣言する
DataTable dt = new DataTable();
// 列を作成する
dt.Columns.Add("no", typeof(int)); // No
dt.Columns.Add("title", typeof(String)); // 書名
dt.Columns.Add("author_name", typeof(String)); // 著者名
dt.Columns.Add("price", typeof(Decimal)); // 価格
dt.Columns.Add("publisher", typeof(String)); // 出版社名
dt.Columns.Add("publication_date", typeof(DateTime)); // 出版年月
dt.Columns.Add("stock", typeof(bool)); // 在庫
// DataTableを返す
return dt;
}
/// <summary>
/// データ(DataTable)作成処理
/// </summary>
/// <returns>データ</returns>
private DataTable createData()
{
// DataTableを宣言する
DataTable dt = new DataTable();
// 列を作成する
dt.Columns.Add("no", typeof(int)); // No
dt.Columns.Add("title", typeof(String)); // 書名
dt.Columns.Add("author_name", typeof(String)); // 著者名
dt.Columns.Add("price", typeof(Decimal)); // 価格
dt.Columns.Add("publisher", typeof(String)); // 出版社名
dt.Columns.Add("publication_date", typeof(DateTime)); // 出版年月日
dt.Columns.Add("stock", typeof(bool)); // 在庫
// データを追加する
dt.Rows.Add(1, "がんばれるC# 入門", "坂本 学", 2980, "ABC出版", "2018/01/01", true);
dt.Rows.Add(2, "パーフェクトC#", "高橋 健一", 4200, "海上出版 ", "2019/03/03", false);
dt.Rows.Add(3, "学ぶC#", "工藤 太郎", 1600, "電気出版 ", "2020/08/04", true);
dt.Rows.Add(4, "初めてのC#", "渡辺 銀時", 2000, "川上出版 ", "2020/10/06", false);
dt.Rows.Add(5, "どんどん学べるC#", "沢田 剛", 3200, "心の友出版", "2020/11/11", true);
// DataTableを返す
return dt;
}
/// <summary>
/// 一覧表示処理
/// </summary>
/// <param name="dt"></param>
private void dataGridViewDisp(DataTable dt)
{
// データ行の高さを設定する
dataGridView1.RowTemplate.Height = 30;
// データの余白を左上右下5pxに設定する
//dataGridView1.RowTemplate.DefaultCellStyle.Padding = new Padding(5, 5, 5, 5);
// データの余白を左上右下5pxに設定する
dataGridView1.RowTemplate.DefaultCellStyle.Padding = new Padding(5);
// dataGridViewにデータをセットする
dataGridView1.DataSource = dt;
// ヘッダーのタイトルを設定する(列名指定)
dataGridView1.Columns["no"].HeaderText = "No";
dataGridView1.Columns["title"].HeaderText = "書名";
dataGridView1.Columns["author_name"].HeaderText = "著者名";
dataGridView1.Columns["price"].HeaderText = "価格";
dataGridView1.Columns["publisher"].HeaderText = "出版社名";
dataGridView1.Columns["publication_date"].HeaderText = "出版年月日";
dataGridView1.Columns["stock"].HeaderText = "在庫";
// Visualスタイルを使用しない
dataGridView1.EnableHeadersVisualStyles = false;
// 列ヘッダの背景色を設定する
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Blue;
// 列ヘッダの文字色を設定する
dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
// 行ヘッダーを非表示にする
dataGridView1.RowHeadersVisible = false;
// 列ヘッダーを表示する
dataGridView1.ColumnHeadersVisible = true;
// 列ヘッダーの高さを調整不可に設定する
dataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// 行ヘッダーの幅を調整不可に設定する
dataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
// 列ヘッダーの高さを設定する
dataGridView1.ColumnHeadersHeight = 30;
// no の配置を上下左右の中央に設定する
dataGridView1.Columns["no"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// title の配置を上下左右の中央に設定する
dataGridView1.Columns["title"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// author_name の配置を上下左右の中央に設定する
dataGridView1.Columns["author_name"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// price の配置を上下左右の中央に設定する
dataGridView1.Columns["price"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// publisher の配置を上下左右の中央に設定する
dataGridView1.Columns["publisher"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// publication_date の上下左右の中央に設定する
dataGridView1.Columns["publication_date"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// stock の配置を上下左右の中央に設定する
dataGridView1.Columns["stock"].HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// ユーザが行追加を不可に設定する
dataGridView1.AllowUserToAddRows = false;
// ユーザが行削除を不可に設定する
dataGridView1.AllowUserToDeleteRows = false;
// 複数セルの選択を不可に設定する
dataGridView1.MultiSelect = false;
// 行単位に選択モードを設定する
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// ユーザが列の幅を変更不可に設定する
dataGridView1.AllowUserToResizeColumns = true;
// ユーザが行の高さを変更可に設定する
dataGridView1.AllowUserToResizeRows = false;
// セルの入力を不可に設定する
dataGridView1.ReadOnly = true;
// No(no) を右寄せに設定する
dataGridView1.Columns["no"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
// 書名(title) を左寄せに設定する
dataGridView1.Columns["title"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 著者名(author_name) を左寄せに設定する
dataGridView1.Columns["author_name"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 価格(price) を右寄せに設定する
dataGridView1.Columns["price"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
// カンマ表示(3けた単位)
dataGridView1.Columns["price"].DefaultCellStyle.Format = "#,0";
// 出版社名(publisher) を左寄せに設定する
dataGridView1.Columns["publisher"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleLeft;
// 出版年月日(publication_date) を中央に設定する
dataGridView1.Columns["publication_date"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// 在庫(stock)を中央に設定する
dataGridView1.Columns["stock"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
// 列幅を設定する(列名指定)
dataGridView1.Columns["no"].Width = 40;
dataGridView1.Columns["title"].Width = 250;
dataGridView1.Columns["author_name"].Width = 100;
dataGridView1.Columns["price"].Width = 70;
dataGridView1.Columns["publisher"].Width = 150;
dataGridView1.Columns["publication_date"].Width = 90;
dataGridView1.Columns["stock"].Width = 50;
// 選択を解除する
dataGridView1.ClearSelection();
}
/// <summary>
/// EXCELファイルが開かれていないかチェックする
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
static bool fileOpenCheck(string filePath)
{
// ファイルの存在チェック
if (System.IO.File.Exists(filePath) == false)
{
// 存在しないので大丈夫
return true;
}
try
{
// 書き込みモードで開けるか開いてみる
using (FileStream fp = File.Open(filePath, FileMode.Open, FileAccess.Write)) { }
}
catch
{
// 出力先のファイルが開かれていて上書きできない
return false;
}
// 開けた
return true;
}
/// <summary>
/// 起動時処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
// データを作成する
dataGridView1.Tag = "書籍在庫一覧";
// データを作成する
DataTable dt = createData();
// 一覧を表示する
dataGridViewDisp(dt);
}
}
}
実行結果
実行するとサンプルデータが表示されます。
「EXCEL出力」をクリックします。
確認メッセージが表示されますので「はい」をクリックします。
EXCEL出力完了メッセージが表示されます。
「OK」をクリックします。D:\書籍在庫一覧.xlsx が出力されます。
「クリア」をクリックします。一覧がクリアされます。
「EXCEL読込」をクリックします。
確認メッセージが表示されますので「はい」をクリックします。
EXCEL読込完了メッセージが表示されます。
「OK」をクリックします。D:\書籍在庫一覧.xlsx から詠み込まれたデータが一覧に表示されます。
以上です。