Creating Windows Forms applications that can open Excel files on button click is a common requirement for desktop applications. Whether you’re building data entry forms, report generators, or file processing tools, integrating Excel operations with button click events is essential.

Excel File Operations on Button Click in C# Windows Forms

Common Scenarios

  • 📁 Open Excel File Dialog: Let users select Excel files
  • 📊 Process Excel Data: Read and display Excel content
  • 💾 Export to Excel: Generate Excel files from form data
  • 🔄 Update Excel Files: Modify existing Excel files

Setting Up Windows Forms Project

First, create a new Windows Forms project and add the Openize.OpenXML SDK:

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

Example 1: Open Excel File on Button Click

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");
        }
    }
}

Example 2: Process Excel Data and Display in 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;
    }
}

Example 3: Export Form Data to Excel on Button Click

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);
        }
    }
}

Example 4: Complete Excel Manager Form

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;
    }
}

Best Practices

  1. Always Use Try-Catch: Handle file operations safely
  2. Validate File Paths: Check if files exist before processing
  3. User Feedback: Show progress for long operations
  4. Enable/Disable Buttons: Update UI state based on context
  5. File Filters: Use appropriate filters in dialogs

Conclusion

Integrating Excel operations with Windows Forms button clicks provides powerful desktop functionality. The Openize.OpenXML SDK makes it easy to:

  • ✅ Open Excel files through dialogs
  • ✅ Process and display Excel data
  • ✅ Export form data to Excel
  • ✅ Create complete Excel management interfaces

Start building professional Excel-enabled Windows Forms applications today!