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