Getting started
Install
dotnet add package SharpCell.Grid.Avalonia # the control; brings SharpCell.Grid and SharpCell
dotnet add package SharpCell.Xlsx # to read .xlsx files
The packages target .NET 8 and .NET 10 and Avalonia 12. For WPF, see WPF below.
Show a workbook
Workbook workbook = XlsxReader.Load(path);
workbook.Recalculate();
var view = new SpreadsheetView { Worksheet = workbook["Budget"] };
SpreadsheetView is an Avalonia control: put it in a window or any panel, and it takes the space
it is given. XlsxReader.Load reads values, formulas, the results Excel saved, number formats,
styles and the sheet's sizes; Recalculate calculates every formula with SharpCell.
A runnable window is in samples/SharpCell.Grid.Sample:
dotnet run --project samples/SharpCell.Grid.Sample -f net10.0 -- path/to/file.xlsx
After changes
sheet["B2"].Value = 99;
workbook.Recalculate();
view.InvalidateVisual(); // values, formulas and styles show at the next paint
sheet.SetColumnWidth(2, 20);
sheet.FrozenRows = 1;
view.ReloadLayout(); // sizes and frozen panes are taken again
The view reads cells each time it paints, but it does not know when a workbook changes. Column
widths, row heights, hidden rows and columns and frozen panes are taken when Worksheet is set,
and again with ReloadLayout.
WPF
dotnet add package SharpCell.Grid.Wpf # the WPF control; brings SharpCell.Grid and SharpCell
dotnet add package SharpCell.Xlsx
SharpCell.Grid.Wpf has the same SpreadsheetView, as a WPF FrameworkElement in the namespace
SharpCell.Grid.Wpf, for net8.0-windows and net10.0-windows. In XAML:
<Window xmlns:grid="clr-namespace:SharpCell.Grid.Wpf;assembly=SharpCell.Grid.Wpf" ...>
<grid:SpreadsheetView x:Name="View" />
</Window>
Workbook workbook = XlsxReader.Load(path);
workbook.Recalculate();
View.Worksheet = workbook.Sheets[0]; // View: <grid:SpreadsheetView x:Name="View" /> in MainWindow.xaml
It shows, selects and copies as the Avalonia control does, and has the same properties: Worksheet,
Selection, ActiveCell, Offset (dependency properties), Painter, ReloadLayout(); copying
is Copy(), also bound to ApplicationCommands.Copy, and Ctrl+A to ApplicationCommands.SelectAll.
A runnable window is in samples/SharpCell.Grid.WpfSample.
Editing
var bar = new FormulaBar { View = view }; // Excel's formula bar, as a control of its own
view.Edited += (_, edit) => // after each change, the workbook recalculated
changed = edit.Recalculation.ChangedCells;
view.IsReadOnly = true; // to only show and select
Cells are edited as in Excel: typing into a cell, F2 or a double-click, Enter, Tab and Escape,
Delete, paste with Ctrl+V, undo and redo. What is typed is read as Excel reads it, in the
workbook's culture, and the workbook is recalculated after each change. view.Editor is the
GridEditor behind it, with the history to undo; view.Edited tells about each change.
FormulaBar shows and edits the active cell's formula above the grid. See
What the grid shows for every key.
Sheets and formatting
var tabs = new SheetTabs { View = view }; // Excel's sheet tabs, under the view
view.ToggleBold(); // as Ctrl+B
view.SetFill(CellColor.FromRgb(0xFFF2CC)); // as Fill Color
view.SetNumberFormat("0.0%"); // as the Number Format box
view.ShowNextSheet(); // as Ctrl+Page Down: the next sheet
SheetTabs is Excel's row of sheet tabs as a control of its own: clicking a tab shows its sheet,
and + adds one; Ctrl+Page Down and Ctrl+Page Up go through the sheets too, and each sheet keeps its
selection. The view's formatting methods (ToggleBold, SetFill, SetBorders, SetNumberFormat
and the others) do what Excel's Home tab does to the selected cells, for an application's toolbar,
and Excel's shortcuts such as Ctrl+B and Ctrl+Shift+% do the same. See
What the grid shows for every key.
Rows, columns, filling and zoom
view.Zoom = 1.5; // 150%, as Ctrl or Cmd with the wheel
view.Editor!.Fill(sheet, new CellArea(1, 1, 2, 1), new CellArea(1, 1, 5, 1)); // as the fill handle: 1 to 5
view.InsertRows(); // a row before the selected one, A2, as Ctrl+Plus
view.FillDown(); // the row above copied into it, as Ctrl+D
Columns and rows are resized by dragging the edges of their headers and fitted to their content
by double-clicking them. The fill handle on the selection's corner continues series and copies
formulas, right-clicking a header gives Excel's menu to insert, delete, hide and unhide, and the
view zooms from 10% to 400%. Each change is a step to undo. Widths, heights and hidden rows and
columns are the worksheet's own, so XlsxWriter saves them. See
What the grid shows for every key.
Selection, copying and scrolling
view.ActiveCell = new CellPosition(row: 10, column: 3); // C10, selected alone
view.Selection = view.Selection!.Extend(rows: 2, columns: 1, sheet); // C10:D12, as Shift with the arrows
view.Offset = new Vector(0, 200); // scrolled ten default rows down
await view.CopyAsync(); // as Ctrl+C
ActiveCell, Selection and Offset are Avalonia properties, so they can be bound. The active
cell is the selection's; setting it selects that cell alone. Cells are selected with the mouse and
keyboard as in Excel, and copying puts them on the clipboard as text and as an HTML table, which
Excel pastes with their styles. The wheel scrolls three rows a turn.