| using System; | 
 | using System.Collections.Generic; | 
 | using System.ComponentModel; | 
 | using System.Data; | 
 | using System.Drawing; | 
 | using System.Globalization; | 
 | using System.IO; | 
 | using System.Linq; | 
 | using System.Text; | 
 | using System.Threading.Tasks; | 
 | using System.Windows.Forms; | 
 | using OfficeOpenXml; | 
 |  | 
 | namespace EPPlusExcelFormDemo | 
 | { | 
 |     public partial class ExcelForm : Form | 
 |     { | 
 |         private ExcelPackage _package; | 
 |         private DataGridViewCell _currentCell; | 
 |         private Font _inactiveCellFont; | 
 |         private Font _activeCellFont; | 
 |         private const int NumberOfColumns = 5; | 
 |  | 
 |         public ExcelForm() | 
 |         { | 
 |             InitializeComponent(); | 
 |             InitializePackage(); | 
 |             InitPackageToUI(); | 
 |             this.Closing += (sender, args) => _package.Dispose(); | 
 |             dataGridView_Ws1.RowHeadersWidth = 50; | 
 |             dataGridView_Ws1.Select(); | 
 |         } | 
 |  | 
 |         private void InitializePackage() | 
 |         { | 
 |             _package = new ExcelPackage(new MemoryStream()); | 
 |             var ws1 = _package.Workbook.Worksheets.Add("Worksheet1"); | 
 |             for (var col = 2; col < NumberOfColumns; col++) | 
 |             { | 
 |                 for (var row = 1; row < 9; row++) | 
 |                 { | 
 |                     ws1.Cells[row, col].Value = row*col; | 
 |                 } | 
 |             } | 
 |             ws1.Cells[7, 1].Value = "SUM"; | 
 |             ws1.Cells[7, 2].Formula = "SUM(B1:B6)"; | 
 |             ws1.Cells[7, 3].Formula = "SUM(C1:C6)"; | 
 |             ws1.Cells[7, 4].Formula = "SUM(D1:D6)"; | 
 |  | 
 |             ws1.Cells[8, 1].Value = "STDEV"; | 
 |             ws1.Cells[8, 2].Formula = "STDEV(B1:B6)"; | 
 |             ws1.Cells[8, 3].Formula = "STDEV(C1:C6)"; | 
 |             ws1.Cells[8, 4].Formula = "STDEV(D1:D6)"; | 
 |             _package.Workbook.Calculate(); | 
 |         } | 
 |  | 
 |         private void InitFonts(DataGridView gridView) | 
 |         { | 
 |             _activeCellFont = new Font(gridView.Font, FontStyle.Bold); | 
 |             _inactiveCellFont = gridView.Font; | 
 |         } | 
 |  | 
 |         private void InitEvents(DataGridView gridView) | 
 |         { | 
 |             gridView.CellEnter += DataGrid1OnCellEnter; | 
 |             gridView.CellLeave += DataGrid1OnCellLeave;  | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Binds the EPPlus package (or actually only its first worksheet) | 
 |         /// to the DataGridView. | 
 |         /// </summary> | 
 |         private void InitPackageToUI() | 
 |         { | 
 |             var ws = _package.Workbook.Worksheets.First(); | 
 |             var page1 = this.tabControl_Worksheets.Controls[0] as TabPage; | 
 |             page1.Text = ws.Name; | 
 |             var gridView = GetGrid(); | 
 |             InitFonts(gridView); | 
 |             InitEvents(gridView); | 
 |              | 
 |             for (var row = 0; row < ws.Dimension.Rows; row++) | 
 |             { | 
 |                 var gridRow = new DataGridViewRow {HeaderCell = {Value = (row + 1).ToString()}}; | 
 |                 for (var col = 0; col < NumberOfColumns; col++) | 
 |                 { | 
 |                     var cell = ws.Cells[row + 1, col + 1]; | 
 |                     if (cell.Value!=null) | 
 |                     { | 
 |                         using (var uiCell = new DataGridViewTextBoxCell()) | 
 |                         { | 
 |                             uiCell.Value = cell.Value; | 
 |                             gridRow.Cells.Add(uiCell); | 
 |                         } | 
 |                     } | 
 |                 } | 
 |                 gridView.Rows.Add(gridRow); | 
 |             } | 
 |             gridView.Refresh(); | 
 |         } | 
 |  | 
 |         private void BindPackageToUI() | 
 |         { | 
 |             var dataGrid1 = GetGrid(); | 
 |             for (var row = 1; row < _package.Workbook.Worksheets.First().Dimension.Rows + 1; row++) | 
 |             { | 
 |                 for (var col = 1; col <= NumberOfColumns; col++) | 
 |                 { | 
 |                     var excelCell = _package.Workbook.Worksheets.First().Cells[row, col]; | 
 |                     var gridViewCell = dataGrid1.Rows[row - 1].Cells[col - 1]; | 
 |                     gridViewCell.Value = excelCell.Value; | 
 |                 } | 
 |             } | 
 |             dataGrid1.Refresh(); | 
 |         } | 
 |  | 
 |         private object CellValueToObject(string cellVal) | 
 |         { | 
 |             if (ConvertUtil.IsNumericString(cellVal)) | 
 |             { | 
 |                 return double.Parse(cellVal, CultureInfo.InvariantCulture); | 
 |             } | 
 |             return cellVal; | 
 |         } | 
 |  | 
 |         private void DataGrid1OnCellLeave(object sender, DataGridViewCellEventArgs e) | 
 |         { | 
 |             var dataGrid1 = GetGrid(); | 
 |             var gridViewCell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex]; | 
 |             var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1]; | 
 |             gridViewCell.Style.ForeColor = Color.Black; | 
 |             gridViewCell.Style.BackColor = Color.White; | 
 |             gridViewCell.Style.Font = _inactiveCellFont; | 
 |         } | 
 |  | 
 |  | 
 |         private DataGridView GetGrid() | 
 |         { | 
 |             var page1 = this.tabControl_Worksheets.Controls[0] as TabPage; | 
 |             var dataGrid1 = page1.Controls["dataGridView_Ws1"] as DataGridView; | 
 |             return dataGrid1; | 
 |         } | 
 |  | 
 |         private void DataGrid1OnCellEnter(object sender, DataGridViewCellEventArgs e) | 
 |         { | 
 |             var dataGrid1 = GetGrid(); | 
 |             dataGrid1.Refresh(); | 
 |             BindPackageToUI(); | 
 |             var cell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex]; | 
 |             var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1]; | 
 |             if (!string.IsNullOrEmpty(excelCell.Formula)) | 
 |             { | 
 |                 textBox_fx.Text = "=" + excelCell.Formula; | 
 |                 cell.Value = "=" + excelCell.Formula; | 
 |             } | 
 |             else if(excelCell.Value != null) | 
 |             { | 
 |                 textBox_fx.Text = excelCell.Value.ToString(); | 
 |             } | 
 |             cell.Style.ForeColor = Color.Blue; | 
 |             cell.Style.BackColor = Color.Gainsboro; | 
 |             cell.Style.Font = _activeCellFont; | 
 |             _currentCell = cell; | 
 |         } | 
 |  | 
 |         private void button_Save_Click(object sender, EventArgs e) | 
 |         { | 
 |             saveFileDialog_SaveExcel.Filter = "Excel files (*.xlsx)|*.xlsx"; | 
 |             var dialogResult = saveFileDialog_SaveExcel.ShowDialog(); | 
 |             if (dialogResult == DialogResult.OK) | 
 |             { | 
 |                 _package.SaveAs(new FileInfo(saveFileDialog_SaveExcel.FileName)); | 
 |             } | 
 |         } | 
 |  | 
 |         private void button_ApplyFormula_Click(object sender, EventArgs e) | 
 |         { | 
 |             var row = _currentCell.RowIndex; | 
 |             var col = _currentCell.ColumnIndex; | 
 |             var txt = textBox_fx.Text; | 
 |             if (txt.StartsWith("=")) | 
 |             { | 
 |                 _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Formula = txt.Substring(1); | 
 |             } | 
 |             else | 
 |             { | 
 |                 _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Formula = null; | 
 |                 _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Value = CellValueToObject(txt); | 
 |             } | 
 |             try | 
 |             { | 
 |                 _package.Workbook.Calculate(); | 
 |             } | 
 |             catch (Exception ex) | 
 |             { | 
 |                 MessageBox.Show(ex.Message); | 
 |             } | 
 |             BindPackageToUI(); | 
 |             this.Refresh(); | 
 |         } | 
 |  | 
 |         private void dataGridView_Ws1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) | 
 |         { | 
 |             var dataGrid1 = GetGrid(); | 
 |             var cell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex]; | 
 |             var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1]; | 
 |             if (!string.IsNullOrEmpty(excelCell.Formula)) | 
 |             { | 
 |                 cell.Value = "=" + excelCell.Formula; | 
 |             } | 
 |             dataGrid1.Refresh(); | 
 |         } | 
 |  | 
 |         private void dataGridView_Ws1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) | 
 |         { | 
 |             var f = e.FormattedValue.ToString(); | 
 |             if (f.StartsWith("=")) | 
 |             { | 
 |                 _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Formula = f.Substring(1); | 
 |             } | 
 |             else | 
 |             { | 
 |                 _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Formula = null; | 
 |                 _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Value = CellValueToObject(f); | 
 |             } | 
 |             try | 
 |             { | 
 |                 _package.Workbook.Calculate(); | 
 |             } | 
 |             catch (Exception ex) | 
 |             { | 
 |                 MessageBox.Show(ex.Message); | 
 |             } | 
 |             BindPackageToUI(); | 
 |             this.Refresh(); | 
 |         } | 
 |  | 
 |         private void button1_Click(object sender, EventArgs e) | 
 |         { | 
 |             var frm = new frmFunctions(_package.Workbook.FormulaParserManager.GetImplementedFunctionNames().ToList()); | 
 |             frm.ShowDialog(this); | 
 |              | 
 |         } | 
 |     } | 
 | } |