ボタンクリックでExcelファイルを開くことができるWindowsフォームアプリケーションを作成することは、デスクトップアプリケーションにとって一般的な要件です。データ入力フォーム、レポートジェネレーター、ファイル処理ツールなど、どのようなアプリケーションを構築する場合でも、ボタンクリックイベントとExcel操作を統合することは不可欠です。

C# Windows フォームでのボタンクリックによる Excel ファイル操作

一般的なシナリオ

  • 📁 Excelファイルを開くダイアログ: ユーザーがExcelファイルを選択できるようにします
  • 📊 Excelデータの処理: Excelコンテンツを読み取って表示する
  • 💾 Excel にエクスポート: フォームデータから Excel ファイルを生成します
  • 🔄 Excelファイルの更新: 既存のExcelファイルを変更する

Windows フォーム プロジェクトの設定

まず、新しい Windows フォーム プロジェクトを作成し、Openize.OpenXML SDK を追加します。

<PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" />
using Openize.Cells;
using System;
using System.IO;
using System.Windows.Forms;

例 1: ボタンのクリックで Excel ファイルを開く

public partial class ExcelForm : Form
{
    private string selectedFilePath = "";
    
    public ExcelForm()
    {
        InitializeComponent();
    }
    
    // Button click to open file dialog
    private void btnOpenFile_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog openFileDialog = new OpenFileDialog())
        {
            // Configure file dialog
            openFileDialog.Filter = "Excel Files|*.xlsx;*.xls|All Files|*.*";
            openFileDialog.Title = "Select Excel File";
            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Documents);
            
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                selectedFilePath = openFileDialog.FileName;
                lblFileName.Text = $"Selected: {Path.GetFileName(selectedFilePath)}";
                btnProcessFile.Enabled = true;
                
                // Immediately show file info
                DisplayFileInfo();
            }
        }
    }
    
    private void DisplayFileInfo()
    {
        try
        {
            using (var workbook = new Workbook(selectedFilePath))
            {
                var worksheet = workbook.Worksheets[0];
                
                lblWorksheetName.Text = $"Worksheet: {worksheet.Name}";
                lblRowCount.Text = $"Rows: {worksheet.GetRowCount()}";
                lblColumnCount.Text = $"Columns: {worksheet.GetColumnCount()}";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error reading file info: {ex.Message}", "Error");
        }
    }
}

例 2: Excel データを処理して DataGridView に表示する

public partial class ExcelProcessorForm : Form
{
    // Button click to process Excel file
    private void btnProcessExcel_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(selectedFilePath))
        {
            MessageBox.Show("Please select an Excel file first.", "No File Selected");
            return;
        }
        
        try
        {
            ProcessExcelFile(selectedFilePath);
            MessageBox.Show("Excel file processed successfully!", "Success");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error processing Excel file: {ex.Message}", "Error");
        }
    }
    
    private void ProcessExcelFile(string filePath)
    {
        using (var workbook = new Workbook(filePath))
        {
            var worksheet = workbook.Worksheets[0];
            
            // Clear existing data
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            
            int rowCount = worksheet.GetRowCount();
            int colCount = worksheet.GetColumnCount();
            
            // Add columns to DataGridView
            for (int col = 1; col <= colCount; col++)
            {
                string headerText = worksheet.Cells[GetCellReference(1, col)].GetValue();
                if (string.IsNullOrEmpty(headerText))
                    headerText = $"Column {col}";
                    
                dataGridView1.Columns.Add($"Col{col}", headerText);
            }
            
            // Add rows to DataGridView
            for (int row = 2; row <= rowCount; row++)
            {
                string[] rowData = new string[colCount];
                for (int col = 1; col <= colCount; col++)
                {
                    string cellRef = GetCellReference(row, col);
                    rowData[col - 1] = worksheet.Cells[cellRef].GetValue();
                }
                dataGridView1.Rows.Add(rowData);
            }
            
            // Update status
            lblStatus.Text = $"Loaded {rowCount - 1} rows and {colCount} columns";
        }
    }
    
    static string GetCellReference(int row, int col)
    {
        return $"{GetColumnLetter(col)}{row}";
    }
    
    static string GetColumnLetter(int columnNumber)
    {
        string columnLetter = string.Empty;
        while (columnNumber > 0)
        {
            columnNumber--;
            columnLetter = (char)('A' + columnNumber % 26) + columnLetter;
            columnNumber /= 26;
        }
        return columnLetter;
    }
}

例 3: ボタンのクリック時にフォームデータを Excel にエクスポートする

public partial class DataExportForm : Form
{
    // Button click to export data to Excel
    private void btnExportToExcel_Click(object sender, EventArgs e)
    {
        try
        {
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Filter = "Excel Files|*.xlsx";
                saveFileDialog.Title = "Save Excel File";
                saveFileDialog.FileName = "ExportedData.xlsx";
                
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    ExportDataToExcel(saveFileDialog.FileName);
                    MessageBox.Show($"Data exported successfully to:\n{saveFileDialog.FileName}", "Export Complete");
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error exporting data: {ex.Message}", "Export Error");
        }
    }
    
    private void ExportDataToExcel(string filePath)
    {
        using (var workbook = new Workbook())
        {
            var worksheet = workbook.Worksheets[0];
            worksheet.Name = "Exported Data";
            
            // Export form data
            worksheet.Cells["A1"].PutValue("Name");
            worksheet.Cells["B1"].PutValue("Email");
            worksheet.Cells["C1"].PutValue("Phone");
            worksheet.Cells["D1"].PutValue("Department");
            
            // Get data from form controls
            worksheet.Cells["A2"].PutValue(txtName.Text);
            worksheet.Cells["B2"].PutValue(txtEmail.Text);
            worksheet.Cells["C2"].PutValue(txtPhone.Text);
            worksheet.Cells["D2"].PutValue(cboDepartment.Text);
            
            // Export DataGridView data if available
            if (dataGridView1.Rows.Count > 0)
            {
                // Add headers from DataGridView
                for (int col = 0; col < dataGridView1.Columns.Count; col++)
                {
                    worksheet.Cells[GetCellReference(4, col + 1)].PutValue(dataGridView1.Columns[col].HeaderText);
                }
                
                // Add data rows
                for (int row = 0; row < dataGridView1.Rows.Count; row++)
                {
                    for (int col = 0; col < dataGridView1.Columns.Count; col++)
                    {
                        var cellValue = dataGridView1.Rows[row].Cells[col].Value?.ToString() ?? "";
                        worksheet.Cells[GetCellReference(row + 5, col + 1)].PutValue(cellValue);
                    }
                }
            }
            
            workbook.Save(filePath);
        }
    }
}

例4: Excelマネージャーフォームを完成させる

public partial class ExcelManagerForm : Form
{
    private string currentFilePath = "";
    
    public ExcelManagerForm()
    {
        InitializeComponent();
        UpdateButtonStates();
    }
    
    // Open Excel file
    private void btnOpen_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog ofd = new OpenFileDialog())
        {
            ofd.Filter = "Excel Files|*.xlsx;*.xls";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                currentFilePath = ofd.FileName;
                LoadExcelFile();
                UpdateButtonStates();
            }
        }
    }
    
    // Create new Excel file
    private void btnNew_Click(object sender, EventArgs e)
    {
        try
        {
            using (var workbook = new Workbook())
            {
                var worksheet = workbook.Worksheets[0];
                worksheet.Name = "New Sheet";
                
                // Add some default content
                worksheet.Cells["A1"].PutValue("Column 1");
                worksheet.Cells["B1"].PutValue("Column 2");
                worksheet.Cells["C1"].PutValue("Column 3");
                
                using (SaveFileDialog sfd = new SaveFileDialog())
                {
                    sfd.Filter = "Excel Files|*.xlsx";
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        workbook.Save(sfd.FileName);
                        currentFilePath = sfd.FileName;
                        LoadExcelFile();
                        UpdateButtonStates();
                        MessageBox.Show("New Excel file created!", "Success");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error creating file: {ex.Message}", "Error");
        }
    }
    
    // Save changes to Excel file
    private void btnSave_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(currentFilePath))
        {
            MessageBox.Show("No file is currently open.", "No File");
            return;
        }
        
        try
        {
            SaveDataGridToExcel();
            MessageBox.Show("File saved successfully!", "Saved");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error saving file: {ex.Message}", "Save Error");
        }
    }
    
    private void LoadExcelFile()
    {
        try
        {
            using (var workbook = new Workbook(currentFilePath))
            {
                var worksheet = workbook.Worksheets[0];
                
                // Load data into DataGridView
                dataGridView1.Rows.Clear();
                dataGridView1.Columns.Clear();
                
                int rowCount = worksheet.GetRowCount();
                int colCount = worksheet.GetColumnCount();
                
                // Add columns
                for (int col = 1; col <= colCount; col++)
                {
                    string header = worksheet.Cells[GetCellReference(1, col)].GetValue();
                    dataGridView1.Columns.Add($"Col{col}", string.IsNullOrEmpty(header) ? $"Column {col}" : header);
                }
                
                // Add rows
                for (int row = 2; row <= rowCount; row++)
                {
                    string[] rowData = new string[colCount];
                    for (int col = 1; col <= colCount; col++)
                    {
                        rowData[col - 1] = worksheet.Cells[GetCellReference(row, col)].GetValue();
                    }
                    dataGridView1.Rows.Add(rowData);
                }
                
                lblFileName.Text = Path.GetFileName(currentFilePath);
                lblStatus.Text = $"Loaded: {rowCount - 1} rows, {colCount} columns";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"Error loading file: {ex.Message}", "Load Error");
        }
    }
    
    private void SaveDataGridToExcel()
    {
        using (var workbook = new Workbook(currentFilePath))
        {
            var worksheet = workbook.Worksheets[0];
            
            // Save headers
            for (int col = 0; col < dataGridView1.Columns.Count; col++)
            {
                worksheet.Cells[GetCellReference(1, col + 1)].PutValue(dataGridView1.Columns[col].HeaderText);
            }
            
            // Save data
            for (int row = 0; row < dataGridView1.Rows.Count; row++)
            {
                for (int col = 0; col < dataGridView1.Columns.Count; col++)
                {
                    var value = dataGridView1.Rows[row].Cells[col].Value?.ToString() ?? "";
                    worksheet.Cells[GetCellReference(row + 2, col + 1)].PutValue(value);
                }
            }
            
            workbook.Save();
        }
    }
    
    private void UpdateButtonStates()
    {
        bool hasFile = !string.IsNullOrEmpty(currentFilePath);
        btnSave.Enabled = hasFile;
        btnProcess.Enabled = hasFile;
    }
}

ベストプラクティス

  1. 常にTry-Catchを使用する: ファイル操作を安全に処理する
  2. ファイルパスの検証: 処理前にファイルが存在するかどうかを確認します
  3. ユーザーフィードバック: 長時間の操作の進行状況を表示する
  4. ボタンの有効化/無効化: コンテキストに応じてUIの状態を更新する
  5. ファイルフィルター: ダイアログで適切なフィルターを使用する

結論

Excel操作とWindowsフォームのボタンクリックを統合することで、強力なデスクトップ機能が実現します。Openize.OpenXML SDKを使用すると、以下のことが容易になります。

  • ✅ ダイアログからExcelファイルを開く
  • ✅ Excelデータの処理と表示
  • ✅ フォームデータをExcelにエクスポート
  • ✅ 完全なExcel管理インターフェースを作成する 今すぐプロフェッショナルな Excel 対応 Windows フォーム アプリケーションの構築を始めましょう。