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