選択された行の薬品情報をExcelファイルに出力します。
フォームに「出力」ボタンを追加します。
dataGridView
の選択行を取得するには、SelectedRows
を使用します。
とりあえず、テストとして以下のように実装してみます。
/// <summary>
/// 出力ボタンのクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
// 選択されている行を取得
foreach(DataGridViewRow row in dataGridView1.SelectedRows)
{
System.Diagnostics.Debug.WriteLine(row.Cells["Id"].Value);
}
}
実際に動かしてみると、SelectedRows
にはクリックした順に格納されるので foreach
で順に取り出すとId順になりません。
一旦 List に選択されたIdを格納し Sort した後、 Idに該当する薬品情報をデータベースから取得するよう実装します。
/// <summary>
/// 選択されている薬品IDを取得する
/// </summary>
/// <returns></returns>
private List<int> GetSelectedIds()
{
List<int> list = new List<int>();
// 選択されている行を取得
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
list.Add((int)row.Cells["Id"].Value);
}
// 昇順に並び替え
list.Sort();
return list;
}
/// <summary>
/// IDのリストをもとに薬品情報を取得する
/// </summary>
/// <param name="selectedIdList"></param>
/// <returns></returns>
private List<List<string>> GetDrugInfo(List<int> selectedIdList)
{
List<List<string>> data = new List<List<string>>();
using (var db = new DrugInfoContext())
{
foreach (int id in selectedIdList)
{
// 薬品情報を取得
var drug = db.Drugs
.Where(item => item.DrugId == id)
.FirstOrDefault();
if (drug != null)
{
// リストに格納
List<string> row = new List<string>();
row.Add(drug.Classifications.ClassificationCode); // 薬効分類コード
row.Add(drug.Classifications.Name); // 薬効分類
row.Add(drug.DrugCode); // 薬品コード
row.Add(drug.Name); // 薬品名
row.Add(drug.Company); // 会社名
data.Add(row);
}
}
}
return data;
}
今回、Excelファイルの出力に EPPlus を使用します。
NuGetで EPPlus をインストールします。
EPPlus を使用して、Excelファイルを生成します。
using OfficeOpenXml; // <- 先頭に追加
/* ~~ 中略 ~~ */
/// <summary>
/// Excelファイルを出力する
/// </summary>
/// <param name="data">薬品データ</param>
/// <param name="fileName">ファイル名</param>
/// <returns>ファイルパス</returns>
private string OutputExcel(List<List<string>> data, string fileName)
{
// 出力ファイル
var file = new System.IO.FileInfo(fileName);
// すでにファイルが存在する場合は削除
if (file.Exists)
{
file.Delete();
}
// Excelファイルの作成
using (var excel = new ExcelPackage(file))
{
// シート追加
var sheet = excel.Workbook.Worksheets.Add("薬品情報");
int rowIndex = 1; // 行番号
int colIndex = 1; // 列番号
foreach (var row in data)
{
colIndex = 1;
foreach (var col in row)
{
var cell = sheet.Cells[rowIndex, colIndex];
cell.Value = col;
colIndex++;
}
rowIndex++;
}
// excel保存
excel.Save();
}
return file.FullName;
}
DataGridView の選択行の取得、データベースからの薬品情報取得、EPPlus によるExcelファイル出力を 組み立てて、出力ボタンの処理を実装します。
/// <summary>
/// 出力ボタンのクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
// 選択行の取得
var list = this.GetSelectedIds();
if (list.Count == 0)
{
// 選択行がなければ終了
MessageBox.Show("薬品を選択してください。");
return;
}
// データの取得
var data = this.GetDrugInfo(list);
// Excel出力
var filePath = this.OutputExcel(data, "output.xlsx");
MessageBox.Show(string.Format("Excelファイルを出力しました。\n{0}", filePath));
}
DataGridView で適当な行を選択し、「出力」ボタンをクリックしてください。
実行ファイルと同じフォルダに output.xlsx
というファイルが生成されています。