blob: ba0cdc5a1e4eb2608d152cc7554c0c1ba07c37eb [file] [log] [blame]
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);
}
}
}