Мини-учебник по ReoGrid версии 2.0.0

Простая таблица

Оглавление

Первое знакомство

Поддерживаемые платформы

ReoGrid поддерживает технологии Windows Form и WPF. Поэтому в архиве с файлами компонента приведено два варианта компонента: WPF-версия содержит эти три буквы в названии папки.

Все редакции ReoGrid поддерживают клиентский профиль (.NET Client profile) версии 3.5. Код примеров данного руководства выполнялся в .NET Client profile 4.

Поддерживаемые форматы файлов

ReoGrid в разной степени поддерживает 4 формата файлов.

Формат Пояснение
rgf Собственный формат хранения данных, в его основе лежит расширяемый язык разметки XML. Данные можно как сохранять, как и загружать.
xlsx Формат хранения данных Microsoft Excel 2007 и более новых версий. Данные можно как сохранять, как и загружать.
csv Простой формат для хранения табличных данных в текстовом файле. Данные можно как сохранять, как и загружать, но только для одного листа.
html Документ на языке гипертекстовой разметки. Данные листа можно лишь экспортировать в данный формат, загрузка данных из такого файла не предусмотрена.

Особенности распространения и поддержки

ReoGrid, начиная с версии 1.3.0, распространяется под лицензией MIT. Из платных возможностей остались: техническая поддержка на русском, украинском, английском, японском и китайском языках и запросы на функционал под заказ. Подробнее можно узнать этой на странице.

Выбор редакции

Компонент ReoGrid доступен в нескольких редакциях

Редакция Пояснение
Минимальная (Minimum или WPFMinimum) Содержит лишь библиотеку unvell.ReoGrid.dll. Доступны все основные функции.
Стандартная (Release) Все основные функции и вычисление формул
Расширенная (Extension или WPFExtension) Помимо указанных выше, содержит библиотеки для работы со сценариями: unvell.ReoScript.dll и unvell.ReoScript.EditorLib.dll. Также в состав этой редакции входят два сторонних компонента: Antlr3.Runtime.dll и FastColoredTextBox.dll (Windows Form).

Введение

Терминология, необходимая для работы с ReoGrid, во многом аналогична таковой у Microsoft Excel. Здесь также присутствуют: Книги (Workbooks), Листы (WorkSheets), ячейки (Cells). В ячейках так же можно хранить как значения в основных форматах (текстовом, числовом, денежном, …), так и формулы с использованием ряда функций, совместимых с английской и русской версиями Excel.

Экземпляр компонента (он же экземпляр класса IWorkbook) изначально содержит один Лист. Он доступен по псевдониму Currentworksheet (текущий лист).

Далее подразумевается, что в основную форму проекта (Windows Forms) добавлен экземпляр компонента ReoGrid с именем rgrid.

Новые листы книги могут создаваться как визуально – c использованием встроенного в ReoGrid вкладочного элемента (TabControl), так и программно – путём создания экземпляра объекта WorkSheet с последующим его добавлением в состав книги.

Пора начинать

Рассмотрим основные моменты работы с компонентом на конкретных примерах. То есть, на основе рассмотренных ниже фрагментов кода можно собрать работоспособный редактор электронных таблиц. Изначально подразумевается, что на форму добавлен компонент ReoGrid с именем rgrid.

Необходимые пространства имён (Namespaces)

Для создания редактора редактора электронных таблиц будет достаточно подключить следующие пространства имён:

VB

Imports System.IO
Imports System.Text
Imports unvell.ReoGrid 'Сам компонент
Imports unvell.ReoGrid.CellTypes 'Типы ячеек
Imports unvell.ReoGrid.Actions 'Действия
Imports unvell.ReoGrid.DataFormat 'Форматы данных
Imports unvell.ReoGrid.Print 'Печать
Imports unvell.ReoGrid.Chart 'Диаграммы
Imports unvell.ReoGrid.Events

C#

using System.IO;
using System.Text;
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using System.ComponentModel;
using unvell.ReoGrid; //Сам компонент
using unvell.ReoGrid.CellTypes; //Типы ячеек
using unvell.ReoGrid.Actions; //Действия
using unvell.ReoGrid.DataFormat; //Форматы данных
using unvell.ReoGrid.Print; //Печать
using unvell.ReoGrid.Chart; //Диаграммы

Книга в памяти (виртуальная книга)

Помимо визуальной формы, ReoGrid может создавать виртуальную книгу (“книгу в памяти”, “Memory workbook”).

Виртуальная книга отличается от обычной отсутствием графического интерфейса и соответствующих свойств, событий, методов и действий, включая отмену/повтор действий. Требует гораздо меньше ресурсов компьютера, идеально подходит для выполнения некоторых фоновых задач, например: по полученным сведениям составить отчёт и сохранить его в виде файла.

Возможности и ограничения виртуальных книг

Возможности:

  • Работа с листами: создание, добавление, вставка, удаление, копирование, перемещение, поиск по имени (GetWorksheetByName) и по индексу (GetWorksheetIndex).
  • Коллекция листов (Worksheets).
  • Загрузка и сохранение данных: форматы RGF, Excel.
  • Все основные события книги.
  • Уведомления о возникших исключениях.

Ограничения (функционал недоступен):

  • Свойство CurrentWorksheet: у виртуальной книги нет визуального интерфейса, листа по умолчанию и переключателя листов. Управление листами происходит с помощью коллекции Worksheets.
  • Методы и события, связанные с прокруткой (Scroll).
  • Стили оформления самого компонента.
  • Методы, связанные с действиями: DoAction, Undo, Redo и RepeatLastAction. Поэтому все действия выполняются мгновенно и без возможности отмены.

Пример работы с книгой в памяти приведён в конце данного руководства.

Манипулирование листами книги

VB

'Создание экземпляра виртуальной книги
Dim workbook = ReoGridControl.CreateMemoryWorkbook()

'Сброс книги (удаление всех листов и создание пустого нового)
rgrid.Reset()

'Создание экземпляра листа с именем по умолчанию
Dim sheet As Worksheet = rgrid.CreateWorksheet()
'или с указанным именем  (имена должны быть уникальны)
Dim sheet1 As Worksheet = rgrid.CreateWorksheet("Мой_лист")

'Добавление листа в книгу в конец или с уточнением позиции
rgrid.AddWorksheet(sheet)
rgrid.InsertWorksheet(1, sheet)
'или
rgrid.Worksheets.Add(sheet)
rgrid.Worksheets.Insert(1, sheet)

'Определение количества листов в книге
Dim mycount As Integer = rgrid.Worksheets.Count

'Удаление листа с указанием экземпляра
rgrid.Worksheets.Remove(sheet)
'или
rgrid.RemoveWorksheet(sheet)
'или же с указанием позиции листа
rgrid.RemoveWorksheet(1)

'Копирование листа
Dim sheet2 As Worksheet = rgrid.CopyWorksheet(0, 1)

'Перемещение листа
rgrid.MoveWorksheet(0, 3)

'Сброс листа (удаление всех данных)
rgrid.CurrentWorksheet.Reset()

'Освобождение ресурсов, используемых листом
rgrid.Worksheets(0).Dispose()
C#


//Создание экземпляра виртуальной книги
var workbook = ReoGridControl.CreateMemoryWorkbook();

//Сброс книги (удаление всех листов и создание пустого нового)
rgrid.Reset();

//Создание экземпляра листа с именем по умолчанию
Worksheet sheet = rgrid.CreateWorksheet();
//или с указанным именем (имена должны быть уникальны)
Worksheet sheet1 = rgrid.CreateWorksheet("Мой_лист");

//Добавление листа в книгу в конец или с уточнением позиции
rgrid.AddWorksheet(sheet);
rgrid.InsertWorksheet(1, sheet);
//или
rgrid.Worksheets.Add(sheet);
rgrid.Worksheets.Insert(1, sheet);

//Определение количества листов в книге
int mycount = rgrid.Worksheets.Count;

//Удаление листа с указанием экземпляра
rgrid.Worksheets.Remove(sheet);
//или
rgrid.RemoveWorksheet(sheet);
//или же с указанием позиции листа
rgrid.RemoveWorksheet(1);

//Копирование листа
Worksheet sheet2 = rgrid.CopyWorksheet(0, 1);

//Перемещение листа
rgrid.MoveWorksheet(0, 3);

//Сброс листа (удаление всех данных)
rgrid.CurrentWorksheet.Reset();

//Освобождение ресурсов, используемых листом
rgrid.Worksheets[0].Dispose();

Основные (простые) действия над ячейками и диапазонами ячеек

VB

'Занесение значения в ячейку
rgrid.CurrentWorksheet(1, 1) = "Какой-то текст"
rgrid.CurrentWorksheet("B2") = "Какой-то текст"

'Получение данных из ячейки (текст)
Dim strText As String = rgrid.CurrentWorksheet(1, 1).ToString
Dim strText1 As String = rgrid.CurrentWorksheet.Cells(1, 1).DisplayText

'Ввод и получение текстового представления формулы
rgrid.CurrentWorksheet.Cells(1, 1).Formula = "=A8+B8"
Dim strFormula As String = rgrid.CurrentWorksheet.Cells(1, 1).Formula

'Пример сброса типа ячейки к обычному (подробности ниже)
rgrid.CurrentWorksheet.Cells("E5").Body = Nothing

'Задание имени диапазона
Dim myRange = rgrid.CurrentWorksheet.DefineNamedRange("мой_диапазон", 3, 1, 5, 4)

'Запись данных в диапазон
myRange.Data = New Object(,) {{1, 2, 3, 4}, {0.10000000000000001, 0.20000000000000001, 0.29999999999999999, 0.40000000000000002}, {"яблоко", "банан", "апельсин", "груша"}}

'Задание ширины столбца
rgrid.CurrentWorksheet.SetColumnsWidth(1, 4, 100)

'Изменяем ширину заголовка
rgrid.CurrentWorksheet.ColumnHeaders(0).Width = 100 'Столбец A
rgrid.CurrentWorksheet.ColumnHeaders(1).Width = 500 'Столбец B
C#

//Занесение значения в ячейку
rgrid.CurrentWorksheet[1, 1] = "Какой-то текст";
rgrid.CurrentWorksheet["B2"] = "Какой-то текст";

//Получение данных из ячейки (текст)
string strText1 = rgrid.CurrentWorksheet.Cells[1, 1].DisplayText;

//Ввод и получение текстового представления формулы
rgrid.CurrentWorksheet.Cells[1, 1].Formula = "=A8+B8";
string strFormula = rgrid.CurrentWorksheet.Cells[1, 1].Formula;

//Пример сброса типа ячейки к обычному (подробности ниже)
rgrid.CurrentWorksheet.Cells["E5"].Body = null;

//Задание имени диапазона
var myRange = rgrid.CurrentWorksheet.DefineNamedRange("мой_диапазон", 3, 1, 5, 4);

//Запись данных в диапазон
myRange.Data = new object[, ] {{1,2,3,4},{0.1,0.2,0.3,0.4},{"яблоко","банан","апельсин","груша"}};

//Задание ширины столбца
rgrid.CurrentWorksheet.SetColumnsWidth(1, 4, 100);

//Изменяем ширину заголовка
rgrid.CurrentWorksheet.ColumnHeaders[0].Width = 100; //Столбец A
rgrid.CurrentWorksheet.ColumnHeaders[1].Width = 500; //Столбец B

Типы ячеек (Cell Types)

Для использования встроенных типов ячеек нужно импортировать соответствующее пространство имён: unvell.ReoGrid.CellTypes

Ячейки в ReoGrid могут иметь основу, унаследованную от CellBody или реализованную через интерфейс ICellBody.

Чтобы вернуть ячейке первоначальный облик, то есть вернуть возможность вводить данные и править текст, достаточно присвоить свойству body значение null (C#), Nothing (VB)

ReoGrid содержит следующие встроенные типы ячеек:

Название Вид Пояснение
Кнопка (Button) Button Для каждой кнопки можно назначить свой обработчик событий.
Гиперссылка (Hyperlink) Hyperlink По щелчку на ссылке в браузере по умолчанию открывается соответствующий сайт.
Флажок (Check Box) CheckBox Аналог флажка (CheckBox). Свойство для добавления поясняющего текста не предусмотрено.
Радиокнопка (Radio Button) Radiobutton Аналог радиокнопки. Свойство для добавления поясняющего текста не предусмотрено.
Раскрывающийся список (Drop-down list) DropDownList Аналог классического раскрывающегося списка
Картинка (Image) Image Изображение с настраиваемым расположением.
Индикатор выполнения (Numeric Progress) NumericProgress Аналог ProgressBar. Значения: от 0 до 1
Кнопка с картинкой (ImageButtonCell) ImageButtonCell Кнопка, для которой можно придать вид картинки.
“Индикатор направления” (NegativeProgressCell) NegativeProgressCell В первая половина ячейки отвечает за отрицательные значения, вторая – за положительные. Рекомендуемые значения: интервал от -1 до 1
Выбор даты (DatePickerCell) DatePickerCell При щелчке на списке появляется встроенный элемент управления Календарь.

Ниже приведены примеры кода для работы с указанными типами ячеек.

Кнопка (Button)

VB

'1. Самый простой вариант кнопки (Button)
rgrid.CurrentWorksheet(1, 1) = New ButtonCell()
rgrid.CurrentWorksheet(1, 1) = "Привет"

'2. Кнопка с обработчиком события нажатия (Click)
Dim btn As ButtonCell = New ButtonCell("Привет!")
rgrid.CurrentWorksheet(1, 1) = New Object() {"Кнопка: ", btn}

AddHandler btn.Click, AddressOf btn_Click
C#

//1. Самый простой вариант кнопки (Button)
rgrid.CurrentWorksheet[1, 1] = new ButtonCell();
rgrid.CurrentWorksheet[1, 1] = "Привет";

//2. Кнопка с обработчиком события нажатия (Click)
ButtonCell btn = new ButtonCell("Привет!");
rgrid.CurrentWorksheet[1, 1] = new object[] {"Кнопка: ",btn};

Вариант обработчика события

VB

    Sub btn_Click(ByVal s As Object, ByVal e As EventArgs)
MsgBox("Кнопка нажата")
    End Sub
    
C#

var button = new ButtonCell("Привет");
button.Click += (s, e) => MessageBox.Show("Кнопка нажата");

Гиперссылка (Hyperlink)

Гиперссылка использует данные ячейки как адрес URL.

VB

'1. Делаем гиперссылкой выделенный диапазон.
rgrid.CurrentWorksheet(rgrid.CurrentWorksheet.SelectionRange) = New HyperlinkCell("https://reogrid.net/ru", False)

'2. Настройка всех основных параметров с последующим применением к нужной ячейке.
Dim MyLink As New HyperlinkCell
MyLink.LinkColor = Color.Blue
MyLink.ActivateColor = Color.Green
MyLink.VisitedColor = Color.Red
MyLink.LinkURL = "https://reogrid.net/ru"
MyLink.AutoNavigate = True
rgrid.CurrentWorksheet(1, 2) = MyLink

'Если по щелчку на гиперссылке должен происходить переход, то можно применить приведённый ниже код. Объявление переменной-гиперссылки может потребоваться перенести в область объявления переменной на уровне класса формы
Dim link = New HyperlinkCell("https://reogrid.net/ru")
rgrid.CurrentWorksheet(rgrid.CurrentWorksheet.SelectionRange) = New Object() {"Гиперссылка", link}

'AddHandler link.Click, AddressOf link_Click
'Sub link_Click(ByVal s, ByVal e)
'System.Diagnostics.Process.Start(rgrid.GetCellText(1, 2))
'End Sub
C#

//1. Делаем гиперссылкой выделенный диапазон.
rgrid.CurrentWorksheet[rgrid.CurrentWorksheet.SelectionRange] = new HyperlinkCell("https://reogrid.net/ru", false);

//2. Настройка всех основных параметров с последующим применением к нужной ячейке.
HyperlinkCell MyLink = new HyperlinkCell();
MyLink.LinkColor = Color.Blue;
MyLink.ActivateColor = Color.Green;
MyLink.VisitedColor = Color.Red;
MyLink.LinkURL = "https://reogrid.net/ru";
MyLink.AutoNavigate = true;
rgrid.CurrentWorksheet[1, 2] = MyLink;

//Если по щелчку на гиперссылке должен происходить переход, то можно применить приведённый ниже код. Объявление переменной-гиперссылки может потребоваться перенести в область объявления переменной на уровне класса формы
var link = new HyperlinkCell("https://reogrid.net/ru");
rgrid.CurrentWorksheet[rgrid.CurrentWorksheet.SelectionRange] = new object[] {"Гиперссылка",link};			
//link.Click += link_Click;
/*public void link_Click(s, e)
{
System.Diagnostics.Process.Start(rgrid.GetCellText(1, 2));
}*/

Флажок (CheckBox)

Для этой процедуры рекомендуется использовать таблицу без объединённых ячеек 😉 Сам Флажок занимает одну ячейку, поясняющую надпись к нему нужно располагать с другой ячейке.

VB

Dim middleStyle = New WorksheetRangeStyle
middleStyle.Flag = PlainStyleFlag.Padding
middleStyle.Flag = PlainStyleFlag.HorizontalAlign
middleStyle.Padding = New unvell.ReoGrid.PaddingValue(2)
middleStyle.HAlign = ReoGridHorAlign.Center
Dim grayTextStyle = New WorksheetRangeStyle
grayTextStyle.Flag = PlainStyleFlag.TextColor
grayTextStyle.TextColor = Color.DimGray

Dim checkbox As CheckBoxCell = New CheckBoxCell()
rgrid.CurrentWorksheet.SetRangeStyles(7, 2, 1, 1, middleStyle)
rgrid.CurrentWorksheet.SetRangeStyles(8, 2, 1, 1, grayTextStyle)
rgrid.CurrentWorksheet(7, 1) = New Object() {"Флажок", checkbox, "Напомнить через 5 минут"}
rgrid.CurrentWorksheet(8, 2) = "(Изменить состояние элемента управления можно и при помощи клавиатуры)"

'Пример создания обработчика. Для его работы может потребоваться объявление переменной checkbox на уровне класса
'AddHandler checkbox.CheckChanged, AddressOf checkbox_CheckChanged
'Sub checkbox_CheckChanged(ByVal sender, ByVal e)
'MsgBox("Флажок переведён в состояние " & checkbox.ButtonState.ToString())
'End Sub
C#

var middleStyle = new WorksheetRangeStyle();
middleStyle.Flag = PlainStyleFlag.Padding;
middleStyle.Flag = PlainStyleFlag.HorizontalAlign;
middleStyle.Padding = new unvell.ReoGrid.PaddingValue(2);
middleStyle.HAlign = ReoGridHorAlign.Center;
dynamic grayTextStyle = new WorksheetRangeStyle();
grayTextStyle.Flag = PlainStyleFlag.TextColor;
grayTextStyle.TextColor = Color.DimGray;

CheckBoxCell checkbox = new CheckBoxCell();
rgrid.CurrentWorksheet.SetRangeStyles(7, 2, 1, 1, middleStyle);
rgrid.CurrentWorksheet.SetRangeStyles(8, 2, 1, 1, grayTextStyle);
rgrid.CurrentWorksheet[7, 1] = new object[] {"Флажок",checkbox,	"Напомнить через 5 минут"};

rgrid.CurrentWorksheet[8, 2] = "(Изменить состояние элемента управления можно и при помощи клавиатуры)";
//Пример создания обработчика. Для его работы может потребоваться объявление переменной checkbox на уровне класса
//checkbox.CheckChanged += checkbox_CheckChanged;
/*public void checkbox_CheckChanged(sender, e)
{
Interaction.MsgBox("Флажок переведён в состояние " + checkbox.ButtonState.ToString());
}*/

Радиокнопка (RadioButton)

Как и флажки, радиокнопки занимают одну ячейку. Назовём ячейку с радиокнопкой радиоячейкой. После добавления радиоячеек в группу, они начинают работать вместе (может быть выбрана только одна радиокнопка)

VB

rgrid.CurrentWorksheet(0, 1) = "Радиокнопки"

'Группа
Dim radioGroup As RadioButtonGroup = New RadioButtonGroup()

'Объявление ячеек и подключение их к группе
Dim rr1 As RadioButtonCell = New RadioButtonCell
rr1.RadioGroup = radioGroup
Dim rr2 As RadioButtonCell = New RadioButtonCell
rr2.RadioGroup = radioGroup
Dim rr3 As RadioButtonCell = New RadioButtonCell
rr3.RadioGroup = radioGroup

'Применяем к таблице
rgrid.CurrentWorksheet(1, 1) = rr1
rgrid.CurrentWorksheet(2, 1) = rr2
rgrid.CurrentWorksheet(3, 1) = rr3

'Ну и добавляем пояснения для пользователя
rgrid.CurrentWorksheet(1, 2) = "Яблоко"
rgrid.CurrentWorksheet(2, 2) = "Апельсин"
rgrid.CurrentWorksheet(3, 2) = "Банан"
C#

rgrid.CurrentWorksheet[0, 1] = "Радиокнопки";

//Группа
RadioButtonGroup radioGroup = new RadioButtonGroup();

//Объявление ячеек и подключение их к группе
RadioButtonCell rr1 = new RadioButtonCell();
rr1.RadioGroup = radioGroup;
RadioButtonCell rr2 = new RadioButtonCell();
rr2.RadioGroup = radioGroup;
RadioButtonCell rr3 = new RadioButtonCell();
rr3.RadioGroup = radioGroup;

//Применяем к таблице
rgrid.CurrentWorksheet[1, 1] = rr1;
rgrid.CurrentWorksheet[2, 1] = rr2;
rgrid.CurrentWorksheet[3, 1] = rr3;

//Ну и добавляем пояснения для пользователя
rgrid.CurrentWorksheet[1, 2] = "Яблоко";
rgrid.CurrentWorksheet[2, 2] = "Апельсин";
rgrid.CurrentWorksheet[3, 2] = "Банан";

Раскрывающийся список (Drop-down List)

При выборе пункта он обновляет данные в своей ячейке. Получить выбранный пункт можно в обработчике события CellDataChanged:

VB

Dim mydropdown As New DropdownListCell("Яблоко", "Апельсин", "Банан", "Груша", "Тыква", "Вишня", "Кокос")
rgrid.CurrentWorksheet(2, 3) = New Object() {"Список:", mydropdown}
C#

DropdownListCell mydropdown = new DropdownListCell( "Яблоко","Апельсин","Банан","Груша","Тыква","Вишня","Кокос" );
rgrid.CurrentWorksheet[2, 3] = new object[] {"Список:",	mydropdown};

Картинка (Image)

В ячейку помещается графическое изображение

Свойство ViewMode позволяет управлять отображением картинки в ячейке:

VB

'Загрузка из файла
Dim image1 As Image = Image.FromFile("D:\myinfo\photo.png")
rgrid.CurrentWorksheet(1, 2) = New ImageCell(image1)

'Получение из ресурсов
rgrid.CurrentWorksheet(1, 2) = New ImageCell(My.Resources.photo)
'или
rgrid.CurrentWorksheet("B3") = New ImageCell(My.Resources.photo)

'Создаём ImageCell с указанием параметра отображения
Dim img As Image = Image.FromFile("D:\myinfo\photo.png")
Dim imgCell As ImageCell = New ImageCell(img, ImageCellViewMode.Zoom)
rgrid.CurrentWorksheet("B3") = imgCell

'Также можно указать значение напрямую
imgCell.ViewMode = ImageCellViewMode.Clip

'И даже можно задать параметры выравнивания по вертикали и горизонтали:
Dim cell = rgrid.CurrentWorksheet.Cells("F6")
cell.Style.HAlign = ReoGridHorAlign.Center
cell.Style.VAlign = ReoGridVerAlign.Middle

'Ещё варианты 
rgrid.CurrentWorksheet(1, 2) = New ImageCell(My.Resources.photo, ImageCellViewMode.Clip)
rgrid.CurrentWorksheet(1, 2) = New ImageCell(My.Resources.photo, ImageCellViewMode.Stretch)
rgrid.CurrentWorksheet(1, 2) = New ImageCell(My.Resources.photo, ImageCellViewMode.Zoom)
C#

//Загрузка из файла
Image image1 = Image.FromFile("D:\\myinfo\\photo.png");
rgrid.CurrentWorksheet[1, 2] = new ImageCell(image1);

//Получение из ресурсов
rgrid.CurrentWorksheet[1, 2] = new ImageCell(reogrid_test_CSharp.Properties.Resources.photo);
//или
rgrid.CurrentWorksheet["B3"] = new ImageCell(reogrid_test_CSharp.Properties.Resources.photo);

//Создаём ImageCell с указанием параметра отображения
Image img = Image.FromFile("D:\\myinfo\\photo.png");
ImageCell imgCell = new ImageCell(img, ImageCellViewMode.Zoom);
rgrid.CurrentWorksheet["B3"] = imgCell;		

//Также можно указать значение напрямую
imgCell.ViewMode = ImageCellViewMode.Clip;
  
//И даже можно задать параметры выравнивания по вертикали и горизонтали:
var cell = rgrid.CurrentWorksheet.Cells["F6"];
cell.Style.HAlign = ReoGridHorAlign.Center;
cell.Style.VAlign = ReoGridVerAlign.Middle;

//Ещё варианты 
rgrid.CurrentWorksheet[1, 2] = new ImageCell(reogrid_test_CSharp.Properties.Resources.photo, ImageCellViewMode.Clip);
rgrid.CurrentWorksheet[1, 2] = new ImageCell(reogrid_test_CSharp.Properties.Resources.photo, ImageCellViewMode.Stretch);
rgrid.CurrentWorksheet[1, 2] = new ImageCell(reogrid_test_CSharp.Properties.Resources.photo, ImageCellViewMode.Zoom);		

Индикатор выполнения (Numeric Progress)

Позволяет отобразить результат выполнения какого-либо задания или его этапа.

VB

Dim pc As ProgressCell = New ProgressCell
pc.TopColor = Color.Aqua
pc.BottomColor = Color.Black
rgrid.CurrentWorksheet(7, 2) = 0.80000000000000004

rgrid.CurrentWorksheet(7, 2) = pc
C#

ProgressCell pc = new ProgressCell();
pc.TopColor = Color.Aqua;
pc.BottomColor = Color.Black;
rgrid.CurrentWorksheet[7, 2] = 0.8;

rgrid.CurrentWorksheet[7, 2] = pc;

Кнопка с картинкой (ImageButtonCell)

VB

Dim ibc As ImageButtonCell = New ImageButtonCell
ibc.Image = Image.FromFile("D:\myinfo\photo.png")
rgrid.CurrentWorksheet(9, 2) = 0.80000000000000004

rgrid.CurrentWorksheet(9, 2) = ibc
C#

ImageButtonCell ibc = new ImageButtonCell();
ibc.Image = Image.FromFile("D:\\myinfo\\photo.png");
rgrid.CurrentWorksheet[9, 2] = 0.8;

rgrid.CurrentWorksheet[9, 2] = ibc;

“Индикатор направления” (NegativeProgressCell)

VB

Dim npc As NegativeProgressCell = New NegativeProgressCell
npc.NegativeColor = Color.Red
npc.LinearGradient = True
npc.PositiveColor = Color.Green
rgrid.CurrentWorksheet(10, 2) = 0.80000000000000004
rgrid.CurrentWorksheet(10, 2) = npc

Dim npc1 As NegativeProgressCell = New NegativeProgressCell
npc1.NegativeColor = Color.Red
npc1.LinearGradient = True
npc1.PositiveColor = Color.Green
rgrid.CurrentWorksheet(11, 2) = -0.80000000000000004
rgrid.CurrentWorksheet(11, 2) = npc1
C#

NegativeProgressCell npc = new NegativeProgressCell();
npc.NegativeColor = Color.Red;
npc.LinearGradient = true;
npc.PositiveColor = Color.Green;
rgrid.CurrentWorksheet[10, 2] = 0.8;
rgrid.CurrentWorksheet[10, 2] = npc;

NegativeProgressCell npc1 = new NegativeProgressCell();
npc1.NegativeColor = Color.Red;
npc1.LinearGradient = true;
npc1.PositiveColor = Color.Green;
rgrid.CurrentWorksheet[11, 2] = -0.8;
rgrid.CurrentWorksheet[11, 2] = npc1;

“Выбор даты” (DatePickerCell)

VB

Dim myDatePicker As New DatePickerCell
rgrid.CurrentWorksheet(1, 3) = "Выберите дату:"
rgrid.CurrentWorksheet(2, 3) = New Object() {myDatePicker}
'или так:
rgrid.CurrentWorksheet(3, 3) = New Object() {"Выберите дату:", myDatePicker}
C#

var myDatePicker = new DatePickerCell();
rgrid.CurrentWorksheet[1, 3] = "Выберите дату:";
rgrid.CurrentWorksheet[2, 3] = new Object[] {myDatePicker};
//или так:
rgrid.CurrentWorksheet[3, 3] = new Object[] {"Выберите дату:", myDatePicker};

Форматы данных

Для использования форматов данных нужно импортировать пространство имён unvell.ReoGrid.DataFormat

Указываем формат данных ячейки с помощью метода листа SetRangeDataFormat:

Встроенные шаблоны форматирования данных

Тип CellDataFormatFlag Аргумент
Числовой (Number) CellDataFormatFlag.Number NumberDataFormatter.NumberFormatArgs
Дата/Время (DateTime) CellDataFormatFlag.DateTime DateTimeDataFormatter.DateTimeFormatArgs
Процентный (Percent) CellDataFormatFlag.Percent PercentDataFormatter.PercentFormatArgs
Денежный (Currency) CellDataFormatFlag.Currency CurrencyDataFormatter.CurrencyFormatArgs
Текстовый (Text) CellDataFormatFlag.Text Нет
Настраиваемый (Custom Extension) CellDataFormatFlag.Custom Любой объект

Для числового типа доступно перечисление NumberNegativeStyle: стиль отображения отрицательных значений.

Стиль Пример Значение для перечисления
Без стиля -123,456.789 Minus
Красный 123,456,789 Red
Красный цвет и минус -123,456.789 Red | Minus (VB: Red Or Minus)
Помещение в скобки (123,456.789) Brackets
Помещение в скобки и красный цвет (123,456.789) Brackets | Red (VB: Brackets Or Red)
Префикс Sankaku ▲ 123,456,789 Prefix_Sankaku
Красный префикс Sankaku ▲ 123,456,789 Prefix_Sankaku | Red (VB: Prefix_Sankaku Or Red)

Пример использования:

VB

'Числовой формат данных (Number)
Dim FFNum As New NumberDataFormatter.NumberFormatArgs
FFNum.DecimalPlaces = 4 'Количество знаков после запятой/точки: 0,1234
FFNum.NegativeStyle = NumberDataFormatter.NumberNegativeStyle.RedBrackets 'стиль отрицательных чисел
FFNum.UseSeparator = True 'Использовать разделитель: 123,456
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Number, FFNum)

'Дата/Время (DateTime)
Dim FFDT As New DateTimeDataFormatter.DateTimeFormatArgs
FFDT.CultureName = "ru-RU" 'Культура "ru-RU"
FFDT.Format = "dd/MM/yyyy" 'Шаблон 
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.DateTime, FFDT)

'Процентный (Percent)
Dim FFPer As New NumberDataFormatter.NumberFormatArgs
FFPer.DecimalPlaces = 2 'Количество знаков после запятой или точки
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Percent, FFPer)

'Денежный (Currency)
Dim FFCur As New CurrencyDataFormatter.CurrencyFormatArgs
FFCur.CultureEnglishName = "ru-RU" 'Культура "ru-RU"
FFCur.DecimalPlaces = 1 'Количество знаков после запятой/точки
FFCur.PostfixSymbol = "р." 'Символ "р.". Указываем после числа
'FFCur.PrefixSymbol = "р." 'Символ "р.". Указываем перед числом
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Currency, FFCur)

'Текстовый (Text)
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Text, Nothing)
C#

//Числовой формат данных (Number)
NumberDataFormatter.NumberFormatArgs FFNum = new NumberDataFormatter.NumberFormatArgs();
FFNum.DecimalPlaces = 4; //Количество знаков после запятой/точки: 0,1234
FFNum.NegativeStyle = NumberDataFormatter.NumberNegativeStyle.RedBrackets; //стиль отрицательных чисел
FFNum.UseSeparator = true; //Использовать разделитель: 123,456
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Number, FFNum);

//Дата/Время (DateTime)
DateTimeDataFormatter.DateTimeFormatArgs FFDT = new DateTimeDataFormatter.DateTimeFormatArgs();
FFDT.CultureName = "ru-RU"; //Культура "ru-RU"
FFDT.Format = "dd/MM/yyyy"; //Шаблон
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.DateTime, FFDT);

//Процентный (Percent)
NumberDataFormatter.NumberFormatArgs FFPer = new NumberDataFormatter.NumberFormatArgs();
FFPer.DecimalPlaces = 2; //Количество знаков после запятой или точки
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Percent, FFPer);

//Денежный (Currency)
CurrencyDataFormatter.CurrencyFormatArgs FFCur = new CurrencyDataFormatter.CurrencyFormatArgs();
FFCur.CultureEnglishName = "ru-RU"; //Культура "ru-RU"
FFCur.DecimalPlaces = 1; //Количество знаков после запятой/точки
FFCur.PostfixSymbol = "р."; //Символ "р.". Указываем после числа
//FFCur.PrefixSymbol = "р."; //Символ "р.". Указываем перед числом
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Currency, FFCur);

//Текстовый (Text)
rgrid.CurrentWorksheet.SetRangeDataFormat(RangePosition.EntireRange, CellDataFormatFlag.Text, null);

Управление параметрами книги или листа

Существуют параметры для всей книги и для отдельных её листов. Для управления параметром существует три метода: универсальный (нужно указать параметр типа WorkbookSettings для книги, WorksheetSettings для листа, а также булевое значение: True = включить, False = выключить), включение и выключение. Для последних вариантов в скобках нужно указать включаемый или отключаемый параметр типа WorkbookSettings или WorksheetSettings.

Узнать значение параметра можно с помощью метода HasSetting

Параметры книги (WorkbookSettings) и листа (WorksheetSettings)

Варианты включения и выключения параметров, получение состояния параметра, а также комбинирование параметров. В качестве примера взят параметр WorkbookSettings.View_ShowSheetTabControl

VB

 
'1. Книга
rgrid.SetSettings(WorkbookSettings.View_ShowSheetTabControl, True) 'Универсальный (True - включение, False - выключение)
rgrid.EnableSettings(WorkbookSettings.View_ShowSheetTabControl) 'Включение
rgrid.DisableSettings(WorkbookSettings.View_ShowSheetTabControl) 'Выключение
Dim bBook As Boolean = rgrid.HasSettings(WorkbookSettings.View_ShowSheetTabControl) 'Получаем текущее значение параметра

'2. Лист
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_Default, True) 'Универсальный вариант
rgrid.CurrentWorksheet.EnableSettings(WorksheetSettings.Behavior_Default) 'Включение
rgrid.CurrentWorksheet.DisableSettings(WorksheetSettings.Behavior_Default) 'Выключение
Dim bSheet As Boolean = rgrid.CurrentWorksheet.HasSettings(WorksheetSettings.Behavior_Default) 'Получаем текущее значение параметра
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_Default Or WorksheetSettings.Edit_Readonly, False) 'Выключение сразу двух параметров
C#

//1. Книга
rgrid.SetSettings(WorkbookSettings.View_ShowSheetTabControl, true); //Универсальный (true - включение, false - выключение)
rgrid.EnableSettings(WorkbookSettings.View_ShowSheetTabControl); //Включение
rgrid.DisableSettings(WorkbookSettings.View_ShowSheetTabControl); //Выключение
bool bBook = rgrid.HasSettings(WorkbookSettings.View_ShowSheetTabControl); //Получаем текущее значение параметра

//2. Лист
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_Default, true); //Универсальный вариант  (true - включение, false - выключение)
rgrid.CurrentWorksheet.EnableSettings(WorksheetSettings.Behavior_Default); //Включение
rgrid.CurrentWorksheet.DisableSettings(WorksheetSettings.Behavior_Default); //Выключение
bool bSheet  = rgrid.CurrentWorksheet.HasSettings(WorksheetSettings.Behavior_Default); //Получаем текущее значение параметра
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_Default | WorksheetSettings.Edit_Readonly, false);//Выключение сразу двух параметров

Пример настройки книги и листа с пояснениями в комментариях

VB

 
'Включаем все параметры книги
rgrid.SetSettings(WorkbookSettings.View_ShowSheetTabControl, True) 'Показывать вкладки-листы
rgrid.SetSettings(WorkbookSettings.View_ShowScrolls, True) 'Показывать полосы прокрутки
rgrid.SetSettings(WorkbookSettings.View_ShowHorScroll, True) 'Показывать горизонтальную полосу прокрутки
rgrid.SetSettings(WorkbookSettings.View_ShowVerScroll, True) 'Показывать вертикальную полосу прокрутки

'Включаем все параметры листа
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_MouseWheelToScroll, True) 'Разрешить прокрутку таблицы колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_MouseWheelToZoom, True) 'Разрешить пользователю масштабировать таблицу колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_ShortcutKeyToZoom, True) 'Разрешить пользователю масштабировать таблицу горячей клавишей (ctrl + plus,minus)
'rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_DragToMoveColumnHeader, True) 'Разрешить пользователю перемещать весь столбец перетаскиванием мышью (Зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_ScrollToFocusCell, True) 'Всегда разрешать автоматическую прокрутку листа для показа выбранных ячеек (имеющих фокус)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_AllowUserChangingPageBreaks, True) 'Разрешить пользователю вставлять, удалять или регулировать разделители страниц листа

'Правка
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_Readonly, True) 'Элемент управления будет работать в режиме "Только для чтения". Внесение каких-либо изменений запрещено
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoFormatCell, True) 'Разрешить форматировать данные после правки текста пользователем
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_FriendlyPercentInput, True) 'Разрешить отображение сомвола "процент" при вводе пользоателем значения ячейки с "процентным" форматом данных
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoExpandRowHeight, True) 'Разрешить настройку высоты строк при увеличении пользователем размера (кегля) шрифта
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoExpandColumnWidth, True) 'Разрешить настройку ширины столбцов при увеличении пользователем размера (кегля) шрифта
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustRowHeight, True) 'Разрешить пользователю настраивать высоту строк с помощью мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustColumnWidth, True) 'Разрешить пользователю настраивать длину столбца с помощью мыши (перетаскиванием)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustColumnWidth, True) 'Разрешить пользователю регулировать ширину столбца перетаскиванием мышью
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_DragSelectionToMoveCells, True) 'Разрешить перемещать или копировать выделенный диапазон перетаскиванием мышью

'Отображение, внешний вид
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowColumnHeader, True) 'Показывать заголовки столбцов
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowRowHeader, True) 'Показывать заголовки строк
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowHorizontalRuler, True) 'Показывать горизонтальную линейку (зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowVerticalRuler, True) 'Показывать вертикальную линейку (зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowGridLine, True) 'Показывать линии сетки
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowHiddenCellLine, True) 'Разрешить отображение линии на скрытом заголовке строк
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, True) 'Разрешить показывать внешние границы строк, если они не замкнуты (outlines exiting)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, True) 'Разрешить показ внешних границ столбцов, если они незамкнуты (outlines exiting)
'rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_MouseWheelToScroll, True) 'Разрешить прокрутку листа колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowPageBreaks, True) 'Разрешить отображать линии разделителя страниц
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowCellTextOverflow, True) 'Сделать текст ячеек отображаемым только внутри ячейки, не перекрывая соседние ячейки
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowFrozenLine, True) 'Отображать или скрывать линию фиксации (frozen line). По умолчанию линия отображается (true)

'Подсчёт формул
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Formula_AutoUpdateReferenceCell, True) 'Разрешить автоматическое обновление ссылок на ячейки в формуле
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Formula_AutoPickingCellAddress, True) 'Разрешить выбирать адреса выделенных ячеек во время правки формулы (0.8.8 зарезервировано)
C#

//Включаем все параметры книги
rgrid.SetSettings(WorkbookSettings.View_ShowSheetTabControl, true); //Показывать вкладки-листы
rgrid.SetSettings(WorkbookSettings.View_ShowScrolls, true); //Показывать полосы прокрутки
rgrid.SetSettings(WorkbookSettings.View_ShowHorScroll, true); //Показывать горизонтальную полосу прокрутки
rgrid.SetSettings(WorkbookSettings.View_ShowVerScroll, true); //Показывать вертикальную полосу прокрутки

//Включаем все параметры листа
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_MouseWheelToScroll, true); //Разрешить прокрутку таблицы колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_MouseWheelToZoom, true); //Разрешить пользователю масштабировать таблицу колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_ShortcutKeyToZoom, true); //Разрешить пользователю масштабировать таблицу горячей клавишей (ctrl + plus,minus)
//rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_DragToMoveColumnHeader, true); //Разрешить пользователю перемещать весь столбец перетаскиванием мышью (Зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_ScrollToFocusCell, true); //Всегда разрешать автоматическую прокрутку листа для показа выбранных ячеек (имеющих фокус)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Behavior_AllowUserChangingPageBreaks, true); //Разрешить пользователю вставлять, удалять или регулировать разделители страниц листа

//Правка
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_Readonly, true); //Элемент управления будет работать в режиме "Только для чтения". Внесение каких-либо изменений запрещено
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoFormatCell, true); //Разрешить форматировать данные после правки текста пользователем
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_FriendlyPercentInput, true); //Разрешить отображение сомвола "процент" при вводе пользоателем значения ячейки с "процентным" форматом данных
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoExpandRowHeight, true); //Разрешить настройку высоты строк при увеличении пользователем размера (кегля) шрифта
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AutoExpandColumnWidth, true); //Разрешить настройку ширины столбцов при увеличении пользователем размера (кегля) шрифта
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustRowHeight, true); //Разрешить пользователю настраивать высоту строк с помощью мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustColumnWidth, true); //Разрешить пользователю настраивать длину столбца с помощью мыши (перетаскиванием)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_AllowAdjustColumnWidth, true); //Разрешить пользователю регулировать ширину столбца перетаскиванием мышью
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Edit_DragSelectionToMoveCells, true); //Разрешить перемещать или копировать выделенный диапазон перетаскиванием мышью

//Отображение, внешний вид
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowColumnHeader, true); //Показывать заголовки столбцов
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowRowHeader, true); //Показывать заголовки строк
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowHorizontalRuler, true); //Показывать горизонтальную линейку (зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowVerticalRuler, true); //Показывать вертикальную линейку (зарезервировано)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowGridLine, true); //Показывать линии сетки
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowHiddenCellLine, true); //Разрешить отображение линии на скрытом заголовке строк
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, true); //Разрешить показывать внешние границы строк, если они не замкнуты (outlines exiting)
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, true); //Разрешить показ внешних границ столбцов, если они незамкнуты (outlines exiting)
//rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_MouseWheelToScroll, true); //Разрешить прокрутку листа колесом мыши
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowPageBreaks, true); //Разрешить отображать линии разделителя страниц
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_AllowCellTextOverflow, true); //Сделать текст ячеек отображаемым только внутри ячейки, не перекрывая соседние ячейки
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.View_ShowFrozenLine, true); //Отображать или скрывать линию фиксации (frozen line). По умолчанию линия отображается (true)

//Подсчёт формул
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Formula_AutoUpdateReferenceCell, true); //Разрешить автоматическое обновление ссылок на ячейки в формуле
rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Formula_AutoPickingCellAddress, true); //Разрешить выбирать адреса выделенных ячеек во время правки формулы (0.8.8 зарезервировано)
//rgrid.CurrentWorksheet.SetSettings(WorksheetSettings.Formula_AutoRebuild, true); //Разрешить автоматически корректировать или перестраивать формулу (0.8.8 зарезервировано)

Параметр, который позволяет указать: нужно ли добавлять в конец листа немного свободного пространства (отступ от нижнего края листа):

VB

rgrid.ShowScrollEndSpacing = False
C#

rgrid.ShowScrollEndSpacing = false;

Обработка событий

События листа

Событие Когда возникает
WorksheetCreated После создания листа
WorksheetInserted После вставки листа
WorksheetRemoved После удаления листа
BeforeWorksheetNameChange Перед переименованием листа
WorksheetNameChanged После переименования листа

События ячеек

Событие Когда возникает
BeforeCellEdit Перед любыми изменениями в ячейках в режиме правки
AfterCellEdit Когда какие-либо ячейки правятся пользователем
CellDataChanged Когда изменяются данные в ячейках
CellKeyUp Когда пользователь отпускает любую клавишу при активном листе внутри любой ячейки
CellMouseEnter Когда указатель мыши перемещается в ячейку и зависает над ней
CellMouseLeave Когда указатель мыши покидает ячейку
CellMouseDown Когда происходит нажатие кнопки мыши, а указатель находится в ячейке
CellMouseUp Когда происходит отпускание кнопки мыши, а указатель находится в ячейке
CellMouseMove Когда указатель мыши движется внутри ячейки

Принцип действия процедуры правки ячеек

Когда пользователь нажимает клавишу F2 или вводит любые символы (включая введённые инструментом IME), ReoGrid останавливает остальные процессы и переходит в режим правки ячейки (Edit mode), перед отображением на экране поля ввода ReoGrid вызовет возникновение события BeforeCellEdit. Это событие имеет аргумент IsCanncelled, который применяется для отмены правки. Если правка разрешена, то поле ввода будет отображено на экране и получит фокус ввода.

Во время ввода пользователем любого текста в поле ввода, в ReoGrid будут происходить события CellEditTextChanging и CellEditCharInputted, при этом событие CellEditTextChanging будет возникать когда пользователь изменяет текст в поле ввода. При этом нет разницы в том, как вводится текст: путём прямого ввода, методом копирования/вставки или же другими путями. Событие CellEditCharInputted возникает при получении от пользователя символов, включая символы Unicode из инструмента IME. Это событие имеет аргументы позволяют изменять вводимые символы или запретить их получение.

В WPF-издании, событие CellEditCharInputted можно проверять вводимые символы, но не изменять их. Для изменения текста нужно использовать событие CellEditTextChanging.

После того, как пользователь нажал клавишу Enter или убрал фокус ввода из поля ввода, процесс правки прерывается. По окончании правки возникают события AfterCellEdit и CellDataChanged. Обратите внимание на то, что когда пользователь нажмёт клавишу Escape, процесс правки будет отменён самим ReoGrid и введённые пользователем данные будут заменены теми данные, которые были в ячейке до правки, при этом произойдёт событие AfterCellEdit, а CellDataChanged не произойдёт.

AfterCellEdit против CellDataChanged

AfterCellEdit предоставляет шанс прервать или отменить правку после того, как пользователь завершил ввод текста. Возвращение EndReason со значением Cancel из AfterCellEditEventArgs приведёт к тому, что правка будет прервана, а данные в ячейке заменятся теми, которые там были до начала правки. Событие CellDataChanged возникает тогда, когда данные были изменены каким-либо образом, включая метод SetCellData и вставку из Буфера обмена, это последнее событие, наблюдаемое после изменения данных в ячейке, оно не позволяет отменить правку или что-либо изменить.

Подробнее о событии CellKeyUp

Пример использования:

VB

'Добавление обработчика:
Dim sheet = rgrid.CurrentWorksheet
AddHandler sheet.CellKeyUp, AddressOf sheet_CellKeyUp
C#

//Добавление обработчика:
var sheet = rgrid.CurrentWorksheet;
sheet.CellKeyUp += sheet_CellKeyUp;

Код обработчика

VB

    Sub sheet_CellKeyUp(ByVal Sender As Object, ByVal e As CellKeyDownEventArgs)
MessageBox.Show("Нажата клавиша: " & e.KeyCode)
    End Sub
    
C#

void sheet_CellKeyUp(object sender, unvell.ReoGrid.Events.CellKeyDownEventArgs e){
  MessageBox.Show("Нажата клавиша: " + e.KeyCode);
}

Примечание. Это событие может не происходить, если были нажаты клавиши, переводящие лист в режим редактирования (Edit-mode). Обычно к ним относят символьные клавиши A-Z, 0-9 и подобные. Поэтому, если для ячеек разрешено редактирование, то могут произойти лишь события BeforeCellKeyDown и AfterCellKeyDown.

Подробнее о событии CellMouseDown

Событие происходит при нажатии кнопки мыши, когда указатель мыши находится над видимой ячейкой.

Примечание. Значение свойства Cell аргумента события может быть равно null (VB: Nothing). ReoGrid не создаёт никаких экземпляров ячеек, если в ячейку не добавлялись данные или к ней не применялись стили.

Для того, чтобы всегда получать экземпляр ненулевой ячейки, используйте метод листа CreateAndGetCell.

VB

'Добавление обработчика:
'Dim sheet = rgrid.CurrentWorksheet
'AddHandler sheet.CellMouseDown, AddressOf sheet_CellMouseDown

'Код обработчика
'Sub sheet_CellMouseDown(ByVal Sender As Object, ByVal e As CellMouseEventArgs)
'небезопасно: экземпляр ячейки может быть равным Nothing
'Dim cell = e.Cell

'безопасно: если экземпляр ячейки не существует, то он создаётся по информации о позиции
'Dim sheet = rgrid.CurrentWorksheet
'Dim cell = sheet.CreateAndGetCell(e.CellPosition)
'End Sub
C#

//Добавление обработчика:
var sheet = rgrid.CurrentWorksheet;
//sheet.CellMouseDown += sheet_CellMouseDown;

//Код обработчика:
//void sheet_CellMouseDown(object sender, CellMouseEventArgs e) {
//небезопасно: экземпляр ячейки может быть равным null
//var cell = e.Cell;

//безопасно: если экземпляр ячейки не существует, то он создаётся по информации о позиции
//var sheet = rgrid.CurrentWorksheet;
//var cell = sheet.CreateAndGetCell(e.CellPosition);
//}

Подробнее о событии AfterCellEdit

Событие возникает после того, как пользователь закончил редактировать содержимое ячейки.

Пример: с помощью обработки события AfterCellEdit изменяем текст в ячейке: из ‘текст’ получаем ‘[текст]’:

VB

'Добавление обработчика:
'AddHandler rgrid.AfterCellEdit, AddressOf rgrid_AfterCellEdit

'Код обработчика:
'Sub rgrid_AfterCellEdit(ByVal Sender As Object, ByVal e As CellAfterEditEventArgs)
'e.NewData = "[" & e.NewData & "]"
'End Sub
C#

//Добавление обработчика:
//this.rgrid.AfterCellEdit += rgrid_AfterCellEdit;

//Код обработчика:
//void rgrid_AfterCellEdit(object sender, CellAfterEditEventArgs e)
//{
//  e.NewData = "[" + e.NewData + "]";
//}

События строк и столбцов

Событие Когда возникает
RowInserted Когда пользователь вставляет строки
RowDeleted Когда пользователь удаляет строки
ColInserted Когда пользователь вставляет столбцы
ColDeleted Когда пользователь вставляет столбцы
RowsHeightChanged Когда меняется высота строки
ColumnsWidthChanged Когда меняется ширина столбца
HeightChanged Когда меняется высота
WidthChanged Когда меняется ширина
RowsFiltered Когда к строкам применяется фильтр
RowsSorted Когда к строкам применяется сортировка

События диапазонов ячеек

Событие Когда возникает
RangeMerged Когда объединяются ячейки диапазона
RangeUnmerged Когда отменяется объединение ячеек диапазона
RangeStyleChanged Когда происходит установка стиля
BeforeRangeCopy Перед копированием выделенного диапазона
BeforeRangeMove Перед перемещением выделенного диапазона
AfterRangeCopy После копирования диапазона
AfterRangeMove После перемещения диапазона

События границ

Событие Когда возникает
BorderAdded Когда добавляются границы
BorderRemoved Когда удаляются границы

События выделенного

Событие Когда возникает
SelectionRangeChanged При изменении диапазона выделения
SelectionRangeChanging Во время изменения выделения мышью
SelectionModeChanged При изменении режима выделения
SelectionStyleChanged При изменении стиля выделения
SelectionForwardDirectionChanged При изменении направления перемещения фокуса ввода
SelectionMovedForward Когда выделение переносится в следующую позицию
HoverPosChanged Когда указатель мыши движется над ячейками
FocusPosChanged Когда фокус переходит к другой ячейке

Подробнее о событии SelectionRangeChanged

Событие происходит при смене выделенного диапазона листа. Пример:

VB

'Добавление обработчика:
'Dim sheet = rgrid.CurrentWorksheet
'AddHandler sheet.SelectionRangeChanged, AddressOf sheet_SelectionRangeChanged

'Код обработчика:
'Sub sheet_SelectionRangeChanged(byval sender as object, byval args as RangeEventArgs)
'MessageBox.Show("Выделен другой диапазон: " & args.Range.ToAddress())
'End Sub
C#

//Добавление обработчика:
//var sheet = rgrid.CurrentWorksheet;
//sheet.SelectionRangeChanged += sheet_SelectionRangeChanged;

//Код обработчика:
//void sheet_SelectionRangeChanged(object sender, RangeEventArgs args)
//{
//  MessageBox.Show("Выделен другой диапазон: " + args.Range.ToAddress());
//}

Примечание. Событие не будет происходить во время перемещения мыши над листом перед выделением листа, происходит только когда кнопка мыши отпущена. Для получения информации об изменении выделенного диапазона во время перемещения мыши, используйте событие SelectionRangeChanging.

События внешних границ (Outline)

Событие Когда возникает
OutlineAdded Когда в таблицу добавлена внешняя граница
OutlineRemoved Когда внешняя граница удалена из таблицы
BeforeOutlineCollapse Когда пользователь щёлкает на кнопке “-” за пределами таблицы – для её сворачивания
AfterOutlineCollapse Когда граница замкнулась
BeforeOutlineExpand Когда пользователь щёлкает на кнопке “+” за пределами таблицы – для её разворачивания
AfterOutlineExpand Когда внешняя граница развёрнута

События действий (Action)

Событие Когда возникает
ActionPerformed При выполнении любых действий
Undid Когда действие undid
Redid Когда действие redid

События фиксации (“замораживания”)

Событие Когда возникает
CellsFrozen Когда лист был зафиксирован
CellsUnfrozen Когда прекращена фиксация листа

События элемента управления

Событие Когда возникает
Scaled Во время масштабирования элемента управления (уменьшение/увеличение масштаба)
FileLoaded Когда в элемент управления загрузились данные из файлового потока (load from given stream will not fire this event)
FileSaved Когда содержимое элемента управления сохранено в файловом потоке (save into given stream will not fire this event)
Resetted Когда состояние элемента управление сбрасывается к значению по умолчанию

События буфера обмена

Событие Когда возникает
BeforeCopy Перед операцией копирования
AfterCopy Во время копирования диапазона из буфера обмена (Clipboard)
BeforePaste Перед операцией вставки
AfterPaste Во время вставки из буфера обмена (Clipboard)
BeforeCut Перед операцией вырезания
AfterCut Когда пользователь вырезает содержимое диапазона
OnPasteError При возникновении ошибок в процессе операции вставки

Внешний вид компонента и локализация

Раскраска компонента

Смена цветовой палитры

Во ряде случаев оформление компонента по умолчанию может не подходить под оформление основного приложения. Для этого достаточно внести изменения в объект ControlAppearanceStyle. Наиболее удобным вариантом может быть встроенный в ReoGrid Editor редактор стилей, вызываемый из меню Tools (Сервис) -> Control Appearance… (Оформление компонента). Полученный стиль можно экспортировать в набор строк на языках C#, Visual Basic, который необходимо вставить в код разрабатываемого приложения.

VB

'Создание экземпляра стиля элемента управления, содержащего настройки цветов
Dim rgcs As ControlAppearanceStyle = New ControlAppearanceStyle(Color.Gray, Color.DarkOrange, False)

'Цвет текста будет серым
rgcs(ControlAppearanceColors.GridText) = Color.Gray
'Изменение других переменных...

'Применение обновлённого стиля
rgrid.ControlStyle = rgcs
C#

// Создание экземпляра стиля элемента управления, содержащего настройки цветов
ControlAppearanceStyle rgcs = new ControlAppearanceStyle(Color.Gray, Color.DarkOrange, false);

// Цвет текста будет серым
rgcs[ControlAppearanceColors.GridText] = Color.Gray;
//Изменение других переменных...

// Применение обновлённого стиля
rgrid.ControlStyle = rgcs;

Встроенная локализация

ReoGrid может переключать язык интерфейса автоматически – в зависимости от клиентской среды выполнения.

Модуль

Английский

Японский Русский Китайский
ReoGrid \/  (Да) \/  (Да) \/  (Да) \/  (Да)
ReoGridEditor \/  (Да) \/  (Да) \/  (Да)
Demo Project \/ \/  (Да)

Локализация компонента

Для перевода надписей во встроенных элементах на нужный язык достаточно изменить значения нескольких свойств компонента.

VB

'Локализация
unvell.ReoGrid.LanguageResource.Button_Cancel = "Отмена"
unvell.ReoGrid.LanguageResource.Button_OK = "ОК"
unvell.ReoGrid.LanguageResource.Filter_SelectAll = "Выбрать все"
unvell.ReoGrid.LanguageResource.Filter_SortAtoZ = "Сортировка от А до Я"
unvell.ReoGrid.LanguageResource.Filter_SortZtoA = "Сортировка от Я до А"
unvell.ReoGrid.LanguageResource.Menu_DeleteSheet = "Удалить"
unvell.ReoGrid.LanguageResource.Menu_InsertSheet = "Вставить"
unvell.ReoGrid.LanguageResource.Menu_RenameSheet = "Переименовать"
unvell.ReoGrid.LanguageResource.Sheet = "Лист"
unvell.ReoGrid.LanguageResource.Sheet_RenameDialog_NameLabel = "Имя"
unvell.ReoGrid.LanguageResource.Sheet_RenameDialog_Title = "Переименование"

rgrid.CurrentWorksheet.Name = "Лист 1"
C#

//Локализация
unvell.ReoGrid.LanguageResource.Button_Cancel = "Отмена";
unvell.ReoGrid.LanguageResource.Button_OK = "ОК";
unvell.ReoGrid.LanguageResource.Filter_SelectAll = "Выбрать все";
unvell.ReoGrid.LanguageResource.Filter_SortAtoZ = "Сортировка от А до Я";
unvell.ReoGrid.LanguageResource.Filter_SortZtoA = "Сортировка от Я до А";
unvell.ReoGrid.LanguageResource.Menu_DeleteSheet = "Удалить";
unvell.ReoGrid.LanguageResource.Menu_InsertSheet = "Вставить";
unvell.ReoGrid.LanguageResource.Menu_RenameSheet = "Переименовать";
unvell.ReoGrid.LanguageResource.Sheet = "Лист";
unvell.ReoGrid.LanguageResource.Sheet_RenameDialog_NameLabel = "Имя";
unvell.ReoGrid.LanguageResource.Sheet_RenameDialog_Title = "Переименование";

rgrid.CurrentWorksheet.Name = "Лист 1";

Инициализация списков

Все компоненты с префиксом cbo, упоминающиеся в данном руководстве, являются раскрывающимися списками ComboBox

Заполняем списки перечнем кеглей (размеров) шрифта, гарнитур (семейств) шрифтов и количества процентов

VB

'Кегли
cboFontSize.Items.AddRange({8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 48, 60, 72, 96, 100})

'Гарнитуры
cboFontName.DataSource = FontFamily.Families
cboFontName.ValueMember = "Name"
cboFontName.Text = "Выберите гарнитуру"

'Масштабирование
cboZoom.Items.AddRange({"25%", "50%", "75%", "100%", "125%", "150%", "200%", "300%", "400%"})

'Объявление обработчиков событий изменения масштаба
'AddHandler rgrid.CurrentWorksheet.Scaled, AddressOf Sheet_Scaled
AddHandler cboZoom.TextChanged, AddressOf cboZoom_TextChanged
C#

//Кегли
cboFontSize.Items.AddRange(new string[] {"8", "9","10", "11", "12", "14", "16", "18", "20", "22", "24", "28", "32", "36", "48", "60", "72", "96", "100"});

//Гарнитуры
cboFontName.DataSource = FontFamily.Families;
cboFontName.ValueMember = "Name";
cboFontName.Text = "Выберите гарнитуру";

//Масштабирование
cboZoom.Items.AddRange(new string[] {"25%", "50%", "75%", "100%", "125%", "150%", "200%", "300%", "400%"});

//Объявление обработчика события изменения масштаба (уберите символы комментирования)
//rgrid.CurrentWorksheet.Scaled += Sheet_Scaled;
//cboZoom.TextChanged += cboZoom_TextChanged;

Cовместимость с форматом Excel

ReoGrid имеет повышенную совместимость с форматом Excel 2007/2010 (xlsx): возможно как считывание данных, так и их запись. При этом поддерживаются основные стили оформления ячеек, встроенные плавающие изображения и некоторые типы диаграмм. Созданный компонентом файл с расширением xlsx понимается и программой LibreOffice Calc.

ReoGrid представляет собой книгу (Workbook), которая может содержать вложенные листы-таблицы (WorkSheets). Для переключения между листами служит встроенный отключаемый вкладочный элемент (TabControl). Активный лист имеет псевдоним CurrentWorkSheet.

В примерах будут встречаться примеры загрузки и сохранения данных, используя формат Microsoft Excel. Наличие установленной копии офисного пакета от Майкрософт не требуется.

Формула (Formula)

Что следует учитывать при работе с формулами

  1. Данные в ячейке, начинающиеся с символа “=”, автоматически обрабатываются как формула.
  2. Значения ячеек с формулами автоматически обновляются при изменении значений в связанных с ними ячейках.
  3. Данные в ячейке, начинающиеся с символа (‘) не будут восприниматься как формула.
  4. Язык формул ReoGrid чувствителен к регистру, все функции, совместимыe с Microsoft Excel, должны указываться в ВЕРХНЕМ регистре, например SUM и AVERAGE, вызов функции и использованием имён вида “sum” приведёт к возникновению исключения ‘function not found’ (функция не найдена).

Можно использовать как английскую, так и русскую версии функций: они равнозначны.

Поддерживаемые встроенные функции

Английчкая версия Русская версия Назначение функции
Статистические функции
SUM СУММ Возвращает сумму значений чисел. Пример: SUM(B11:E12), СУММ(B11:E12)
AVERAGE СРЗНАЧ Возвращает среднее арифметическое значение указанных аргументов
COUNT СЧЁТ Возвращает количество ячеек, содержащих числа, и подсчитывает числа в списке аргументов
COUNTA СЧЁТЗ Функция СЧЁТЗ подсчитывает количество заполненных ячеек в диапазоне.
MIN МИН Возвращает наименьшее значение в списке аргументов
MAX МАКС Возвращает наибольшее значение в списке аргументов
Функции условий
IF ЕСЛИ С проверкой на условие
AND И Логическое И
OR ИЛИ Логическое ИЛИ
NOT НЕ Логическое отрицание
Адресные функции
ROW СТРОКА Возвращает номер строки, определяемой ссылкой.
COLUMN СТОЛБЕЦ Возвращает номер столбца для указанной ссылка на ячейку.
ADDRESS АДРЕС Возвращает ссылку на отдельную ячейку листа в виде текста
INDIRECT ДВССЫЛ Возвращает ссылку, заданную текстовой строкой
Математические функции
ABS ABS Возвращает абсолютное значение числа
ROUND ОКРУГЛ Возвращает число, округленное с требуемой точностью. Примеры: ROUND(B8), ROUND(E8, 2)
CEILING ОКРВВЕРХ Возвращает число, округляемое в сторону увеличения, от нуля до ближайшего кратного указанному значению
FLOOR ОКРВНИЗ Округление числа до ближайшего меньшего значения
SIN SIN Возвращает синус числа
COS COS Возвращает косинус числа
TAN TAN Возвращает тангенс числа
ASIN ASIN Возвращает арксинус числа
ACOS ACOS Возвращает арккосинус числа
ATAN ATAN Возвращает арктангенс числа
ATAN2 ATAN2 Возвращает арктангенс для заданных координат x и y
POWER СТЕПЕНЬ Возвращает результат возведения числа в степень.
EXP EXP Возвращает число e, возведенное в указанную степень
LOG LOG Возвращает логарифм числа по заданному основанию.
LOG10 LOG10 Возвращает десятичный логарифм числа.
MOD ОСТАТ Возвращает остаток от деления аргумента “число” на значение аргумента “делитель”. Результат имеет тот же знак, что и делитель.
Функции для работы с датами
NOW ТДАТА Возвращает текущие дату и время в числовом формате
TODAY СЕГОДНЯ Возвращает текущую дату в числовом формате
TIME ВРЕМЯ Возвращает заданное время в числовом формате
YEAR ГОД Преобразует дату в числовом формате в год
MONTH МЕСЯЦ Преобразует дату в числовом формате в месяцы
DAY ДЕНЬ Преобразует дату в числовом формате в день месяца
HOUR ЧАС Преобразует дату в числовом формате в часы
MINUTE МИНУТЫ Преобразует дату в числовом формате в минуты
SECOND СЕКУНДЫ Преобразует дату в числовом формате в секунды
MILLISECOND MILLISECOND* Преобразует дату в числовом формате в миллисекунды
DAYS ДНЕЙ ?
Функции для работы со строками
LEFT ЛЕВСИМВ Возвращают крайние слева знаки текстового значения
RIGHT ПРАВСИМВ Возвращают крайние справа знаки текстовой строки
MID ПСТР Возвращают заданное число знаков из строки текста, начиная с указанной позиции
UPPER ПРОПИСН Преобразует все буквы текста в прописные
LOWER СТРОЧН Преобразует все буквы текста в строчные
LEN ДЛСТР Возвращает количество символов в текстовой строке
FIND НАЙТИ Поиск вхождения одного текстового значения в другое (с учетом регистра)
TRIM СЖПРОБЕЛЫ Удаляет из текста пробелы
Системные функции
ISERROR ЕСЛИОШИБКА Возвращает указанное значение, если вычисление по формуле вызывает ошибку; в противном случае функция возвращает результат формулы.
ISNUMBER ЕЧИСЛО Возвращает “True”, если содержимое ячейки-аргумента является числом.

Дополнительные функции.

Английская версия Русская версия Назначение
SUMIF СУММЕСЛИ Возвращает сумму значений в диапазоне, которые соответствуют указанным критериям
AVERAGEIF СРЗНАЧЕСЛИ Возвращает среднее арифметическое значение указанных аргументов, которые отвечают единому заданному критерию
COUNTIF СЧЁТЕСЛИ Возвращает количество ячеек в заданном диапазоне, которые отвечают единому заданному критерию
VLOOKUP ВПР Позволяет найти одни данные через другие. Например: в таблице-справочнике найти название товара по его номеру.

* Может быть изменено в будущих версиях

.

Функции для строки формул (заполняем ComboBox с именем cboFunctions)

VB

cboFunctions.Items.Add("SUM()")
cboFunctions.Items.Add("СУММ()")
cboFunctions.Items.Add("TODAY()")
cboFunctions.Items.Add("СЕГОДНЯ()")
C#

cboFunctions.Items.Add("SUM()");
cboFunctions.Items.Add("СУММ()");
cboFunctions.Items.Add("TODAY()");
cboFunctions.Items.Add("СЕГОДНЯ()");

Ссылки на ячейки (References of Cell)

Как и Microsoft Excel, ReoGrid поддерживает ссылки на ячейку и диапазон.

VB

'Пример формулы со ссылками на ячейки (A1, B1) и диапазон (A1:C3)
rgrid.CurrentWorksheet("H8") = "=A1+B1-SUM(A1:C3)+AVERAGE(D1:H5)"

'Получение списка ссылок из ячейки
Dim rangeList = rgrid.CurrentWorksheet.GetCellFormulaReferenceRanges("H8")
C#

//Пример формулы со ссылками на ячейки (A1, B1) и диапазон (A1:C3)
rgrid.CurrentWorksheet["H8"] = "=A1+B1-SUM(A1:C3)+AVERAGE(D1:H5)";

//Получение списка ссылок из ячейки
var rangeList = rgrid.CurrentWorksheet.GetCellFormulaReferenceRanges("H8");

Трассировка прецедентов (Trace Precedents)

Для включения трассировки, необходимо установить для параметра ячейки TraceFormulaPrecedent значение True

При изменении формулы трассирующие стрелки исчезнут.

VB

rgrid.CurrentWorksheet("C2") = 10
rgrid.CurrentWorksheet("C3") = 5
Dim cell As Cell = rgrid.CurrentWorksheet.Cells("C5")
cell.Formula = "=C2+C3"
cell.TraceFormulaPrecedents = True

'или путём вызова TraceCellPrecedents:
rgrid.CurrentWorksheet.TraceCellPrecedents("C5")

'Следующий код позволит постоянно отображать трассирующие стрелки
'Добавляем обработчик события
'AddHandler rgrid.CellDataChanged, AddressOf rgrid_CellDataChanged
'Sub rgrid_CellDataChanged(ByVal sender As Object, ByVal e As unvell.ReoGrid.Events.CellEventArgs)
'e.Cell.TraceFormulaPrecedents = True
'End Sub
C#

rgrid.CurrentWorksheet["C2"] = 10;
rgrid.CurrentWorksheet["C3"] = 5;
Cell cell = rgrid.CurrentWorksheet.Cells["C5"];
cell.Formula = "=C2+C3";
cell.TraceFormulaPrecedents = true;

//или путём вызова TraceCellPrecedents:
rgrid.CurrentWorksheet.TraceCellPrecedents("C5");

//Следующий код позволит постоянно отображать трассирующие стрелки
//rgrid.CellDataChanged += (s, e) => e.Cell.TraceFormulaPrecedents = true;

Трассировка зависимостей (Trace Dependents)

Определение именованного диапазона, установка значений именованного диапазона и применение формулы суммирования к именованному диапазону

VB

Dim namedRange As NamedRange = rgrid.CurrentWorksheet.DefineNamedRange("items", "B2:E2")
namedRange.Data = New Object() {1, 3, 5, 7}
rgrid.CurrentWorksheet("F2") = "=SUM(items)"
C#

NamedRange namedRange = rgrid.CurrentWorksheet.DefineNamedRange("items", "B2:E2");
namedRange.Data = new object[] {1,3,5,7}; 
rgrid.CurrentWorksheet["F2"] = "=SUM(items)";

Переносим выбранную функцию из списка в текстовое поле формулы. Для этого используем обработчик события SelectedIndexChanged для раскрывающегося списка cboFunctions

VB

txtFormula.Text &= cboFunctions.Text
C#

txtFormula.Text += cboFunctions.Text;

Перенос формулы в выбранную ячейку. Используется обработчик события KeyDown для текстового поля форулы txtFormula

Изменение формулы в текстовом поле (обработка события txtFormula_KeyDown)

VB

Try
    If e.KeyCode = Keys.Enter Then
rgrid.CurrentWorksheet.Cells(rgrid.CurrentWorksheet.FocusPos).Formula = txtFormula.Text
    End If
Catch ex As Exception
    MsgBox(ex.Message)
End Try
C#

if (e.KeyCode == Keys.Enter) {
	rgrid.CurrentWorksheet.Cells[rgrid.CurrentWorksheet.FocusPos].Formula = txtFormula.Text;
}

Получение текста формулы из выбранной пользователем ячейки. Для этого используется обработчик события FocusPosChanged компонента ReoGrid.

VB

'Получаем значение поля Formula
Dim strFormula As String = rgrid.CurrentWorksheet.Cells(rgrid.CurrentWorksheet.FocusPos).Formula

'Если поле не пустое - заносим его значение в строку формул, в поле списка функций заносим основные данные из ячейки
If Len(strFormula) >= 0 Then
    txtFormula.Text = strFormula
    cboFunctions.Text = rgrid.CurrentWorksheet.Cells(rgrid.CurrentWorksheet.FocusPos).DisplayText
End If
C#

//Получаем значение поля Formula
{
string strFormula = rgrid.CurrentWorksheet.Cells[rgrid.CurrentWorksheet.FocusPos].Formula;

//Если поле не пустое - заносим его значение в строку формул, в поле списка функций заносим основные данные из ячейки
if (strFormula.Length >= 0) {
txtFormula.Text = strFormula;
cboFunctions.Text = rgrid.CurrentWorksheet.Cells[rgrid.CurrentWorksheet.FocusPos].DisplayText;
}}

Раздел “Файл” – функции, обычно доступные в меню “Файл”

Сброс таблицы или листа (“Новый документ”). Очистка листа или книги

Если применить метод Reset к книге, то из неё удаляются все листы, после чего создаётся один пустой. Если же применить метод к листу – лист просто очистится от данных.

VB

rgrid.Reset()
rgrid.CurrentWorksheet.Reset()
C#

rgrid.Reset();
rgrid.CurrentWorksheet.Reset();

Загрузка данных

Загрузка данных выполняется при помощи перегруженной функции Load (для всей книги) или по одному листу с использованием функций LoadCSV, LoadRGF, которые вполне могут исчезнуть в следующих версиях.

Первым её параметром может быть имя файла или файловый поток ввода-вывода

Второй параметр – формат открываемого файла из перечисления IO.FileFormat (CSV, Excel2007, ReoGridFormat, _Auto – автовыбор, _Custom – ещё не реализован)

Третий и необязательный параметр – кодировка символов. Его использование требует импортировать пространство имён System.Text

VB

'Загрузка данных из файла формата ReoGridFormat с использованием файлового потока
Using ss As FileStream = New FileStream(Application.StartupPath & "\test.rgf", FileMode.Create, FileAccess.Read)
    rgrid.Load(ss, IO.FileFormat.ReoGridFormat, Encoding.UTF8)
End Using

'Загрузка данных из файлов поддерживаемых форматов
'Вариант с функцией Load (книга целиком)
rgrid.Load(Application.StartupPath & "\test.csv", IO.FileFormat.CSV, Encoding.UTF8) 'CSV
rgrid.Load(Application.StartupPath & "\test.rgf", IO.FileFormat.ReoGridFormat, Encoding.UTF8) 'ReoGridFormat
rgrid.Load(Application.StartupPath & "\test.xlsx", IO.FileFormat.Excel2007, Encoding.UTF8) 'Excel 2007/2010

'Вариант с функцией LoadCSV (только один лист)
rgrid.CurrentWorksheet.LoadCSV(Application.StartupPath & "\test.csv", Encoding.UTF8)
C#

//Загрузка данных из файла формата ReoGridFormat с использованием файлового потока
using (FileStream ss = new FileStream(Application.StartupPath + "\\test.rgf", FileMode.Create, FileAccess.Read)) {
  rgrid.Load(ss, unvell.ReoGrid.IO.FileFormat.ReoGridFormat, Encoding.UTF8);
}	

//Загрузка данных из файлов поддерживаемых форматов
//Вариант с функцией Load (книга целиком)
rgrid.Load(Application.StartupPath + "\\test.csv", unvell.ReoGrid.IO.FileFormat.CSV, Encoding.UTF8);//CSV
rgrid.Load(Application.StartupPath + "\\test.rgf", unvell.ReoGrid.IO.FileFormat.ReoGridFormat, Encoding.UTF8);//ReoGridFormat
rgrid.Load(Application.StartupPath + "\\test.xlsx", unvell.ReoGrid.IO.FileFormat.Excel2007, Encoding.UTF8);//Excel 2007/2010

//Вариант с функцией LoadCSV (только один лист)
rgrid.CurrentWorksheet.LoadCSV(Application.StartupPath + "\\test.csv", Encoding.UTF8);

Сохранение данных

Сохранение данных выполняется при помощи перегруженной функции Save. Её параметры аналогичны функции Load

Первым её параметром может быть имя файла или файловый поток ввода-вывода

Второй параметр – формат открываемого файла из перечисления IO.FileFormat (CSV, Excel2007, ReoGridFormat, _Auto – автовыбор, _Custom – ещё не реализован)

Третий и необязательный параметр – кодировка символов. Его использование требует импортировать пространство имён System.Text

Экспорт в формат HTML выполняется только через файловый поток и только для одного листа. Возможны два варианта: с заголовком (title) по умолчанию или же с произвольным заголовком

VB

'Сохранение данных в файл формата ReoGridFormat с использованием файлового потока
Using ss As FileStream = New FileStream(Application.StartupPath & "\test.rgf", FileMode.Create, FileAccess.Write)
    rgrid.Save(ss, IO.FileFormat.ReoGridFormat, Encoding.UTF8)
End Using

'Сохранение с использованием методов
rgrid.CurrentWorksheet.ExportAsCSV(Application.StartupPath & "\test.csv", , Encoding.UTF8) 'CSV
rgrid.Save(Application.StartupPath & "\test.rgf", IO.FileFormat.ReoGridFormat, Encoding.UTF8) 'ReoGridFormat
rgrid.Save(Application.StartupPath & "\test.xlsx", IO.FileFormat.Excel2007, Encoding.UTF8) 'Excel 2007/2010

'HTML
Using ss As FileStream = New FileStream(Application.StartupPath & "\test.html", FileMode.Create, FileAccess.Write)
    rgrid.CurrentWorksheet.ExportAsHTML(ss) 'Заголовок по умолчанию
    rgrid.CurrentWorksheet.ExportAsHTML(ss, "Произвольный заголовок") 'Произвольный заголовок
End Using
C#

//Сохранение данных в файл формата ReoGridFormat с использованием файлового потока
using (FileStream ss = new FileStream(Application.StartupPath + "\\test.rgf", FileMode.Create, FileAccess.Write)) {
rgrid.Save(ss, unvell.ReoGrid.IO.FileFormat.ReoGridFormat, Encoding.UTF8);
}	

//Сохранение с использованием методов
rgrid.CurrentWorksheet.ExportAsCSV(Application.StartupPath + "\\test.csv", string.Empty, Encoding.UTF8); //CSV
rgrid.Save(Application.StartupPath + "\\test.rgf", unvell.ReoGrid.IO.FileFormat.ReoGridFormat, Encoding.UTF8); //ReoGridFormat
rgrid.Save(Application.StartupPath + "\\test.xlsx", unvell.ReoGrid.IO.FileFormat.Excel2007, Encoding.UTF8); //Excel 2007/2010

//HTML
using (FileStream ss = new FileStream(Application.StartupPath + "\\test.html", FileMode.Create, FileAccess.Write)) {
  rgrid.CurrentWorksheet.ExportAsHTML(ss); //Заголовок по умолчанию
  rgrid.CurrentWorksheet.ExportAsHTML(ss, "Произвольный заголовок"); //Произвольный заголовок
}

Печать (Paging and Printing)

Авторазбивка на страницы (Auto Paging)

При выводе таблицы на печать, её содержимое автоматически разделяется между страницами.

Разбивка на страницы

Как и в Excel, ReoGrid определяет, сколько ячеек можно разместить на каждой странице. Если все ячейки не помещаются на данной странице, то остаток переносится на следующую страницу.

Печатаемый диапазон

Отображение линий разрывов страниц на экране

Автопроверка диапазона печати

Если диапазон печати неопределён, то ReoGrid попытается найти максимум ячеек, заполненных данными и установит диапазон печати автоматически.

Изменение диапазона печати

Для изменения диапазона печати листа используется свойство PrintableRange

Если размер диапазона печати превышает размер страницы, то он будет разбит автоматически. Ячейки за пределами диапазона печати не будут распечатаны.

Печать линий сетки таблицы

За это отвечает свойство ShowGridLines

Изменение порядка следования страниц

Изменение параметров страницы

Для этого используется свойство PageSettings

Теперь максимум данных из ячейки ‘A’ могут быть распечатаны в альбомной ориентации бумаги

Вставка разрывов страниц

Для их вставки предназначены свойства RowPageBreaks и ColumnPageBreaks.

Обновление разбивки страницы выполняется уже знакомым методом AutoSplitPage.

Пример того, как таблица разбивается на две страницы:

Системные и пользовательские разрывы страниц

Существует два вида разрывов страниц: обозначаемые пунктирной линией системные, получаемые при помощи метода AutoSplitPage, а также обозначаемые сплошной линиейпользовательские, вставляемые или перетаскиваемые мышью пользователем вручную.

Изменение разрывов страниц

Для изменения/перемещения индексов системных разрывов страниц используются следующие методы ChangeColumnPageBreak и ChangeRowPageBreak

После изменения системных индексов на пользовательские, пунктирная линия сменится сплошной.

Повторения страниц (Iterate pages)

Для повторения всех печатаемых страниц используется метод IteratePrintPage, возвращающий диапазон печати для каждой страницы.

Пример результата вывода на принтер (см. пример ниже):

Диапазон печати: A1:E11
Диапазон печати: F1:K11

По-возможности, повторение страниц (iterate pages) определяется порядком (синтаксис C#):

rgrid.CurrentWorksheet.IteratePrintPages(PrintPageOrder.OverThenDown, range => { ... });
Если порядок следования страниц не будет указан, то будет использоваться порядок печати.

Отключение возможности изменения/подстройки разрывов страниц пользователем

Для этого используется параметр настройки WorksheetSettings.Behavior_AllowUserChangingPageBreaks

Основные действия показаны в следующих блоках кода:

VB

'Авторазбивка на страницы
rgrid.CurrentWorksheet.AutoSplitPage()

'Отображение линий разрывов страниц на экране
rgrid.CurrentWorksheet.EnableSettings(WorksheetSettings.View_ShowPageBreaks)

'Изменение диапазона печати    
rgrid.CurrentWorksheet.PrintableRange = New RangePosition(1, 1, 9, 9)

'Изменение порядка следования страниц
rgrid.CurrentWorksheet.PrintSettings.PageOrder = PrintPageOrder.DownThenOver

'Печать линий сетки таблицы
rgrid.CurrentWorksheet.PrintSettings.ShowGridLines = True

'Изменение параметров страницы
'Для этого используется свойство PageSettings
'rgrid.CurrentWorksheet.PageSettings.Landscape = True
'rgrid.CurrentWorksheet.PrintSettings.Landscape = True

'Вставка разрывов страниц
'rgrid.CurrentWorksheet.RowPageBreaks.Add(5)
'rgrid.CurrentWorksheet.ColumnPageBreaks.Add(5)

'Обновление разбивки страницы
rgrid.CurrentWorksheet.AutoSplitPage()

'Изменение разрывов страниц
rgrid.CurrentWorksheet.ChangeColumnPageBreak(0, 1) 'Старый индекс, Новый индекс
rgrid.CurrentWorksheet.ChangeRowPageBreak(0, 1) ' Старый индекс, Новый индекс

'Повторения страниц (Iterate pages)
rgrid.CurrentWorksheet.IteratePrintPages(Function(range)
     Console.WriteLine("Диапазон печати: " + range.ToAddress())
     Return True
 End Function)

'Отключение возможности изменения/подстройки разрывов страниц пользователем
rgrid.CurrentWorksheet.DisableSettings(WorksheetSettings.Behavior_AllowUserChangingPageBreaks)
C#

//Авторазбивка на страницы
rgrid.CurrentWorksheet.AutoSplitPage();

//Отображение линий разрывов страниц на экране
rgrid.CurrentWorksheet.EnableSettings(WorksheetSettings.View_ShowPageBreaks);

//Изменение диапазона печати
rgrid.CurrentWorksheet.PrintableRange = new RangePosition(1, 1, 9, 9);

//Изменение порядка следования страниц
rgrid.CurrentWorksheet.PrintSettings.PageOrder = PrintPageOrder.DownThenOver;

//Печать линий сетки таблицы
rgrid.CurrentWorksheet.PrintSettings.ShowGridLines = true;

//Изменение параметров страницы
//Для этого используется свойство PageSettings
//rgrid.CurrentWorksheet.PageSettings.Landscape = true;
//rgrid.CurrentWorksheet.PrintSettings.Landscape = true;

//Вставка разрывов страниц
//rgrid.CurrentWorksheet.RowPageBreaks.Add(5);
//rgrid.CurrentWorksheet.ColumnPageBreaks.Add(5);

//Обновление разбивки страницы
rgrid.CurrentWorksheet.AutoSplitPage();

//Изменение разрывов страниц
rgrid.CurrentWorksheet.ChangeColumnPageBreak(0, 1);//Старый индекс, Новый индекс
rgrid.CurrentWorksheet.ChangeRowPageBreak(0, 1);//Старый индекс, Новый индекс

//Повторения страниц (Iterate pages)
rgrid.CurrentWorksheet.IteratePrintPages(range =>
{
Console.WriteLine("Диапазон печати: " + range.ToAddress());
return true;
});

//Отключение возможности изменения/подстройки разрывов страниц пользователем
rgrid.CurrentWorksheet.DisableSettings(WorksheetSettings.Behavior_AllowUserChangingPageBreaks);

Сессии печати (Print Session) и предварительный просмотр

Представляют собой сессии для вывода на печать определённых листов или целой книги.

VB

'Вывод на печать содержимого одного листа с настройками по умолчанию
Dim session = rgrid.CurrentWorksheet.CreatePrintSession()
session.Print()

'Вывод на печать содержимого книги (всех листов). Доступно только в Pro-издании
Dim session1 = rgrid.CreatePrintSession()
session1.Print()

'Вывод на печать определённых листов. Доступно только в Pro-издании
Dim session2 = rgrid.CreatePrintSession()
session2.Worksheets.Clear()
session2.Worksheets.Add(rgrid.Worksheets("Sheet1"))
session2.Worksheets.Add(rgrid.Worksheets("Sheet3"))
session2.Print()

'Предварительный просмотр (Print Preview). Отображение диалогового окна
Dim sheet = rgrid.CurrentWorksheet
Using session3 = sheet.CreatePrintSession()
    Using ppd As New PrintPreviewDialog()
ppd.Document = session3.PrintDocument
ppd.SetBounds(200, 200, 1024, 768)
ppd.PrintPreviewControl.Zoom = 1.0
ppd.ShowDialog(Me)
    End Using
End Using
C#

//Вывод на печать содержимого одного листа с настройками по умолчанию
var session = rgrid.CurrentWorksheet.CreatePrintSession();
session.Print();

//Вывод на печать содержимого книги (всех листов). Доступно только в Pro-издании
var session1 = rgrid.CreatePrintSession();
session1.Print();

//Вывод на печать определённых листов. Доступно только в Pro-издании
var session2 = rgrid.CreatePrintSession();
session2.Worksheets.Clear();
session2.Worksheets.Add(rgrid.Worksheets["Sheet1"]);
session2.Worksheets.Add(rgrid.Worksheets["Sheet3"]);
session2.Print();

//Предварительный просмотр (Print Preview). Отображение диалогового окна
var sheet = rgrid.CurrentWorksheet;

using (var session3 = sheet.CreatePrintSession())
{
  using (PrintPreviewDialog ppd = new PrintPreviewDialog())
  {
ppd.Document = session3.PrintDocument;
ppd.SetBounds(200, 200, 1024, 768);
ppd.PrintPreviewControl.Zoom = 1d;
ppd.ShowDialog(this);
  }
}

Отображение системного диалогового окна настройки параметров страницы

  1. Создаём экземпляр диалогового окна
  2. Импортируем настройки из параметров листа
  3. Настраиваем параметры
  4. Как только пользователь выбрал нужные настройки и нажал экранную кнопку “ОК”, импортируем настройки обратно в параметры листа ReoGrid
VB

Using psd As PageSetupDialog = New PageSetupDialog()
    psd.PageSettings = rgrid.CurrentWorksheet.PrintSettings.CreateSystemPageSettings()

    psd.AllowMargins = True
    psd.AllowPrinter = True
    psd.AllowPaper = True
    psd.EnableMetric = True

    If psd.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
rgrid.CurrentWorksheet.PrintSettings.ApplySystemPageSettings(psd.PageSettings)
    End If
End Using
C#

using (PageSetupDialog psd = new PageSetupDialog())
{
psd.PageSettings = rgrid.CurrentWorksheet.PrintSettings.CreateSystemPageSettings();

  psd.AllowMargins = true;
  psd.AllowPrinter = true;
  psd.AllowPaper = true;
  psd.EnableMetric = true;

  if (psd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
  rgrid.CurrentWorksheet.PrintSettings.ApplySystemPageSettings(psd.PageSettings);
  }
}

Вариант вызова диалога предварительного просмотра

VB

'Создаём документ для печати
Dim docp As System.Drawing.Printing.PrintDocument = Nothing

'Показываем диалоговое окно предварительного просмотра
Using ppd As PrintPreviewDialog = New PrintPreviewDialog()
    ppd.Document = docp
    ppd.SetBounds(200, 200, 1024, 768)
    ppd.PrintPreviewControl.Zoom = 0.5D '1D
    ppd.PrintPreviewControl.Columns = 2
    ppd.PrintPreviewControl.Rows = 2
    ppd.ShowDialog(Me)
End Using
C#

//Создаём документ для печати
System.Drawing.Printing.PrintDocument docp = null;//rgrid.CurrentWorksheet.CreatePrintSession();

//Показываем диалоговое окно предварительного просмотра
  using (PrintPreviewDialog ppd = new PrintPreviewDialog()) {
	ppd.Document = docp;
	ppd.SetBounds(200, 200, 1024, 768);
	ppd.PrintPreviewControl.Zoom = 0.5D;//1D
	ppd.PrintPreviewControl.Columns = 2;
	ppd.PrintPreviewControl.Rows = 2;
	ppd.ShowDialog(this);
  }

Вывод содержимого листа на печать с использованием стандартного диалогового окна печати

VB

Dim doc As System.Drawing.Printing.PrintDocument = Nothing
Try
    doc = rgrid.CurrentWorksheet.CreatePrintSession().PrintDocument

Catch ex As Exception
    MessageBox.Show(Me, ex.Message, Me.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information)
    Return
End Try

Using pd = New System.Windows.Forms.PrintDialog()
    pd.Document = doc
    pd.UseEXDialog = True 'в 64-битной Windows

    If pd.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
doc.PrinterSettings = pd.PrinterSettings
doc.Print()
    End If
End Using

If doc Is Nothing = False Then doc.Dispose()
C#

System.Drawing.Printing.PrintDocument doc = null;

try {
  doc = rgrid.CurrentWorksheet.CreatePrintSession().PrintDocument;
}
catch (Exception ex)
{
  MessageBox.Show(this, ex.Message, this.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  return;
}

using (var pd = new System.Windows.Forms.PrintDialog())
{
  pd.Document = doc;
  pd.UseEXDialog = true;  // в 64-битной Windows

  if (pd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
doc.PrinterSettings = pd.PrinterSettings;
doc.Print();
  }
}

if (doc != null) doc.Dispose();

Сброс разрывов страниц

VB

Try
    rgrid.CurrentWorksheet.ResetAllPageBreaks()
Catch ex As Exception
    MsgBox(ex.Message)
End Try
C#

try {
rgrid.CurrentWorksheet.ResetAllPageBreaks();
} catch (Exception ex) {
 MessageBox.Show(ex.Message);
  }

Раздел “Правка” – функции, обычно доступные в меню “Правка”

Отмена последнего действия, возврат отменённого действия и повтор последнего. Выполняются только если это возможно

VB

If rgrid.CanUndo = True Then rgrid.Undo()
If rgrid.CanRedo = True Then rgrid.Redo()
rgrid.RepeatLastAction(rgrid.CurrentWorksheet.SelectionRange)
C#

if (rgrid.CanUndo() == true) rgrid.Undo();
if (rgrid.CanRedo() == true) rgrid.Redo();
rgrid.RepeatLastAction(rgrid.CurrentWorksheet.SelectionRange);

Буфер обмена (Clipboard) и “Выделить все”

Небольшое отступление. О реализации работы с буфером обмена.

При копировании содержимого нескольких ячеек, например, девяти, в буфер обмена заносится текст в следующем формате: ячейки одной строки разделяются символом табуляции, строки разделяются символом перевода строки:

A1 \t B1 \t C1 \n
A2 \t B2 \t C2 \n
A3 \t B3 \t C3 \n

Примечание. Для перехвата системных горячих клавиш введены события с префиксом Before: BeforeCut, BeforeCopy, BeforePaste. Также могут понадобиться события с префиксом After: AfterCut, AfterCopy, AfterPaste

Для выделения всех ячеек используется метод SelectAll

VB

'Вырезать (Cut), Копировать (Copy). Проверяем возможность и выполняем процедуру
If rgrid.CurrentWorksheet.CanCut = True Then rgrid.CurrentWorksheet.Cut()
If rgrid.CurrentWorksheet.CanCopy = True Then rgrid.CurrentWorksheet.Copy()
If rgrid.CurrentWorksheet.CanPaste = True Then rgrid.CurrentWorksheet.Paste()

'Если нужно контролировать процесс получения данных из буфера обмена
'Создание переменной и получение данных
'Преобразование в массив типа Объект
'Перенос данных в таблицу
Dim text As String = Clipboard.GetText()
Dim data(,) As Object = RGUtility.ParseTabbedString(text)
rgrid.CurrentWorksheet.SetRangeData(rgrid.CurrentWorksheet.SelectionRange, data)

'Выделить все
rgrid.CurrentWorksheet.SelectAll()
C#

//Вырезать (Cut), Копировать (Copy). Проверяем возможность и выполняем процедуру
if (rgrid.CurrentWorksheet.CanCut() == true) rgrid.CurrentWorksheet.Cut();
if (rgrid.CurrentWorksheet.CanCopy() == true) rgrid.CurrentWorksheet.Copy();
if (rgrid.CurrentWorksheet.CanPaste() == true) rgrid.CurrentWorksheet.Paste();

//Если нужно контролировать процесс получения данных из буфера обмена
//Создание переменной и получение данных
//Преобразование в массив типа Объект
//Перенос данных в таблицу
string text = Clipboard.GetText();
object[,] data = RGUtility.ParseTabbedString(text);
rgrid.CurrentWorksheet.SetRangeData(rgrid.CurrentWorksheet.SelectionRange, data);

//Выделить все
rgrid.CurrentWorksheet.SelectAll();

Для событий BeforeCut, BeforeCopy, BeforePaste можно выполнить перехват горячих клавиш и не допустить выполнение функции. Для этого в обработчик события достаточно добавить строку e.IsCancelled = True (VB), e.IsCancelled == true (C#).

Раздел “Вид” – функции, обычно доступные в меню “Вид” (View)

  1. Стиль выделения (Selection Style). Определяет внешний вид активной ячейки.
  2. Режим выделения (Selection Mode). Определяет активный элемент (по умолчанию – диапазон).
  3. Направление перехода (Direction). Определяет направление перехода фокуса после окончания правки ячейки.
VB

'Стиль выделения
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.None 'Отсутствует
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.Default 'По умолчанию
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.FocusRect 'Фокус Windows

'Режим выделения
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.None 'Отсутствует
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Cell 'Одна ячейка
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Range 'Диапазон ячеек
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Row 'Строка
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Column 'Столбец

'Направление перехода
rgrid.CurrentWorksheet.SelectionForwardDirection = SelectionForwardDirection.Right 'Вправо
rgrid.CurrentWorksheet.SelectionForwardDirection = SelectionForwardDirection.Down 'Вниз
C#

//Стиль выделения
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.None;
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.Default;
rgrid.CurrentWorksheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.FocusRect;

//Режим выделения
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.None;
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Cell;
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Range;
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Row;
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Column;

//Направление перехода
rgrid.CurrentWorksheet.SelectionForwardDirection = SelectionForwardDirection.Right;
rgrid.CurrentWorksheet.SelectionForwardDirection = SelectionForwardDirection.Down;

Фиксация ячеек (Freezing)

Если позиция имеет значения 0,0, то на данный момент зафиксированные строки или столбцы отсутствуют

Если зафиксированная область больше максимальной области отображения элемента управления, то активная область станет невидимой

VB

'Получаем позицию заморозки/закрепления
Dim pos As CellPosition = rgrid.CurrentWorksheet.FreezePos()

'Проверяем - зафиксирован ли данный лист:
Dim isFrozen As Boolean = rgrid.CurrentWorksheet.IsFrozen()

'Фиксируем до указанной позиции (вводим третий аргумент, указывающий точку фиксации)
rgrid.CurrentWorksheet.FreezeToCell(5, 0) 'Обычная фиксация (указана только позиция)
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Left) 'С привязкой по левому краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Right) 'С привязкой по правому краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Top) 'С привязкой по верхнему краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Bottom) 'С привязкой по нижнему краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.LeftTop) 'С привязкой по левому и верхнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.LeftBottom) 'С привязкой по левому и нижнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.RightTop) 'С привязкой по правому и верхнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.RightBottom) 'С привязкой по правому и нижнему краям

'Отмена фиксации
rgrid.CurrentWorksheet.Unfreeze()
C#

//Получаем позицию заморозки/закрепления
CellPosition pos = rgrid.CurrentWorksheet.FreezePos;

//Проверяем - зафиксирован ли данный лист:
bool isFrozen = rgrid.CurrentWorksheet.IsFrozen;

//Фиксируем до указанной позиции (вводим третий аргумент, указывающий точку фиксации)
rgrid.CurrentWorksheet.FreezeToCell(5, 0);//Обычная фиксация (указана только позиция)
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Left);//С привязкой по левому краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Right);//С привязкой по правому краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Top);//С привязкой по верхнему краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.Bottom);//С привязкой по нижнему краю
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.LeftTop);//С привязкой по левому и верхнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.LeftBottom);//С привязкой по левому и нижнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.RightTop);//С привязкой по правому и верхнему краям
rgrid.CurrentWorksheet.FreezeToCell(1, 1, FreezeArea.RightBottom);//С привязкой по правому и нижнему краям

//Отмена фиксации
rgrid.CurrentWorksheet.Unfreeze();

Изменение размеров таблицы (Resize)

На данный момент лист ReoGrid максимально может содержать 1048576 строк и 32768 столбцов

VB

'Получаем количество строк и столбцов
Dim intRows As Integer = rgrid.CurrentWorksheet.RowCount 'Количество строк
Dim intCols As Integer = rgrid.CurrentWorksheet.ColumnCount 'Количество столбцов

'Задаём размер таблицы используя указанные выше переменные
rgrid.CurrentWorksheet.Resize(intRows, intCols)

'Или максимальное количество ячеек
rgrid.CurrentWorksheet.Resize(1048576, 32768)
C#

//Получаем количество строк и столбцов
int intRows = rgrid.CurrentWorksheet.RowCount;
int intCols = rgrid.CurrentWorksheet.ColumnCount;

//Задаём размер таблицы используя указанные выше переменные
rgrid.CurrentWorksheet.Resize(intRows, intCols);

//Или максимальное количество ячеек
rgrid.CurrentWorksheet.Resize(1048576, 32768);

Стили

Понятие “Стиль ячейки” подразумевает набор правил, который можно задать и изменить в процессе работы разрабатываемого приложения (программы). Сюда можно отнести основные параметры шрифтов, цвета текста и фона, выравнивание внутри ячейки. Полный список параметров приведён ниже.

Компоненты стиля

Компонент

Значение PlainStyleFlag

Название свойства Тип свойства
Цвет фона BackColor BackColor Color или SolidColor
Шаблон стиля фона FillPatternStyle FillPatternStyle HatchStyles
Цвет шаблона фона FillPatternColor FillPatternColor Color или SolidColor
Цвет текста TextColor TextColor Color или SolidColor
Название шрифта FontName FontName string
Размер (кегль) шрифта FontSize FontSize float (Single) для Windows Form; double для WPF
Стиль шрифта: полужирный FontStyleBold Bold bool (Boolean)
Стиль шрифта: наклонный (курсив) FontStyleItalic Italic bool (Boolean)
Стиль шрифта: подчёркнутый FontStyleUnderline Underline bool (Boolean)
Стиль шрифта: зачёркнутый FontStyleStrikethrough Strikethrough bool (Boolean)
Горизонтальное выравнивание HorizontalAlign HAlign ReoGridHorAlign
Вертикальное выравнивание VerticalAlign VAlign ReoGridVerAlign
Абзацный отступ Indent Indent ushort
Перенос по словам TextWrap TextWrapMode TextWrapMode
Угол поворота RotateAngle RotateAngle int (Integer). Значения: -90°~90°
Отступы от краёв ячейки Padding Padding PaddingValue

Установка стиля

Существует 4 способа установки стиля:

  • использование методов листа (SetRangeStyles);
  • использование свойств экземпляра ячейки или диапазона;
  • использование Действий;
  • использование исполняемого сценария (ReoScript).

При использовании методов листа, необходимо:

  • создать экземпляр объекта WorksheetRangeStyle;
  • указать необходимые флаги PlainStyleFlag;
  • указать необходимые значения стиля;
  • применить стиль к диапазону ячеек.

Значение свойства Flag задаётся только 1 раз для каждого стиля. Для объединения флагов служит оператор “ИЛИ”, написание которого зависит от конкретного языка программирования.

rgrid.CurrentWorksheet.SetRangeStyles(Диапазон типа RangePosition, Стиль типа RangePositionStyle)

Шрифт

Можно выбрать его название (семейство) и размер (кегль).

Выравнивание

Текст можно выравнивать по горизонтали и вертикали. Задаётся при помощи свойств MyStyleFont.HAlign и MyStyleFont.VAlign.

Если необходимо в одном экземпляре стиля задать как вертикальное, так и горизонтальное выравнивание текста, то будет полезен флаг PlainStyleFlag.AlignAll, аналогичный объединению флагов PlainStyleFlag.HorizontalAlign и PlainStyleFlag.VerticalAlign

Заливка фона

Фон ячейки может быть как залит определённым цветом, так и текстурой (по шаблону). Ниже приведены примеры настройки границ и заливки фона

Пример изменения всех основных параметров стиля, включая: параметры шрифта, выравнивание, цвета текста и фона

VB

'Шаг 1. Создание экземпляра стиля
Dim MyStyle As New WorksheetRangeStyle

'Шаг 2. Задание нужных флагов
MyStyle.Flag = PlainStyleFlag.FontName Or PlainStyleFlag.FontSize Or
    PlainStyleFlag.TextColor Or
    PlainStyleFlag.FontStyleBold Or PlainStyleFlag.FontStyleItalic Or PlainStyleFlag.FontStyleUnderline Or PlainStyleFlag.FontStyleStrikethrough Or PlainStyleFlag.RotateAngle Or
    PlainStyleFlag.TextWrap Or
    PlainStyleFlag.HorizontalAlign Or PlainStyleFlag.VerticalAlign Or
    PlainStyleFlag.BackColor Or PlainStyleFlag.FillPattern

'Шаг 3. Изменение заданных флагами параметров
'Шрифты
MyStyle.FontName = cboFontName.Text
MyStyle.FontSize = Convert.ToInt16(Val(cboFontSize.Text))

MyStyle.FontSize = MyStyle.FontSize + 1 '+ 1 пт
cboFontSize.Text = Convert.ToString(MyStyle.FontSize)

MyStyle.RotateAngle = 45 'Поворот текста на 45 градусов

'Изменяем цвет шрифта
MyStyle.TextColor = Color.Red 'Красный

'Начертание шрифта
MyStyle.Bold = chkFontBold.Checked 'Полужирный
MyStyle.Italic = chkFontItalic.Checked 'Курсив (наклонный)
MyStyle.Underline = chkFontUnderline.Checked 'Подчёркнутый
MyStyle.Strikethrough = chkFontStrike.Checked 'Зачёркнутый

'Перенос текста (по умолчанию - без переноса, - no-wrap)
If chkTextWrap.Checked = True Then MyStyle.TextWrapMode = TextWrapMode.WordBreak Else MyStyle.TextWrapMode = TextWrapMode.NoWrap

'Горизонтальное выравнивание
MyStyle.HAlign = ReoGridHorAlign.Left 'По левому краю
MyStyle.HAlign = ReoGridHorAlign.Center 'По центру
MyStyle.HAlign = ReoGridHorAlign.Right 'По правому краю
MyStyle.HAlign = ReoGridHorAlign.DistributedIndent 'С распределённым отступом

'Вертикальное выравнивание
MyStyle.VAlign = ReoGridVerAlign.Top 'По верхней стороне
MyStyle.VAlign = ReoGridVerAlign.Middle 'Посередине
MyStyle.VAlign = ReoGridVerAlign.Bottom 'По нижней стороне

'Задание фона ячейки
MyStyle.BackColor = Color.Empty 'Очищаем ячейки
MyStyle.BackColor = unvell.ReoGrid.Graphics.SolidColor.Yellow 'Жёлтый цвет

'Фон на основе шаблона
MyStyle.FillPatternColor = Color.SkyBlue 'Цвет узора
MyStyle.FillPatternStyle = unvell.ReoGrid.Graphics.HatchStyles.DiagonalBrick 'Стиль узора

'Шаг 4. Применение стиля к выбранному диапазону
rgrid.CurrentWorksheet.SetRangeStyles(rgrid.CurrentWorksheet.SelectionRange, MyStyle)
C#

//Шаг 1. Создание экземпляра стиля
WorksheetRangeStyle MyStyle = new WorksheetRangeStyle();

//Шаг 2. Задание нужных флагов
MyStyle.Flag = PlainStyleFlag.FontName | PlainStyleFlag.FontSize |
PlainStyleFlag.TextColor |
PlainStyleFlag.FontStyleBold | PlainStyleFlag.FontStyleItalic | PlainStyleFlag.FontStyleUnderline | PlainStyleFlag.FontStyleStrikethrough | PlainStyleFlag.RotateAngle |
PlainStyleFlag.TextWrap |
PlainStyleFlag.HorizontalAlign | PlainStyleFlag.VerticalAlign |
PlainStyleFlag.BackColor | PlainStyleFlag.FillPattern;

//Шаг 3. Изменение заданных флагами параметров
//Шрифты
MyStyle.FontName = cboFontName.Text;
MyStyle.FontSize = int.Parse(cboFontSize.Text);

MyStyle.FontSize = MyStyle.FontSize + 1; //+ 1 пт
cboFontSize.Text = Convert.ToString(MyStyle.FontSize);

MyStyle.RotateAngle = 45; //Поворот текста на 45 градусов

//Изменяем цвет шрифта
MyStyle.TextColor = Color.Red; //Красный

//Начертание шрифта
MyStyle.Bold = chkFontBold.Checked; //Полужирный
MyStyle.Italic = chkFontItalic.Checked; //Курсив (наклонный)
MyStyle.Underline = chkFontUnderline.Checked; //Подчёркнутый
MyStyle.Strikethrough = chkFontStrike.Checked; //Зачёркнутый

//Перенос текста (по умолчанию - без переноса, - no-wrap)
if (chkTextWrap.Checked == true) { MyStyle.TextWrapMode = TextWrapMode.WordBreak;} else { MyStyle.TextWrapMode = TextWrapMode.NoWrap; };

//Горизонтальное выравнивание
MyStyle.HAlign = ReoGridHorAlign.Left; //По левому краю
MyStyle.HAlign = ReoGridHorAlign.Center; //По центру
MyStyle.HAlign = ReoGridHorAlign.Right; //По правому краю
MyStyle.HAlign = ReoGridHorAlign.DistributedIndent; //С распределённым отступом

//Вертикальное выравнивание
MyStyle.VAlign = ReoGridVerAlign.Top; //По верхней стороне
MyStyle.VAlign = ReoGridVerAlign.Middle; //Посередине
MyStyle.VAlign = ReoGridVerAlign.Bottom; //По нижней стороне

//Задание фона ячейки
MyStyle.BackColor = Color.Empty; //Очищаем ячейки
MyStyle.BackColor = unvell.ReoGrid.Graphics.SolidColor.Yellow; //Жёлтый цвет

//Фон на основе шаблона
MyStyle.FillPatternColor = Color.SkyBlue; //Цвет узора
MyStyle.FillPatternStyle = unvell.ReoGrid.Graphics.HatchStyles.DiagonalBrick; //Стиль узора

//Шаг 4. Применение стиля к выбранному диапазону
rgrid.CurrentWorksheet.SetRangeStyles(rgrid.CurrentWorksheet.SelectionRange, MyStyle);

Примечания

  1. Помимо основных флагов, существуют и дополнительные, необходимые для уменьшения количества задаваемых флагов:
    • All (все стили).
    • AlignAll (горизонтальное и вертикальное выравнивание).
    • BackAll (цвет и шаблон фона).
    • FontAll (имя, размер и стиль-начертание).
    • FontStyleAll (все стили-начертания шрифта).
    • LayoutAll (перенос по словам, отступы, поворот текста).
    • LineAll (цвет, стиль, толщина, наконечники). Пока не задействовано.
  2. Код подразумевает использование раскрывающихся списков cboFontName (имя шрифта), cboFontSize (размер шрифта), а также компоненты с двумя возможными состояниями (под chk понимается CheckBox). Для этого подходят и кнопки стандартного компонента Панелей инструментов.

Поворот текста в ячейке

Для поворота текста в ячейках служит свойство RotateAngle. Оно может принимать значения от -90 до 90. Обычное направление соответствует значению 0.

Если необходимо отобразить многострочный текст, то для этого следует установить для свойства TextWrap объекта стиля значение WordBreak.

Выравнивание текста задаётся всё теми же способами, что и для обычного текста.

Совместимость с Excel: настройки направления текста автоматически загружаются из файла Excel и выгружаются в него.

VB

'Однострочный текст
rgrid.CurrentWorksheet.Cells("A1").Data = "Привет, мир! (90)"
rgrid.CurrentWorksheet.Cells("A1").Style.RotateAngle = 90

rgrid.CurrentWorksheet.Cells("B1").Data = "Привет, мир! (0)"
rgrid.CurrentWorksheet.Cells("B1").Style.RotateAngle = 0

rgrid.CurrentWorksheet.Cells("C1").Data = "Привет, мир! (-90)"
rgrid.CurrentWorksheet.Cells("C1").Style.RotateAngle = -90

rgrid.CurrentWorksheet.Cells("D1").Data = "Привет, мир! (45)"
rgrid.CurrentWorksheet.Cells("D1").Style.RotateAngle = 45

'Многострочный текст
rgrid.CurrentWorksheet.Cells("A2").Data = "Табличный компонент" & vbNewLine & "для .Net"
rgrid.CurrentWorksheet.Cells("A2").Style.TextWrap = TextWrapMode.WordBreak
rgrid.CurrentWorksheet.Cells("A2").Style.RotateAngle = -45

'Выравнивание
rgrid.CurrentWorksheet.Cells("A3").Data = "Привет, мир!"
rgrid.CurrentWorksheet.Cells("A3").Style.HAlign = ReoGridHorAlign.Left
rgrid.CurrentWorksheet.Cells("A3").Style.RotateAngle = 90

rgrid.CurrentWorksheet.Cells("B3").Data = "Привет, мир!"
rgrid.CurrentWorksheet.Cells("B3").Style.HAlign = ReoGridHorAlign.Center
rgrid.CurrentWorksheet.Cells("B3").Style.RotateAngle = 90

rgrid.CurrentWorksheet.Cells("C3").Data = "Привет, мир!"
rgrid.CurrentWorksheet.Cells("C3").Style.HAlign = ReoGridHorAlign.Right
rgrid.CurrentWorksheet.Cells("C3").Style.RotateAngle = 90
C#

rgrid.CurrentWorksheet.Cells["A1"].Data = "Привет, мир! (90)";
rgrid.CurrentWorksheet.Cells["A1"].Style.RotateAngle = 90;

rgrid.CurrentWorksheet.Cells["B1"].Data = "Привет, мир! (0)";
rgrid.CurrentWorksheet.Cells["B1"].Style.RotateAngle = 0;

rgrid.CurrentWorksheet.Cells["C1"].Data = "Привет, мир! (-90)";
rgrid.CurrentWorksheet.Cells["C1"].Style.RotateAngle = -90;

rgrid.CurrentWorksheet.Cells["D1"].Data = "Привет, мир! (45)";
rgrid.CurrentWorksheet.Cells["D1"].Style.RotateAngle = 45;

//Многострочный текст
rgrid.CurrentWorksheet.Cells["A2"].Data = "Табличный компонент\nдля .Net";
rgrid.CurrentWorksheet.Cells["A2"].Style.TextWrap = TextWrapMode.WordBreak;
rgrid.CurrentWorksheet.Cells["A2"].Style.RotateAngle = -45;

//Выравнивание
rgrid.CurrentWorksheet.Cells["A3"].Data = "Привет, мир!";
rgrid.CurrentWorksheet.Cells["A3"].Style.HAlign = ReoGridHorAlign.Left;
rgrid.CurrentWorksheet.Cells["A3"].Style.RotateAngle = 90;

rgrid.CurrentWorksheet.Cells["B3"].Data = "Привет, мир!";
rgrid.CurrentWorksheet.Cells["B3"].Style.HAlign = ReoGridHorAlign.Center;
rgrid.CurrentWorksheet.Cells["B3"].Style.RotateAngle = 90;

rgrid.CurrentWorksheet.Cells["C3"].Data = "Привет, мир!";
rgrid.CurrentWorksheet.Cells["C3"].Style.HAlign = ReoGridHorAlign.Right;
rgrid.CurrentWorksheet.Cells["C3"].Style.RotateAngle = 90;

 

Поворот текста

Результат выполнения кода

 

Сравнение с Excel, Calc

Отображение созданного в ReoGrid файла (первые строки из кода примера). Выравнивание текста не задавалось

Видеодемонстрация

Изменение стиля отдельной ячейки

Для изменения стиля отдельной ячейки можно использовать её свойство Style.

VB

rgrid.CurrentWorksheet.Cells("E5").Style.BackColor = Color.LightYellow 'Цвет фона
rgrid.CurrentWorksheet.Cells("E5").Style.Bold = True 'Полужирный
rgrid.CurrentWorksheet.Cells("E5").Style.Italic = True 'Наклонный
rgrid.CurrentWorksheet.Cells("E5").Style.Underline = True 'Подчёркнутый
rgrid.CurrentWorksheet.Cells("E5").Style.Strikethrough = True 'Зачёркнутый
rgrid.CurrentWorksheet.Cells("E5").Style.FontName = "Verdana" 'Гарнитура
rgrid.CurrentWorksheet.Cells("E5").Style.FontSize = 12 'Кегль
rgrid.CurrentWorksheet.Cells("E5").Style.HAlign = ReoGridHorAlign.Center 'Горизонтальное выравнивание
rgrid.CurrentWorksheet.Cells("E5").Style.VAlign = ReoGridVerAlign.Middle 'Вертикальное выравнивание
rgrid.CurrentWorksheet.Cells("E5").Style.Indent = 15 'Отступ текста
rgrid.CurrentWorksheet.Cells("E5").Style.Padding = New PaddingValue(5, 5, 5, 5) 'Отступы в ячейке
rgrid.CurrentWorksheet.Cells("E5").Style.Padding = New PaddingValue(5) 'Отступы в ячейке
rgrid.CurrentWorksheet.Cells("E5").Style.RotateAngle = 90 'Поворот текста (в Pro-издании)
rgrid.CurrentWorksheet.Cells("E5").Style.TextColor = Color.Blue 'Цвет текста
rgrid.CurrentWorksheet.Cells("E5").Style.TextWrap = TextWrapMode.WordBreak 'Перенос по словам
C#

//Основные настройки стиля для отдельно взятой ячейки. Для большего числа ячеек нужно использовать стили
rgrid.CurrentWorksheet.Cells["E5"].Style.BackColor = Color.LightYellow; //Цвет фона
rgrid.CurrentWorksheet.Cells["E5"].Style.Bold = true; //Полужирный
rgrid.CurrentWorksheet.Cells["E5"].Style.Italic = true; //Наклонный
rgrid.CurrentWorksheet.Cells["E5"].Style.Underline = true; //Подчёркнутый
rgrid.CurrentWorksheet.Cells["E5"].Style.Strikethrough = true; //Зачёркнутый
rgrid.CurrentWorksheet.Cells["E5"].Style.FontName = "Verdana"; //Гарнитура
rgrid.CurrentWorksheet.Cells["E5"].Style.FontSize = 12; //Кегль
rgrid.CurrentWorksheet.Cells["E5"].Style.HAlign = ReoGridHorAlign.Center; //Горизонтальное выравнивание
rgrid.CurrentWorksheet.Cells["E5"].Style.VAlign = ReoGridVerAlign.Middle; //Вертикальное выравнивание
rgrid.CurrentWorksheet.Cells["E5"].Style.Indent = 15; //Отступ текста
rgrid.CurrentWorksheet.Cells["E5"].Style.Padding = new PaddingValue(5, 5, 5, 5); //Отступы в ячейке
rgrid.CurrentWorksheet.Cells["E5"].Style.Padding = new PaddingValue(5); //Отступы в ячейке
rgrid.CurrentWorksheet.Cells["E5"].Style.RotateAngle = 90; //Поворот текста (в Pro-издании)
rgrid.CurrentWorksheet.Cells["E5"].Style.TextColor = Color.Blue; //Цвет текста
rgrid.CurrentWorksheet.Cells["E5"].Style.TextWrap = TextWrapMode.WordBreak; //Перенос по словам

Использование Действий (DoAction)

Пример использования этого механизма:

rgrid.CurrentWorksheet.DoAction(new RGSetRangeStyleAction(Диапазон типа RangePosition, Стиль типа WorksheetRangeStyle))

Использование сценариев

Так же может быть использована команда на сценарном языке ReoScript.

rgrid.CurrentWorksheet.getCell(0, 0).style.backgroundColor = 'red'

Получение значений стилей

Получаем стили диапазона или ячейки:

rgrid.CurrentWorksheet.GetRangeStyles(Диапазон типа RangePosition)
rgrid.CurrentWorksheet.GetCellStyles(Позиция_ячейки типа CellPosition)

Приведённый ниже код необходим для настройки пользовательского интерфейса при выборе пользователем другой ячейки или диапазона. Данный код работает в обработчике события SelectionRangeChanged компонента ReoGrid

VB

If e.Range.IsEmpty = True Then MsgBox("Выбран пустой диапазон") : Exit Sub 'Ничего не выбрано - можно не продолжать
lblStatus.Text = "Выделенный диапазон: " & rgrid.CurrentWorksheet.SelectionRange.ToString()

Dim MyStyle As New WorksheetRangeStyle 'Создаём экземпляр стиля
MyStyle = rgrid.CurrentWorksheet.GetRangeStyles(rgrid.CurrentWorksheet.SelectionRange)

cboFontName.Text = MyStyle.FontName 'Гарнитура шрифта
cboFontSize.Text = Convert.ToString(MyStyle.FontSize) 'Кегль шрифта (размер)
chkFontBold.Checked = MyStyle.Bold 'Полужирный
chkFontItalic.Checked = MyStyle.Italic 'Курсив
chkFontUnderline.Checked = MyStyle.Underline 'Подчёркнутый
chkFontStrike.Checked = MyStyle.Strikethrough 'Зачёркнутый

'Выравнивание по левому краю
If MyStyle.HAlign = ReoGridHorAlign.Left Then
    radTextAlignLeft.Checked = True
Else
    radTextAlignLeft.Checked = False
End If

'Горизонтальная центровка
If MyStyle.HAlign = ReoGridHorAlign.Center Then
    radTextAlignCenter.Checked = True
Else
    radTextAlignCenter.Checked = False
End If

'Выравнивание по правому краю
If MyStyle.HAlign = ReoGridHorAlign.Right Then
    radTextAlignRight.Checked = True
Else
    radTextAlignRight.Checked = False
End If

'Распределённый отступ
If MyStyle.HAlign = ReoGridHorAlign.DistributedIndent Then
    radTextDisributedIndent.Checked = True
Else
    radTextDisributedIndent.Checked = False
End If

'Перенос по словам
chkTextWrap.Checked = Convert.ToBoolean(MyStyle.TextWrapMode)

'Вертикальное выравнивание: Сверху
If MyStyle.VAlign = ReoGridVerAlign.Top Then
    radTextAlignTop.Checked = True
Else
    radTextAlignTop.Checked = False
End If

'Вертикальное выравнивание: Посередине
If MyStyle.VAlign = ReoGridVerAlign.Middle Then
    radTextAlignMiddle.Checked = True
Else
    radTextAlignMiddle.Checked = False
End If

'Вертикальное выравнивание: Снизу
If MyStyle.VAlign = ReoGridVerAlign.Bottom Then
    radTextAlignBottom.Checked = True
Else
    radTextAlignBottom.Checked = False
End If

'Другие свойства:
'grpBackgroundColor.BackColor = MyStyle.BackColor 'Цвет фона
'MyStyle.CopyFrom() 'Копировать из другого стиля
'MyStyle.FillPatternColor 'Цвет шаблона фона (узора)
'MyStyle.FillPatternStyle 'Шаблон (узор)
'MyStyle.HAlign.General
'MyStyle.Padding 'Отступы
'grpTextColor.BackColor = MyStyle.TextColor 'Цвет текста
C#

if (e.Range.IsEmpty == true)
{
MessageBox.Show("Выбран пустой диапазон"); return;
}
//Ничего не выбрано - можно не продолжать
lblStatus.Text = "Выделенный диапазон: " + rgrid.CurrentWorksheet.SelectionRange.ToString();

WorksheetRangeStyle MyStyle = new WorksheetRangeStyle();
//Создаём экземпляр стиля
MyStyle = rgrid.CurrentWorksheet.GetRangeStyles(rgrid.CurrentWorksheet.SelectionRange);

cboFontName.Text = MyStyle.FontName; //Гарнитура шрифта
cboFontSize.Text = Convert.ToString(MyStyle.FontSize); //Кегль шрифта (размер)
chkFontBold.Checked = MyStyle.Bold; //Полужирный
chkFontItalic.Checked = MyStyle.Italic; //Курсив
chkFontUnderline.Checked = MyStyle.Underline; //Подчёркнутый
chkFontStrike.Checked = MyStyle.Strikethrough; //Зачёркнутый

//Выравнивание по левому краю
if (MyStyle.HAlign == ReoGridHorAlign.Left)
{radTextAlignLeft.Checked = true;}
else
{radTextAlignLeft.Checked = false;}

//Горизонтальная центровка
if (MyStyle.HAlign == ReoGridHorAlign.Center)
{radTextAlignCenter.Checked = true;}
else
{radTextAlignCenter.Checked = false;}

//Выравнивание по правому краю
if (MyStyle.HAlign == ReoGridHorAlign.Right)
{radTextAlignRight.Checked = true;}
else
{radTextAlignRight.Checked = false;}

//Распределённый отступ
if (MyStyle.HAlign == ReoGridHorAlign.DistributedIndent)
{radTextDisributedIndent.Checked = true;}
else
{radTextDisributedIndent.Checked = false;}

//Перенос по словам
chkTextWrap.Checked = Convert.ToBoolean(MyStyle.TextWrapMode); 

//Вертикальное выравнивание: Сверху
if (MyStyle.VAlign == ReoGridVerAlign.Top)
{radTextAlignTop.Checked = true;}
else
{radTextAlignTop.Checked = false;}

//Вертикальное выравнивание: Посередине
if (MyStyle.VAlign == ReoGridVerAlign.Middle)
{radTextAlignMiddle.Checked = true;}
else
{radTextAlignMiddle.Checked = false;}

//Вертикальное выравнивание: Снизу
if (MyStyle.VAlign == ReoGridVerAlign.Bottom)
{radTextAlignBottom.Checked = true;}
else
{radTextAlignBottom.Checked = false;}

//Другие свойства:
//grpBackgroundColor.BackColor = MyStyle.BackColor; //Цвет фона
//MyStyle.CopyFrom(); //Копировать из другого стиля
//MyStyle.FillPatternColor; //Цвет шаблона фона (узора)
//MyStyle.FillPatternStyle; //Шаблон (узор)
//MyStyle.HAlign.General
//MyStyle.Padding; //Отступы
//grpTextColor.BackColor = MyStyle.TextColor; //Цвет текста

Удаление стиля

Для удаления стилей используется свойство листа RemoveRangeStyles.

Флаг PlainStyleFlag позволяет указать, какие стили должны быть удалены. В примере показано удаление стиля фона для выбранного диапазона ячеек с помощью метода и действия.

VB

'Удаляем стиль для выделенного диапазона, даже если он состоит из одной ячейки.
rgrid.CurrentWorksheet.RemoveRangeStyles(rgrid.CurrentWorksheet.SelectionRange, PlainStyleFlag.BackAll) 'Метод

'Убираем фоновый цвет для выбранного диапазона:
rgrid.DoAction(New RemoveRangeStyleAction(rgrid.CurrentWorksheet.SelectionRange, PlainStyleFlag.BackAll)) 'Действие
C#

//Удаляем стиль для выделенного диапазона, даже если он состоит из одной ячейки.
rgrid.CurrentWorksheet.RemoveRangeStyles(rgrid.CurrentWorksheet.SelectionRange, PlainStyleFlag.BackAll); //Метод

//Убираем фоновый цвет для выбранного диапазона:
rgrid.DoAction(new RemoveRangeStyleAction(rgrid.CurrentWorksheet.SelectionRange, PlainStyleFlag.BackAll)); //Действие

Границы (Borders)

Для настройки границ применяются стили, которые создаются аналогично стилям текста, но задавать флаги не нужно. Что необходимо сделать:

  1. Создать экземпляр стиля
  2. Указать тип линий
  3. Указать цвет линий
  4. Применить стиль к указанному диапазону ячеек, дополнительно задав затрагиваемые границы.

Тип линии задаётся перечислением BorderLineStyle и может принимать значения, показанные в приведённом ниже примере.

Цвет линии задаётся перечислением Color или другим предусмотренным в .Net способом.

Тип границы задаётся перечислением BorderPositions и может принимать значения, показанные в приведённом ниже примере.

В примере показаны все основные варианты типов линий, вариантов задания цвета и затрагиваемых границ.

VB

'Объявление экземпляра стиля диапазона ячеек
Dim MyStyleBorder1 As New RangeBorderStyle

'Тип линий, оставляем нужную
MyStyleBorder1.Style = BorderLineStyle.BoldDashDot 'Полужирный штрих-точка
MyStyleBorder1.Style = BorderLineStyle.BoldDashDotDot 'Полужирный штрих-точка-точка
MyStyleBorder1.Style = BorderLineStyle.BoldDashed 'Полужирный штрих
MyStyleBorder1.Style = BorderLineStyle.BoldDotted 'Полужирная точка
MyStyleBorder1.Style = BorderLineStyle.BoldSolid 'Полужирная сплошная
MyStyleBorder1.Style = BorderLineStyle.BoldSolidStrong 'Полужирная сплошная
MyStyleBorder1.Style = BorderLineStyle.DashDot 'Штрих-точка
MyStyleBorder1.Style = BorderLineStyle.DashDotDot 'Штрих-точка-точка
MyStyleBorder1.Style = BorderLineStyle.Dashed 'Штриховая
MyStyleBorder1.Style = BorderLineStyle.Dashed2 'Штриховая
MyStyleBorder1.Style = BorderLineStyle.Dotted 'Точечная
MyStyleBorder1.Style = BorderLineStyle.DoubleLine 'Двойная линия
MyStyleBorder1.Style = BorderLineStyle.None 'Без границы
MyStyleBorder1.Style = BorderLineStyle.Solid 'Сплошная

'Цвета линий
MyStyleBorder1.Color = Color.Green 'Цвет из палитры .Net
MyStyleBorder1.Color = unvell.ReoGrid.Graphics.SolidColor.Green 'Цвет из палитры Unvell.Reogrid
MyStyleBorder1.Color = Color.FromArgb(127, 127, 127, 127) 'Произвольный цвет с прозрачностью

'Параметры границ диапазона или ячейки
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All, MyStyleBorder1) 'Все границы
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Backslash, MyStyleBorder1) 'Диагональная 1
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Bottom, MyStyleBorder1) 'Нижняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideAll, MyStyleBorder1) 'Все внутренние
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideHorizontal, MyStyleBorder1) 'Внутренние горизонтальные
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideVertical, MyStyleBorder1) 'Внутренние вертикальные
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Left, MyStyleBorder1) 'Левая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.LeftRight, MyStyleBorder1) 'Левая и правая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.None, MyStyleBorder1) 'Отсутсвуют
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Outside, MyStyleBorder1) 'Внешние (ранее использовалось уже устаревшее Outline)
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Right, MyStyleBorder1) 'Правая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Slash, MyStyleBorder1) 'Диагональная 2
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Top, MyStyleBorder1) 'Верхняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.TopBottom, MyStyleBorder1) 'Верхняя и нижняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.X, MyStyleBorder1) 'Все диагональные
C#

//Объявление экземпляра стиля диапазона ячеек
RangeBorderStyle MyStyleBorder1 = new RangeBorderStyle();

//Тип линий, оставляем нужную
MyStyleBorder1.Style = BorderLineStyle.BoldDashDot; //Полужирный штрих-точка
MyStyleBorder1.Style = BorderLineStyle.BoldDashDotDot; //Полужирный штрих-точка-точка
MyStyleBorder1.Style = BorderLineStyle.BoldDashed; //Полужирный штрих
MyStyleBorder1.Style = BorderLineStyle.BoldDotted; //Полужирная точка
MyStyleBorder1.Style = BorderLineStyle.BoldSolid; //Полужирная сплошная
MyStyleBorder1.Style = BorderLineStyle.BoldSolidStrong; //Полужирная сплошная
MyStyleBorder1.Style = BorderLineStyle.DashDot; //Штрих-точка
MyStyleBorder1.Style = BorderLineStyle.DashDotDot; //Штрих-точка-точка
MyStyleBorder1.Style = BorderLineStyle.Dashed; //Штриховая
MyStyleBorder1.Style = BorderLineStyle.Dashed2; //Штриховая
MyStyleBorder1.Style = BorderLineStyle.Dotted; //Точечная
MyStyleBorder1.Style = BorderLineStyle.DoubleLine; //Двойная линия
MyStyleBorder1.Style = BorderLineStyle.None; //Без границы
MyStyleBorder1.Style = BorderLineStyle.Solid; //Сплошная

//Цвета линий
MyStyleBorder1.Color = Color.Green; //Цвет из палитры .Net
MyStyleBorder1.Color = unvell.ReoGrid.Graphics.SolidColor.Green; //Цвет из палитры Unvell.Reogrid
MyStyleBorder1.Color = Color.FromArgb(127, 127, 127, 127); //Произвольный цвет с прозрачностью

//Параметры границ диапазона или ячейки
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All, MyStyleBorder1); //Все границы
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Backslash, MyStyleBorder1); //Диагональная 1
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Bottom, MyStyleBorder1); //Нижняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideAll, MyStyleBorder1); //Все внутренние
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideHorizontal, MyStyleBorder1); //Внутренние горизонтальные
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.InsideVertical, MyStyleBorder1); //Внутренние вертикальные
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Left, MyStyleBorder1); //Левая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.LeftRight, MyStyleBorder1); //Левая и правая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.None, MyStyleBorder1); //Отсутсвуют
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Outside, MyStyleBorder1); //Внешние (ранее использовалось уже устаревшее Outline)
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Right, MyStyleBorder1); //Правая
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Slash, MyStyleBorder1); //Диагональная 2
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.Top, MyStyleBorder1); //Верхняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.TopBottom, MyStyleBorder1); //Верхняя и нижняя
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.X, MyStyleBorder1); //Все диагональные

Очистка границ (Clear)

Для очистки границ достаточно задать для них пустой цвет (Color.Empty) или применить функцию

VB

Dim MyStyleBorder2 As New RangeBorderStyle
MyStyleBorder2.Color = Color.Empty
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All, MyStyleBorder2)
'или
rgrid.CurrentWorksheet.RemoveRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All)
C#

RangeBorderStyle MyStyleBorder2 = new RangeBorderStyle();
MyStyleBorder2.Color = Color.Empty;
rgrid.CurrentWorksheet.SetRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All, MyStyleBorder2);
//или
rgrid.CurrentWorksheet.RemoveRangeBorders(rgrid.CurrentWorksheet.SelectionRange, BorderPositions.All);

Видеодемонстрация

Объединение, разбивка и группировка ячеек

ReoGrid позволяет объединять и снова разделять ячейки. При этом объединять пересекающиеся диапазоны запрещено: ячейки из одного объединения не должны принадлежать другому. Также предусмотрены возможности проверки текущего состояния произвольной ячейки.

Объединение ячеек

1. Объединяем ячейки, начиная с (2,1). Количество строк – 3, количество столбцов – 4

2. Диапазон объединения начинается в (0,0), содержит 4 строки и 6 столбцов

VB

'1
rgrid.CurrentWorksheet.MergeRange(New RangePosition(2, 1, 3, 4))
'2
'rgrid.CurrentWorksheet.DoAction(New MergeRangeAction(New RangePosition(0, 0, 4, 6)))
C#

//1
rgrid.CurrentWorksheet.MergeRange(new RangePosition(2, 1, 3, 4));
//2
//rgrid.CurrentWorksheet.DoAction(new MergeRangeAction(new RangePosition(0, 0, 4, 6)))

Исключение RangeIntersectionException

Если попытаться объединить 2 и более ячеек, каждая из которых уже входит в состав своего объединения, то возникнет исключение RangeIntersectionException.

Пользовательский код позволяет отловить это исключение и прервать текущую операцию.

Метод CheckIntersectedMergingRange применяется для проверки принадлежности любой ячейки определённому диапазону. Этот метод помогает избегать указанное выше исключение.

VB

Dim outputRange As RangePosition = rgrid.CurrentWorksheet.CheckIntersectedMergingRange(rgrid.CurrentWorksheet.SelectionRange)
C#

RangePosition outputRange = rgrid.CurrentWorksheet.CheckIntersectedMergingRange(rgrid.CurrentWorksheet.SelectionRange);

Если выражение outputRange.IsEmpty является истинным, то диапазон inputRange безопасен. Существует ещё один метод, делающий то же самое.

VB

Dim rs As Boolean = rgrid.CurrentWorksheet.HasIntersectedMergingRange(rgrid.CurrentWorksheet.SelectionRange)
MsgBox("Слияние ячеек")
C#

bool rs = rgrid.CurrentWorksheet.HasIntersectedMergingRange(rgrid.CurrentWorksheet.SelectionRange);
MessageBox.Show("Слияние ячеек");

Нельзя объединять ячейки из разных объединённых диапазонов – это вызовет ошибку.

VB

rgrid.CurrentWorksheet.Reset()
Try
    'Попытка объединить пересекающиеся диапазоны приведёт к возникновению исключения
    rgrid.CurrentWorksheet.MergeRange(New RangePosition(2, 2, 5, 5))
    rgrid.CurrentWorksheet.MergeRange(New RangePosition(3, 3, 5, 5))
Catch 'unvell.reogrid.RangeIntersectionException
    MessageBox.Show("Обнаружено исключение RangeIntersectionException! Невозможно изменить часть диапазона ячеек.")
End Try
C#

rgrid.CurrentWorksheet.Reset();
try
{
//Попытка объединить пересекающиеся диапазоны приведёт к возникновению исключения
rgrid.CurrentWorksheet.MergeRange(new RangePosition(2, 2, 5, 5));
rgrid.CurrentWorksheet.MergeRange(new RangePosition(3, 3, 5, 5));
//unvell.reogrid.RangeIntersectionException
}
catch
{
MessageBox.Show("Обнаружено исключение RangeIntersectionException! Невозможно изменить часть диапазона ячеек.");
}

Проверка и получение значений

Используются следующие методы и свойства:

  • IsMergedCell – метод для проверки факта объединения ячеек;
  • GetRowspan – свойство ячейки для определения количества строк в объединении (number of rowspan);
  • GetColspan – свойство ячейки для определения количества столбцов в объединении (number of colspan);
  • GetMergedCellOfRange – метод для поиска объединенной ячейки в определенном диапазоне.
  • CheckMergedRange – метод для определения всей ячейки, если известна её часть.
  • IsValidCell – метод проверки ячеек на действительность. Недействительными ячейками являются ячейки, объединённые с другими. Недействительной ячейке нельзя задать данные или стили.

Примеры использования.

Ячейка в позиции 2:1 является объединённой, она содержит 4 строки (rowspan=4) и 3 столбца (colspan=3).

VB

Dim isMergedCell As Boolean = rgrid.CurrentWorksheet.IsMergedCell(2, 1)
Dim isMergedCell_1 As Boolean = rgrid.CurrentWorksheet.Cells(1, 2).IsMergedCell
Dim rowspan As Integer = rgrid.CurrentWorksheet.Cells(1, 2).GetRowspan()
Dim colspan As Integer = rgrid.CurrentWorksheet.Cells(1, 2).GetColspan()
'Dim output As Cell = rgrid.CurrentWorksheet.GetMergedCellOfRange(Input)
'Dim outputRange As RangePosition = rgrid.CurrentWorksheet.CheckMergedRange(inputRange)
rgrid.CurrentWorksheet.IsValidCell(2, 2) ' true
rgrid.CurrentWorksheet.IsValidCell(2, 3) ' false
C#

bool isMergedCell = rgrid.CurrentWorksheet.IsMergedCell(2, 1);
bool isMergedCell_1 = rgrid.CurrentWorksheet.Cells[1, 2].IsMergedCell;
int rowspan = rgrid.CurrentWorksheet.Cells[1, 2].GetRowspan();
int colspan = rgrid.CurrentWorksheet.Cells[1, 2].GetColspan();
//Cell output = rgrid.CurrentWorksheet.GetMergedCellOfRange(Input());
//RangePosition outputRange = rgrid.CurrentWorksheet.CheckMergedRange(inputRange);
rgrid.CurrentWorksheet.IsValidCell(2, 2); //true
rgrid.CurrentWorksheet.IsValidCell(2, 3); //false

Проверка количества выбранных ячеек

Так как ReoGrid обычно работает с выделенными диапазонами ячеек, то нужно предусматривать проверку: выбрана одна ячейка или более одной.

VB

If rgrid.CurrentWorksheet.SelectionRange.Rows = 1 And rgrid.CurrentWorksheet.SelectionRange.Cols = 1 Then
    MessageBox.Show("Выбранный диапазон должен состоять хотя бы из двух ячеек.")
Else
    Try
rgrid.CurrentWorksheet.MergeRange(rgrid.CurrentWorksheet.SelectionRange)
    Catch 'RangeIntersectionException
MessageBox.Show("Невозможно объединить пересекающиеся диапазоны.")
    End Try
End If
C#

if (rgrid.CurrentWorksheet.SelectionRange.Rows == 1 & rgrid.CurrentWorksheet.SelectionRange.Cols == 1)
{
MessageBox.Show("Выбранный диапазон должен состоять хотя бы из двух ячеек.");
}
else
{
try
{
rgrid.CurrentWorksheet.MergeRange(rgrid.CurrentWorksheet.SelectionRange);
//RangeIntersectionException
}
catch
{
MessageBox.Show("Невозможно объединить пересекающиеся диапазоны.");
}
}

Разбивка (разделение) ячеек

Разделение объединённых ячеек.

VB

rgrid.CurrentWorksheet.UnmergeRange(New RangePosition(0, 0, 10, 10)) 'Указанный диапазон
rgrid.CurrentWorksheet.UnmergeRange(rgrid.CurrentWorksheet.SelectionRange) 'Выделенный диапазон
C#

rgrid.CurrentWorksheet.UnmergeRange(new RangePosition(0, 0, 10, 10)); //Указанный диапазон
rgrid.CurrentWorksheet.UnmergeRange(rgrid.CurrentWorksheet.SelectionRange);//Выделенный диапазон

Примечание. Метод UnmergeRange находит и разбивает все объединённые ячейки указанного диапазона.

Группировка (тип данных – Integer)

VB

rgrid.CurrentWorksheet.GroupRows(1, 3) 'Группировка строк: со строки 1, их количество - 3
rgrid.CurrentWorksheet.GroupColumns(1, 3) 'Группировка столбцов: со столбца 1, их количество - 3
rgrid.CurrentWorksheet.UngroupRows(1, 3) 'Разгруппировка строк: со строки 1, их количество - 3
rgrid.CurrentWorksheet.UngroupColumns(1, 3) 'Разгруппировка столбцов: со столбца 1, их количество - 3
C#

rgrid.CurrentWorksheet.GroupRows(1, 3); //Группировка строк: со строки 1, их количество - 3
rgrid.CurrentWorksheet.GroupColumns(1, 3);//Группировка столбцов: со столбца 1, их количество - 3
rgrid.CurrentWorksheet.UngroupRows(1, 3);//Разгруппировка строк: со строки 1, их количество - 3
rgrid.CurrentWorksheet.UngroupColumns(1, 3);//Разгруппировка столбцов: со столбца 1, их количество - 3

Масштабирование (Zoom in/out)

Масштабирование может производиться как с помощью вращения колёсика мыши при зажатой клавише CTRL, так и программно

Ниже показаны примеры работы с масштабированием:

  1. Выбор значения масштаба из списка (событие TextChanged для раскрывающегося списка cboZoom, содержащего пункты вроде “10 %”).
  2. Увеличение масштаба на 10%.
  3. Уменьшение масштаба на 10%.
  4. Сброс масштаба к значению 100%.
  5. Установка единицы масштаба.

Для получения сведений о текущем масштабе, который установился, например, с помощью комбинации клавиш, служит событие Scaled

VB

rgrid.CurrentWorksheet.ScaleFactor = Convert.ToSingle(Val(cboZoom.Text.Replace("%", String.Empty).Trim)) / 100.0F
rgrid.CurrentWorksheet.ZoomIn()
rgrid.CurrentWorksheet.ZoomOut()
rgrid.CurrentWorksheet.ZoomReset()
rgrid.CurrentWorksheet.SetScale(2.0F)

'Обработка события
'Sub Sheet_Scaled(ByVal sender As Object, ByVal e As EventArgs)
Dim sheet As Worksheet = DirectCast(sender, Worksheet)
cboZoom.Text = Math.Round(sheet.ScaleFactor * 100).ToString & "%"
'End Sub
C#

rgrid.CurrentWorksheet.ScaleFactor = Convert.ToSingle(cboZoom.Text.Replace("%", string.Empty)) / 100.0F;
rgrid.CurrentWorksheet.ZoomIn();
rgrid.CurrentWorksheet.ZoomOut();
rgrid.CurrentWorksheet.ZoomReset();
rgrid.CurrentWorksheet.SetScale(2.0F);


//Обработка события (раскомментируйте код)
//public void Sheet_Scaled(object sender, EventArgs e)
//{
//Worksheet sheet = (Worksheet)sender;
//cboZoom.Text = Convert.ToString(Math.Round(sheet.ScaleFactor * 100)) + "%";
//}

Диаграммы (Charts)

Могут быть созданы в ReoGrid или быть загружены из файла в формате xlsx

Доступны несколько видов диаграмм. Их внешний вид и примеры кода приведены ниже.

За отображение легенды отвечает свойство ShowLegend. В коде примеров оно имеет значение C#: true, VB: True.

Линейная диаграмма (Line Chart, график)

Выполняем несколько действий:

  1. создаём источник данных (если он не существует), определяем расположение данных;
  2. создаём экземпляр диаграммы, указываем расположение верхней левой точки, размер и текст заголовка;
  3. указываем источники данных, добавляем экземпляр диаграммы на лист.
VB

'Подготовка источника данных.
Dim worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6},
  {"Город 2", 7, 5, 3, 6, 4},
  {"Город 3", 13, 10, 9, 10, 9},
  {"Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)",
    "=SUM(E3:E5)", "=SUM(F3:F5)"}}

'Указываем диапазон ячеек с данными и выделяем диапазон
Dim dataRange As unvell.ReoGrid.RangePosition = worksheet.Ranges("B3:F5")
Dim serialNamesRange As unvell.ReoGrid.RangePosition = worksheet.Ranges("A3:A6")
Dim categoryNamesRange As unvell.ReoGrid.RangePosition = worksheet.Ranges("B2:F2")

worksheet.AddHighlightRange(categoryNamesRange)
worksheet.AddHighlightRange(serialNamesRange)
worksheet.AddHighlightRange(dataRange)

'1
Dim lineChart As unvell.ReoGrid.Chart.LineChart = New unvell.ReoGrid.Chart.LineChart
lineChart.Location = New Graphics.Point(10, 200)
lineChart.Size = New Graphics.Size(400, 320)
lineChart.Title = "Пример линейной диаграммы"
lineChart.ShowLegend = True

'2
lineChart.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, serialNamesRange, dataRange)
'lineChart.DataSource.RowTitleRange = serialNamesRange
lineChart.DataSource.CategoryNameRange = categoryNamesRange
worksheet.FloatingObjects.Add(lineChart)
C#

//Подготовка источника данных.
Worksheet worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
  { null, 2008, 2009, 2010, 2011, 2012 },
  { "Город 1", 3, 2, 4, 2, 6 },
  { "Город 2", 7, 5, 3, 6, 4 },
  { "Город 3", 13, 10, 9, 10, 9 },
  { "Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)", 
"=SUM(E3:E5)", "=SUM(F3:F5)" },
};

//Указываем диапазон ячеек с данными и выделяем диапазон
var dataRange = worksheet.Ranges["B3:F5"];
var serialNamesRange = worksheet.Ranges["A3:A6"];
var categoryNamesRange = worksheet.Ranges["B2:F2"];

worksheet.AddHighlightRange(categoryNamesRange);
worksheet.AddHighlightRange(serialNamesRange);
worksheet.AddHighlightRange(dataRange);
//1
unvell.ReoGrid.Chart.LineChart lineChart = new unvell.ReoGrid.Chart.LineChart(); 

  lineChart.Location = new unvell.ReoGrid.Graphics.Point(440, 20);
  lineChart.Size = new unvell.ReoGrid.Graphics.Size(400, 260);
  lineChart.Title = "Пример линейной диаграммы";
  lineChart.ShowLegend = true;

//2
  lineChart.DataSource = new WorksheetChartDataSource(worksheet, serialNamesRange, dataRange);
//lineChart.DataSource.RowTitleRange = serialNamesRange;
lineChart.DataSource.CategoryNameRange = categoryNamesRange;
  
worksheet.FloatingObjects.Add(lineChart);

Линейная диаграмма

Видеодемонстрация

Вертикальная гистограмма (Column Chart)

Выполняем несколько действий:

  1. Размещаем данные в таблице.
  2. Указываем диапазон ячеек с данными и выделяем диапазон. Создаём три диапазона, диапазона источников данных, диапазон строк заголовков и диапазон заголовков столбцов, добавляем эти диапазоны в коллекцию выделенных диапазонов.
  3. Созданиём экземпляр диаграммы, указываем расположение верхней левой точки, размер и текст заголовка.
  4. Указываем источники данных, добавляем экземпляр диаграммы на лист.
VB

'1
Dim worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6},
  {"Город 2", 7, 5, 3, 6, 4},
  {"Город 3", 13, 10, 9, 10, 9},
  {"Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)",
    "=SUM(E3:E5)", "=SUM(F3:F5)"}}

'2
Dim dataRange = worksheet.Ranges("B3:F5")
Dim rowTitleRange = worksheet.Ranges("A3:A6")
Dim categoryNameRange = worksheet.Ranges("B2:F2")
worksheet.AddHighlightRange(rowTitleRange)
worksheet.AddHighlightRange(categoryNameRange)
worksheet.AddHighlightRange(dataRange)

'3
Dim c1 As unvell.ReoGrid.Chart.Chart = New unvell.ReoGrid.Chart.ColumnChart
c1.Location = New Graphics.Point(10, 140)
c1.Size = New Graphics.Size(400, 320)
c1.Title = "Пример гистограммы"
c1.ShowLegend = True

'4
c1.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, rowTitleRange, dataRange)
'c1.DataSource.RowTitleRange = rowTitleRange
'c1.DataSource.categoryNameRange = categoryNameRange
c1.DataSource.CategoryNameRange = categoryNameRange
worksheet.FloatingObjects.Add(c1)
C#

//1
Worksheet worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
  { null, 2008, 2009, 2010, 2011, 2012 },
  { "Город 1", 3, 2, 4, 2, 6 },
  { "Город 2", 7, 5, 3, 6, 4 },
  { "Город 3", 13, 10, 9, 10, 9 },
  { "Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)", 
"=SUM(E3:E5)", "=SUM(F3:F5)" },
};

//2
var dataRange = worksheet.Ranges["B3:F5"];
var rowTitleRange = worksheet.Ranges["A3:A6"];
var categoryNameRange = worksheet.Ranges["B2:F2"];
worksheet.AddHighlightRange(rowTitleRange);
worksheet.AddHighlightRange(categoryNameRange);
worksheet.AddHighlightRange(dataRange);

//3
unvell.ReoGrid.Chart.Chart c1 = new unvell.ReoGrid.Chart.ColumnChart();
c1.Location = new unvell.ReoGrid.Graphics.Point(10, 140);
c1.Size = new unvell.ReoGrid.Graphics.Size(400, 320);
c1.Title = "Пример гистограммы";
c1.ShowLegend = true;

//4
c1.DataSource = new unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, rowTitleRange, dataRange);
//c1.DataSource.RowTitleRange = rowTitleRange;
c1.DataSource.CategoryNameRange = categoryNameRange;
worksheet.FloatingObjects.Add(c1);

Вертикальная гистограмма

Видеодемонстрация

Горизонтальная гистограмма (Bar Chart)

Выполняем несколько действий:

  1. Подготовка источника данных.
  2. Указываем диапазон ячеек с данными и выделяем диапазон. Создаём три диапазона, диапазона источников данных, диапазон строк заголовков и диапазон заголовков столбцов, добавляем эти диапазоны в коллекцию выделенных диапазонов.
  3. Созданиём экземпляр диаграммы, указываем расположение верхней левой точки, размер и текст заголовка.
  4. Указываем источники данных, добавляем экземпляр диаграммы на лист.
VB

'1
Dim worksheet As unvell.ReoGrid.Worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6},
  {"Город 2", 7, 5, 3, 6, 4},
  {"Город 3", 13, 10, 9, 10, 9},
  {"Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)",
    "=SUM(E3:E5)", "=SUM(F3:F5)"}}

'2
Dim dataRange = worksheet.Ranges("B3:F5")
Dim rowTitleRange = worksheet.Ranges("A3:A6")
Dim categoryNameRange = worksheet.Ranges("B2:F2")
worksheet.AddHighlightRange(rowTitleRange)
worksheet.AddHighlightRange(categoryNameRange)
worksheet.AddHighlightRange(dataRange)

'3
Dim cbar As unvell.ReoGrid.Chart.Chart = New unvell.ReoGrid.Chart.BarChart
cbar.Location = New Graphics.Point(10, 140)
cbar.Size = New Graphics.Size(400, 320)
cbar.Title = "Пример горизонтальной гистограммы"
cbar.ShowLegend = True

'4
cbar.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, rowTitleRange, dataRange)
cbar.DataSource.CategoryNameRange = categoryNameRange
worksheet.FloatingObjects.Add(cbar)
C#

//1
var worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
  { null, 2008, 2009, 2010, 2011, 2012 },
  { "Город 1", 3, 2, 4, 2, 6 },
  { "Город 2", 7, 5, 3, 6, 4 },
  { "Город 3", 13, 10, 9, 10, 9 },
  { "Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)", 
"=SUM(E3:E5)", "=SUM(F3:F5)" },
};

//2
var dataRange = worksheet.Ranges["B3:F5"];
var rowTitleRange = worksheet.Ranges["A3:A6"];
var categoryNameRange = worksheet.Ranges["B2:F2"];
worksheet.AddHighlightRange(rowTitleRange);
worksheet.AddHighlightRange(categoryNameRange);
worksheet.AddHighlightRange(dataRange);

//3
unvell.ReoGrid.Chart.Chart cbar = new unvell.ReoGrid.Chart.BarChart();
cbar.Location = new unvell.ReoGrid.Graphics.Point(10, 140);
cbar.Size = new unvell.ReoGrid.Graphics.Size(400, 320);
cbar.Title = "Пример горизонтальной гистограммы";
cbar.ShowLegend = true;

//4
cbar.DataSource = new unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, rowTitleRange, dataRange);
//cbar.DataSource.RowTitleRange = rowTitleRange;
cbar.DataSource.CategoryNameRange = categoryNameRange;
worksheet.FloatingObjects.Add(cbar);

Горизонтальная гистограмма

Круговая 2D диаграмма (Pie 2D Chart)

Выполняем несколько действий:

  1. Создаём лист и добавляем данные.
  2. Определяем два диапазона: источник данных и заголовки, добавляем эти диапазоны в коллекцию
  3. Создаём экземпляр диаграммы, задаём заголовок, источники данных. После этого добавляем её в коллекцию диаграмм.
VB

'1
Dim worksheet As unvell.ReoGrid.Worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6}}

'2
Dim dataRange = worksheet.Ranges("B3:F3")
Dim titleRange = worksheet.Ranges("B2:F2")
worksheet.AddHighlightRange(dataRange)
worksheet.AddHighlightRange(titleRange)

'3
Dim cpie As unvell.ReoGrid.Chart.Chart = New unvell.ReoGrid.Chart.Pie2DChart
cpie.Location = New Graphics.Point(10, 140)
cpie.Size = New Graphics.Size(400, 320)
cpie.Title = "Пример круговой 2D диаграммы"
cpie.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, titleRange, dataRange)
cpie.DataSource.CategoryNameRange = titleRange
cpie.ShowLegend = True

worksheet.FloatingObjects.Add(cpie)
C#

//1
Worksheet worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
  { null, 2008, 2009, 2010, 2011, 2012 },
  { "Город 1", 3, 2, 4, 2, 6 },
};

//2
var dataRange = worksheet.Ranges["B3:F3"];
var titleRange = worksheet.Ranges["B2:F2"];
worksheet.AddHighlightRange(dataRange);
worksheet.AddHighlightRange(titleRange);

//3
unvell.ReoGrid.Chart.Pie2DChart cpie = new unvell.ReoGrid.Chart.Pie2DChart();
cpie.Location = new unvell.ReoGrid.Graphics.Point(10, 140);
cpie.Size = new unvell.ReoGrid.Graphics.Size(400, 320);
cpie.Title = "Пример круговой 2D диаграммы";
cpie.DataSource = new unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, titleRange, dataRange);
cpie.DataSource.CategoryNameRange = titleRange;
cpie.ShowLegend = true;

worksheet.FloatingObjects.Add(cpie);

Круговая 2D диаграмма

Видеодемонстрация

Диаграмма с областями (Area Chart)

Выполняем несколько действий:

  1. Подготовка источника данных.
  2. Указываем диапазон ячеек с данными и выделяем диапазон. Создаём три диапазона, диапазона источников данных, диапазон строк заголовков и диапазон заголовков столбцов, добавляем эти диапазоны в коллекцию выделенных диапазонов.
  3. Созданиём экземпляр диаграммы, указываем расположение верхней левой точки, размер и текст заголовка.
  4. Указываем источники данных, добавляем экземпляр диаграммы на лист.
VB

'1
Dim worksheet As unvell.ReoGrid.Worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6},
  {"Город 2", 7, 5, 3, 6, 4},
  {"Город 3", 13, 10, 9, 10, 9},
  {"Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)",
    "=SUM(E3:E5)", "=SUM(F3:F5)"}}

'2
Dim dataRange = worksheet.Ranges("B3:F5")
Dim serialNamesRange = worksheet.Ranges("A3:A5")
Dim categoryNamesRange = worksheet.Ranges("B2:F2")

worksheet.AddHighlightRange(categoryNamesRange)
worksheet.AddHighlightRange(serialNamesRange)
worksheet.AddHighlightRange(dataRange)

'3
Dim cArea As unvell.ReoGrid.Chart.Chart = New unvell.ReoGrid.Chart.AreaChart
cArea.Location = New Graphics.Point(10, 140)
cArea.Size = New Graphics.Size(400, 320)
cArea.Title = "Пример диаграммы с областями"
cArea.ShowLegend = True

'4
cArea.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, serialNamesRange, dataRange)
cArea.DataSource.CategoryNameRange = categoryNamesRange

'Изменяем стиль - все цвета становятся полупрозрачными
For i As Integer = 0 To cArea.DataSerialStyles.Count - 1
    Dim color As Color = cArea.DataSerialStyles(i).LineColor
    cArea.DataSerialStyles(i).LineColor = New Graphics.SolidColor(125, color)
Next

worksheet.FloatingObjects.Add(cArea)
C#

var worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
  { null, 2008, 2009, 2010, 2011, 2012 },
  { "Город 1", 3, 2, 4, 2, 6 },
  { "Город 2", 7, 5, 3, 6, 4 },
  { "Город 3", 13, 10, 9, 10, 9 },
  { "Всего", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)", 
"=SUM(E3:E5)", "=SUM(F3:F5)" },
};

//2
var dataRange = worksheet.Ranges["B3:F5"];
var serialNamesRange = worksheet.Ranges["A3:A5"];
var categoryNamesRange = worksheet.Ranges["B2:F2"];
worksheet.AddHighlightRange(categoryNamesRange);
worksheet.AddHighlightRange(serialNamesRange);
worksheet.AddHighlightRange(dataRange);

//3
unvell.ReoGrid.Chart.Chart carea = new unvell.ReoGrid.Chart.AreaChart();
carea.Location = new unvell.ReoGrid.Graphics.Point(10, 140);
carea.Size = new unvell.ReoGrid.Graphics.Size(400, 320);
carea.Title = "Пример диаграммы с областями";
carea.ShowLegend = true;

//4
carea.DataSource = new unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, serialNamesRange, dataRange);
carea.DataSource.CategoryNameRange = categoryNamesRange;

//Изменяем стиль - все цвета становятся полупрозрачными
foreach (var style in carea.DataSerialStyles)
{
   style.FillColor = new unvell.ReoGrid.Graphics.SolidColor(100, style.FillColor.ToSolidColor());
}

worksheet.FloatingObjects.Add(carea);

Диаграмма с областями

Видеодемонстрация

Кольцевая диаграмма (Doughnut Chart)

Выполняем несколько действий:

  1. Подготовка источника данных.
  2. Указываем диапазон ячеек с данными и выделяем диапазон. Создаём три диапазона, диапазона источников данных, диапазон строк заголовков и диапазон заголовков столбцов, добавляем эти диапазоны в коллекцию выделенных диапазонов.
  3. Созданиём экземпляр диаграммы, указываем расположение верхней левой точки, размер и текст заголовка.
  4. Указываем источники данных, добавляем экземпляр диаграммы на лист.
VB

'1
Dim worksheet As unvell.ReoGrid.Worksheet = Me.rgrid.CurrentWorksheet
worksheet("A2") = New Object(,) {
  {Nothing, 2008, 2009, 2010, 2011, 2012},
  {"Город 1", 3, 2, 4, 2, 6}}

'2
Dim dataRange = worksheet.Ranges("B3:F3")
Dim titleRange = worksheet.Ranges("B2:F2")
worksheet.AddHighlightRange(dataRange)
worksheet.AddHighlightRange(titleRange)

'3
Dim chartD As unvell.ReoGrid.Chart.Chart = New unvell.ReoGrid.Chart.DoughnutChart
chartD.Location = New Graphics.Point(10, 140)
chartD.Size = New Graphics.Size(400, 320)
chartD.Title = "Пример кольцевой диаграммы"
chartD.DataSource = New unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, titleRange, dataRange, RowOrColumn.Column)
chartD.ShowLegend = True

worksheet.FloatingObjects.Add(chartD)
C#

//1
unvell.ReoGrid.Worksheet worksheet = this.rgrid.CurrentWorksheet;
worksheet["A2"] = new object[,] {
 { null, 2008, 2009, 2010, 2011, 2012 },
 { "Город 1", 3, 2, 4, 2, 6 },
};

//2
var dataRange = worksheet.Ranges["B3:F3"];
var titleRange = worksheet.Ranges["B2:F2"];
worksheet.AddHighlightRange(dataRange);
worksheet.AddHighlightRange(titleRange);

//3
unvell.ReoGrid.Chart.Chart chartD = new unvell.ReoGrid.Chart.DoughnutChart();
chartD.Location = new unvell.ReoGrid.Graphics.Point(10, 140);
chartD.Size = new unvell.ReoGrid.Graphics.Size(400, 320);
chartD.Title = "Пример кольцевой диаграммы";
chartD.DataSource = new unvell.ReoGrid.Chart.WorksheetChartDataSource(worksheet, titleRange, dataRange, RowOrColumn.Column);
chartD.ShowLegend = true;

worksheet.FloatingObjects.Add(chartD);

Кольцевая диаграмма

Видеодемонстрация

Плавающие объекты

ReoGrid поддерживает рисуемые объекты, создание на листе диаграмм, плавающих изображений и отображения графических примитивов: прямоугольников, линий, прямоугольников со скруглёнными углами. Также поддерживается считывание плавающих объектов из файла Excel; используя этот функционал, .Net-приложениях можно отображать основанные на Excel отчёты с рисунками и диаграммами.

Плавающие объекты вынесены в новое свойство листа, через которое возможен полный доступ к ним: worksheet.FloatingObjects()

Поддержка Excel

Плавающие объекты будут автоматически загружаться из файла Excel и сохраняться в нём.

Создание плавающих объектов

Пример 1. Создание объекта-прямоугольника. Выполняются следующие действия:

  1. Создание экземпляра прямоугольника, задание его расположения и размеров.
  2. Добавление плавающего объекта на лист. Для этого нужно добавить его в коллекцию плавающих объектов. В данном случае получаем текущий лист и пополняем его коллекцию.
VB

Dim rectObj As unvell.ReoGrid.Drawing.Shapes.RectangleShape = New unvell.ReoGrid.Drawing.Shapes.RectangleShape()
rectObj.Location = New Graphics.Point(50, 50)
rectObj.Size = New Graphics.Size(200, 100)
Dim worksheet As unvell.ReoGrid.Worksheet = rgrid.CurrentWorksheet  'Control.CurrentWorksheet
worksheet.FloatingObjects.Add(rectObj)
C#

unvell.ReoGrid.Drawing.Shapes.RectangleShape rectObj = new unvell.ReoGrid.Drawing.Shapes.RectangleShape();
rectObj.Location = new unvell.ReoGrid.Graphics.Point(50, 50);
rectObj.Size = new unvell.ReoGrid.Graphics.Size(200, 100);
Worksheet worksheet = this.rgrid.CurrentWorksheet;
worksheet.FloatingObjects.Add(rectObj);

Результат:

Пример 2. Добавление плавающего изображения

  1. Получаем текущий лист.
  2. Создаём изображение из файла.
  3. Добавляем изображение на лист с указанием расположения.
VB

Dim worksheet1 = Me.rgrid.CurrentWorksheet
Dim image1 As System.Drawing.Image = My.Resources.photo 'Image.FromFile("Sample.png")
worksheet1.FloatingObjects.Add(New Drawing.ImageObject(image1))
worksheet1.FloatingObjects(0).Location = New Graphics.Point(40, 30)
C#

Worksheet worksheet1 = this.rgrid.CurrentWorksheet;
System.Drawing.Image image1 = reogrid_test_CSharp.Properties.Resources.photo; //Image.FromFile("Sample.png");
worksheet1.FloatingObjects.Add(new unvell.ReoGrid.Drawing.ImageObject(image1));
worksheet1.FloatingObjects[0].Location = new unvell.ReoGrid.Graphics.Point(40, 30);

Результат:

Получение всех плавающих изображений, встроенных в файл Excel

Для этого необходимо загрузить в экземпляр ReoGrid книгу Excel, выбрать лист и перебрать все изображения с помощью цикла C#: foreach, VB: For Each

VB

rgrid.Load(Application.StartupPath & "\docs\welcome-089.xlsx")
Dim wsimgs As Worksheet = rgrid.Worksheets(0)

For Each floatingObject As unvell.ReoGrid.Drawing.DrawingObject In wsimgs.FloatingObjects
    'Проверка: является ли плавающий объект изображением
    If TypeOf floatingObject Is Drawing.ImageObject Then
Dim imageObject = DirectCast(floatingObject, Drawing.ImageObject)
Dim image = imageObject.Image

'Обработка изображения

    End If
Next
C#

rgrid.Load(Application.StartupPath + "\\docs\\welcome-089.xlsx");
var wsimgs = rgrid.Worksheets[0];

foreach (unvell.ReoGrid.Drawing.DrawingObject floatingObject in wsimgs.FloatingObjects)
{
  //Проверка: является ли плавающий объект изображением
  if (floatingObject is unvell.ReoGrid.Drawing.ImageObject)
  {
  var imageObject = (unvell.ReoGrid.Drawing.ImageObject)floatingObject;
var image = imageObject.Image;

// обработка изображения
  }
}

Отображение текста в формате RTF (Rich format text)

Данный формат представлен в виде класса unvell.ReoGrid.Drawing.RichText()

Экземпляр этого класса представляет собой объект, который можно отобразить внутри ячейки или в рисуемых объектов.

Управление отображением текста

Для задания одних параметров используются настройки стиля отображения ячейки, для других – методы класса RichText, которые указываются при добавлении текста.

Настройки стиля ячеек

  • Переносы текста (Line breaks). Используется атрибут стиля wordbreak или breakall.
  • Выравнивание текста по горизонтали и вертикали. Соответственно используются атрибуты HAlign и VAlign

Методы RichText

  • Span – добавляет текст без каких-либо стилевых особенностей.
  • Bold – текст, отображаемый полужирным шрифтом.
  • Italic – наклонный.
  • Underline – подчёркнутый.
  • Strikeout – зачёркнутый.
  • Regular – простой текст. Применяется для восстановления исходного вида текста (без эффектов).
  • NewLine – добавление нового абзаца.
  • SetStyles – изменяет стиль абзаца или Span. Например, можно изменить отступы и высоту строки.
  • Superscript – для добавления надстрочного (вот такого) текста.

Примечания:

  1. Excel не поддерживает изменение стилей отступов и высоты строки для абзацев.
  2. Excel не поддерживает отдельный стиль выравнивания текста для каждого абзаца (строки текста).
  3. После использования метода Superscript, для восстановления стиля текста, используйте метод Regular.

Отображение форматированного текста в рисуемых объектах

Для отображения форматированного текста в рисуемых объектах, нужно создать экземпляр класса RichText, добавить в него текст и поместить в рисуемые объекты.

Пример использования:

VB

'Получаем экземпляр листа и объединяем ячейки, для удобства
Dim sheet = rgrid.CurrentWorksheet
sheet.MergeRange("B2:F6")

'Добавляем первый фрагмент текста
sheet("B2") = New unvell.ReoGrid.Drawing.RichText().Regular("Тот самый ").Bold("Rich Text Format").Regular(" (часто сокращаемый до ").Bold("RTF").Regular(") является проприетарным").Superscript("[6][7][8]").Regular(" форматом файла документа с опубликованной спецификацией, разрабатываемой корпорацией Microsoft с ").Span("1987", textColor:=Color.OrangeRed).Span(" по ", textColor:=Color.Black).Span("2008", textColor:=Color.OrangeRed).Span(" годы для кросс-платформенного документооборота с продуктами Microsoft.", textColor:=Color.Black)

'Вот так включаем переносы
sheet.Cells("B2").Style.TextWrap = TextWrapMode.WordBreak

'А вот так задаём выравнивание
sheet.Cells("B2").Style.VAlign = ReoGridVerAlign.Middle
sheet.Cells("B2").Style.HAlign = ReoGridHorAlign.Right

'Добавление абзаца с дополнительными параметрами
sheet.MergeRange("B7:F12")
sheet("B7") = New unvell.ReoGrid.Drawing.RichText().Span("Тот самый ").Bold("Apple II").Regular(" (обозначаемый как apple ][) является 8-битным домашним компьютером.").NewLine().Span("Один из первых успешних массовых микрокомпьютеров,").Superscript("[2]").Regular(" изначально разработан Стивом Возняком.").NewLine().SetStyles(halign:=ReoGridHorAlign.Right).Span("- wikipedia.org")

'Настройка ячейки
sheet.Cells("B7").Style.TextWrap = TextWrapMode.WordBreak
sheet.Cells("B7").Style.VAlign = ReoGridVerAlign.Middle
sheet.Cells("B7").Style.HAlign = ReoGridHorAlign.Right
C#

//Получаем экземпляр листа и объединяем ячейки, для удобства
var sheet = rgrid.CurrentWorksheet;
sheet.MergeRange("B2:F6");

//Добавляем первый фрагмент текста
sheet["B2"] = new unvell.ReoGrid.Drawing.RichText()
  .Regular("Тот самый ")
  .Bold("Rich Text Format")
  .Regular(" (часто сокращаемый до ")
  .Bold("RTF")
  .Regular(") является проприетарным")
  .Superscript("[6][7][8]")
  .Regular(" форматом файла документа с опубликованной спецификацией, разрабатываемой корпорацией Microsoft с ")
  .Span("1987", textColor: Color.OrangeRed)
  .Span(" по ", textColor: Color.Black)
  .Span("2008", textColor: Color.OrangeRed)
  .Span(" годы для кросс-платформенного документооборота с продуктами Microsoft.", textColor: Color.Black);

//Вот так включаем переносы
sheet.Cells["B2"].Style.TextWrap = TextWrapMode.WordBreak;

//А вот так задаём выравнивание
sheet.Cells["B2"].Style.VAlign = ReoGridVerAlign.Middle;
sheet.Cells["B2"].Style.HAlign = ReoGridHorAlign.Right;

//Добавление абзаца с дополнительными параметрами
sheet.MergeRange("B7:F12");
sheet["B7"] = new unvell.ReoGrid.Drawing.RichText()
.Span("Тот самый ")
.Bold("Apple II")
.Regular(" (обозначаемый как apple ][) является 8-битным домашним компьютером.")
.NewLine()
.Span("Один из первых успешних массовых микрокомпьютеров,")
.Superscript("[2]")
.Regular(" изначально разработан Стивом Возняком.")
.NewLine()
.SetStyles(halign: ReoGridHorAlign.Right)
.Span("- wikipedia.org");

//Настройка ячейки
sheet.Cells["B7"].Style.TextWrap = TextWrapMode.WordBreak;
sheet.Cells["B7"].Style.VAlign = ReoGridVerAlign.Middle;
sheet.Cells["B7"].Style.HAlign = ReoGridHorAlign.Right;

Результат:

RTF в ReoGrid

Поддержка импорта/экспорта из/в Excel

ReoGrid поддерживает импорт и экспорт форматированного текста (RTF) из/в файл Excel. Ниже приведён пример отображения текста как в ReoGrid, так и в Excel.

RTF в ReoGrid и Excel

Автозаполнение (Fill data serial)

Автопродолжение списка

Суть данной функции состоит в том, что если нужно заполнить столбец числами, следующими по порядку, то достаточно ввести первые одно-два. После этого, не снимая выделения, нужно навести указатель мыши на прямоугольный маркер в правом нижнем углу нижней ячейки выделения и перетащить его вниз левой кнопкой мыши. Аналогично можно поступить и со строками, только перетаскивать маркер нужно вправо. Подсказкой будет указатель мыши в виде полужирного перекрестия.


Автозаполнение для столбца (в столбце “A” исходные данные, в “C” – в процессе перетаскивания, в “E” – результат)


Автозаполнение для строки (во 2-й строке исходные данные, в 4-й – в процессе перетаскивания, в 6-й – результат)

Видеодемонстрация для столбца

Видеодемонстрация для строки

Автокоррекция формул (Formula Reuse)

Если исходная ячейка содержит формулу, то в процессе автозаполнения в новые ячейки будут подставляться подкорректированные копии содержащейся в исходной ячейке формулы. То есть, если исходной ячейке C2 была формула =B2*2, то после перетаскивания ячейка C5 будет содержать формулу =B5*2. Соответственно, ячейка C7 получит формулу =B7*2.


Начало процесса. Формула введена только в ячейку C2


После перетаскивания. Автоматически подкорерктированная формула вставлена в ячейки C3-C7

Видеодемонстрация

Предотвращение автокоррекции формул (Prevent formula reuse)

Для предотвращения автокоррекции формул достаточно использовать абсолютные ссылки на ячейку или диапазон ячеек. Например: вот так: =$B$2 или =B$2


Формула в исходной ячейке


Формула в заполненной ячейке: скопировано без изменений

Видеодемонстрация

Автопродолжение списка для нескольких строк или столбцов (Multiple cells fill)

Для диапазона, содержащего несколько строк или столбцов, каждая строка или столбец будет заполняться согласно собственному правилу. В примере показан случай с автозаполнением трёх столбцов.


Исходные данные


Результат

Видеодемонстрация

Автозаполнение программным путём (Fill serial by programming)

Для этого достаточно использовать метод AutoFillSerial для выбранного листа. Достаточно указать исходный диапазон ячеек и тот, куда необходимо добавить данные. Пример (иллюстрацию можно увидеть выше): есть исходный диапазон с данными B2:D3, нужно получить и пересчитать значения для диапазона B4:D8.

VB

rgrid.CurrentWorksheet.AutoFillSerial("B2:D3", "B4:D8")
C#

rgrid.CurrentWorksheet.AutoFillSerial("B2:D3", "B4:D8");

Дополнительные примеры

Пример 1. Настраиваемые заголовки

VB

rgrid.CurrentWorksheet.Resize(10, 7) 'Меняем размер и получаем 10 строк и 7 столбцов

'Приводим стиль первого заголовка к типу "Флажок" (Сheckbox)
Dim checkBoxHeader = rgrid.CurrentWorksheet.ColumnHeaders(0)
checkBoxHeader.Text = String.Empty
'checkBoxHeader.DefaultCellBody = unvell.ReoGrid.CellTypes.CheckBoxCell
checkBoxHeader.Width = 30 'Ширина заголовка: 30 пикселей
checkBoxHeader.Style.HorizontalAlign = ReoGridHorAlign.Center
checkBoxHeader.Style.Padding = New unvell.ReoGrid.PaddingValue(3)

'Установка других заголовков
rgrid.CurrentWorksheet.ColumnHeaders(1).Text = "Продукт"
rgrid.CurrentWorksheet.ColumnHeaders(2).Text = "Цена за единицу"
rgrid.CurrentWorksheet.ColumnHeaders(3).Text = "Скидка"
rgrid.CurrentWorksheet.ColumnHeaders(4).Text = "Количество"
rgrid.CurrentWorksheet.ColumnHeaders(5).Text = "Расширенная цена"
rgrid.CurrentWorksheet.ColumnHeaders(6).Text = "Примечание"

'устанавливаем ширину столбцов (1-4)
rgrid.CurrentWorksheet.SetColumnsWidth(1, 5, 100)

'Включение режима выделения только одной ячейки
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Cell

'Определение региона как диапазона записей
Dim recordRange = rgrid.CurrentWorksheet.DefineNamedRange("records", 0, 0, 4, 6)

'Применение формулы с использованием относительного адреса в порядке для подсчёта каждой строки
'Итоговая цена = (цена за единицу - скидка) * количество
Dim extendedPriceFormula = "=( INDIRECT(ADDRESS(ROW(), COLUMN()-3)) " & " - INDIRECT(ADDRESS(ROW(), COLUMN()-2)) )" & " * INDIRECT(ADDRESS(ROW(), COLUMN()-1) )"

'Вводим данные
recordRange.Data = New Object(,) {
{False, "Процессор", "230", "0", "1", extendedPriceFormula},
{True, "Системная плата", "120", "5", "1", extendedPriceFormula},
{False, "Память", "90", "0", "2", extendedPriceFormula},
{False, "VGA", "310", "0", "1", extendedPriceFormula}
}

'Сбрасываем стиль курсора для ячеек к обычному виду
rgrid.CellsSelectionCursor = Cursors.Default

'Получаем формулу из выбранной ячейки и отображаем её
'AddHandler rgrid.CurrentWorksheet.FocusPosChanged, AddressOf rGrid_FocusPosChanged
'Sub rGrid_FocusPosChanged(sender,e)
'lblStatus.Text = rgrid.CurrentWorksheet.GetCellFormula(rgrid.CurrentWorksheet.FocusPos)
'End Sub		
C#

rgrid.CurrentWorksheet.Resize(10, 7);
//Меняем размер и получаем 10 строк и 7 столбцов

//Приводим стиль первого заголовка к типу "Флажок" (Сheckbox)
dynamic checkBoxHeader = rgrid.CurrentWorksheet.ColumnHeaders[0];
checkBoxHeader.Text = string.Empty;
//checkBoxHeader.DefaultCellBody = TypeOf(CheckBoxCell)
checkBoxHeader.WidthInPixel = 30;
//Ширина заголовка: 30 пикселей
checkBoxHeader.Style.HorizontalAlign = ReoGridHorAlign.Center;
checkBoxHeader.Style.Padding = new unvell.ReoGrid.PaddingValue(3);

//Установка других заголовков
rgrid.CurrentWorksheet.ColumnHeaders[1].Text = "Продукт";
rgrid.CurrentWorksheet.ColumnHeaders[2].Text = "Цена за единицу";
rgrid.CurrentWorksheet.ColumnHeaders[3].Text = "Скидка";
rgrid.CurrentWorksheet.ColumnHeaders[4].Text = "Количество";
rgrid.CurrentWorksheet.ColumnHeaders[5].Text = "Расширенная цена";
rgrid.CurrentWorksheet.ColumnHeaders[6].Text = "Примечание";

//устанавливаем ширину столбцов (1-4)
rgrid.CurrentWorksheet.SetColumnsWidth(1, 5, 100);

//Включение режима выделения только одной ячейки
rgrid.CurrentWorksheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Cell;

//Определение региона как диапазона записей
dynamic recordRange = rgrid.CurrentWorksheet.DefineNamedRange("records", 0, 0, 4, 6);

//Применение формулы с использованием относительного адреса в порядке для подсчёта каждой строки
//Итоговая цена = (цена за единицу - скидка) * количество
dynamic extendedPriceFormula = "=( INDIRECT(ADDRESS(ROW(), COLUMN()-3)) " + " - INDIRECT(ADDRESS(ROW(), COLUMN()-2)) )" + " * INDIRECT(ADDRESS(ROW(), COLUMN()-1) )";

//Вводим данные
recordRange.Data = new object[ , ] {
{false,"Процессор","230","0","1",extendedPriceFormula},
{true,"Системная плата","120","5","1",extendedPriceFormula},
{false,"Память","90","0","2",extendedPriceFormula},
{false,"VGA","310","0","1",extendedPriceFormula}
};

//Сбрасываем стиль курсора для ячеек к обычному виду
rgrid.CellsSelectionCursor = Cursors.Default;

//Получаем формулу из выбранной ячейки и отображаем её
/*rgrid.CurrentWorksheet.FocusPosChanged += rGrid_FocusPosChanged;

public void rGrid_FocusPosChanged(sender, e)
{
lblStatus.Text = rgrid.CurrentWorksheet.GetCellFormula(rgrid.CurrentWorksheet.FocusPos);
}*/

Пример 2. Определение разрешённого для редактирования диапазона

Многие события, происходящие перед основными, поддерживают свойство IsCancelled. Если его установить в True, ReoGrid отменит соответствующую операцию. Обычно используется для предотвращения правки ячеек или операций сворачивания/разворачивания

VB

'Пример: текст можно править лишь в чётко определённом диапазоне:
Dim editableRange = New RangePosition(3, 1, 2, 3)
rgrid.CurrentWorksheet.SetRangeBorders(editableRange, BorderPositions.Outside, RangeBorderStyle.BlackSolid)
rgrid.CurrentWorksheet(2, 1) = "Правка разрешена только для этого диапазона:"

'AddHandler rgrid.CurrentWorksheet.BeforeCellEdit, AddressOf rgrid_BeforeCellEdit
'Sub rgrid_BeforeCellEdit(ByVal sender, ByVal e)
'e.IsCancelled = Not rgrid.CurrentWorksheet(1, 1, 2, 2).Contains(e.Cell.GetPos())
'End Sub		
C#

//Пример: текст можно править лишь в чётко определённом диапазоне:
{  
RangePosition editableRange = new RangePosition(3, 1, 2, 3);
rgrid.CurrentWorksheet.SetRangeBorders(editableRange, BorderPositions.Outside, RangeBorderStyle.BlackSolid);
rgrid.CurrentWorksheet[2, 1] = "Правка разрешена только для этого диапазона:";

//rgrid.CurrentWorksheet.BeforeCellEdit += rgrid_BeforeCellEdit;
}

/*public void rgrid_BeforeCellEdit(sender, e)
{
e.IsCancelled = !rgrid.CurrentWorksheet(1, 1, 2, 2).Contains(e.Cell.GetPos());
}*/

Пример 3. Использование книги в памяти (Memory Workbook)

Пример включает создание экземпляра книги, добавление листов, создание таблицы с очерченными границами, указанием типов данных, стилей и формул. Результат сохраняется в виде файла формата Excel 2007/2010.

Просмотреть видеодемонстрацию (VB.Net)

VB

'Imports unvell.ReoGrid
'Imports unvell.ReoGrid.DataFormat
'Imports System.IO

'Создание экземпляров таблицы и листа
Dim wb = ReoGridControl.CreateMemoryWorkbook()
Dim ws As Worksheet = wb.Worksheets(0)

'Объединение ячеек
ws.MergeRange("A1:E1")
ws.MergeRange("A9:D9")

'Установка типа ячеек
Dim FFNum As New NumberDataFormatter.NumberFormatArgs
FFNum.DecimalPlaces = 0
FFNum.NegativeStyle = NumberDataFormatter.NumberNegativeStyle.Minus
FFNum.UseSeparator = True
ws.SetRangeDataFormat("A4:A8", CellDataFormatFlag.Number, FFNum)
ws.SetRangeDataFormat("C4:C8", CellDataFormatFlag.Number, FFNum)

Dim FFCur As New CurrencyDataFormatter.CurrencyFormatArgs
FFCur.CultureEnglishName = "en-US" 'Культура
FFCur.DecimalPlaces = 2
FFCur.PrefixSymbol = "$"
ws.SetRangeDataFormat("D4:D8", CellDataFormatFlag.Currency, FFCur)
ws.SetRangeDataFormat("E4:E9", CellDataFormatFlag.Currency, FFCur)

'Данные
ws("A1") = "Перечень радиокомпонентов электронного устройства"
ws("A3") = "№"
ws("B3") = "Наименование"
ws("C3") = "Количество"
ws("D3") = "Цена"
ws("E3") = "Сумма"
ws("A9") = "Итого:"

ws("A4") = "1"
ws("A5") = "2"
ws("A6") = "3"
ws("A7") = "4"
ws("A8") = "5"

ws("B4") = "ATMEGA8A-PU"
ws("B5") = "L7805"
ws("B6") = "100 uF 16V"
ws("B7") = "10 k 0,25 W"
ws("B8") = "BC557C"

ws("C4") = "1"
ws("C5") = "1"
ws("C6") = "2"
ws("C7") = "10"
ws("C8") = "8"

ws("D4") = 1
ws("D5") = 0.20000000000000001
ws("D6") = 0.10000000000000001
ws("D7") = 0.01
ws("D8") = 0.059999999999999998

'Стили
Dim MyStyleTitle As New WorksheetRangeStyle
With MyStyleTitle
    .Flag = PlainStyleFlag.FontSize Or PlainStyleFlag.HorizontalAlign Or PlainStyleFlag.VerticalAlign Or PlainStyleFlag.TextWrap
    .FontSize = 14
    .HAlign = ReoGridHorAlign.Center
    .VAlign = ReoGridVerAlign.Middle
    .TextWrapMode = TextWrapMode.WordBreak
End With

Dim MyStyleTableTitle As New WorksheetRangeStyle
With MyStyleTableTitle
    .Flag = PlainStyleFlag.FontStyleBold Or PlainStyleFlag.HorizontalAlign Or PlainStyleFlag.VerticalAlign Or PlainStyleFlag.TextWrap
    .Bold = True
    .HAlign = ReoGridHorAlign.Center
    .VAlign = ReoGridVerAlign.Middle
    .TextWrapMode = TextWrapMode.WordBreak
End With

Dim MyStyleTableBody As New WorksheetRangeStyle
With MyStyleTableBody
    .Flag = PlainStyleFlag.AlignAll 'HAlign+VAlign
    .HAlign = ReoGridHorAlign.Left
    .VAlign = ReoGridVerAlign.Middle
End With

Dim MyStyleTableTotal As New WorksheetRangeStyle
With MyStyleTableTotal
    .Flag = PlainStyleFlag.FontStyleBold Or PlainStyleFlag.AlignAll
    .Bold = True
    .HAlign = ReoGridHorAlign.Right
    .VAlign = ReoGridVerAlign.Middle
End With

ws.SetRangeStyles("A1:E1", MyStyleTitle)
ws.SetRangeStyles("A3:E3", MyStyleTableTitle)
ws.SetRangeStyles("A4:E8", MyStyleTableBody)
ws.SetRangeStyles("A9:E9", MyStyleTableTotal)

'Границы
Dim MyStyleSolidBold As New RangeBorderStyle
Dim MyStyleSolid As New RangeBorderStyle

MyStyleSolidBold.Style = BorderLineStyle.BoldSolid
MyStyleSolid.Style = BorderLineStyle.Solid

MyStyleSolidBold.Color = Color.Black
MyStyleSolid.Color = Color.Black

ws.SetRangeBorders("A4:E8", BorderPositions.All, MyStyleSolid)
ws.SetRangeBorders("A3:E3", BorderPositions.All, MyStyleSolidBold)
ws.SetRangeBorders("A9:E9", BorderPositions.All, MyStyleSolidBold)

'Формулы
ws.Cells("E4").Formula = "C4*D4"
ws.Cells("E5").Formula = "C5*D5"
ws.Cells("E6").Formula = "C6*D6"
ws.Cells("E7").Formula = "C7*D7"
ws.Cells("E8").Formula = "C8*D8"
ws.Cells("E9").Formula = "SUM(E4:E8)"

'Сохранение
Dim strFileName As String = Application.StartupPath & "\table.xlsx"
If File.Exists(strFileName) = True Then File.Delete(strFileName)
wb.Save(strFileName, IO.FileFormat.Excel2007)

'Открытие
Process.Start(strFileName)
MsgBox("Готово", MsgBoxStyle.Information, "Info")
C#

//using unvell.ReoGrid
//using unvell.ReoGrid.DataFormat
//using System.IO

//Создание экземпляров таблицы и листа
var wb = ReoGridControl.CreateMemoryWorkbook();
Worksheet ws = wb.Worksheets[0];

//Объединение ячеек
ws.MergeRange("A1:E1");
ws.MergeRange("A9:D9");

//Установка типа ячеек
NumberDataFormatter.NumberFormatArgs FFNum = new NumberDataFormatter.NumberFormatArgs();
FFNum.DecimalPlaces = 0;
FFNum.NegativeStyle = NumberDataFormatter.NumberNegativeStyle.Minus;
FFNum.UseSeparator = true;
ws.SetRangeDataFormat("A4:A8", CellDataFormatFlag.Number, FFNum);
ws.SetRangeDataFormat("C4:C8", CellDataFormatFlag.Number, FFNum);

CurrencyDataFormatter.CurrencyFormatArgs FFCur = new CurrencyDataFormatter.CurrencyFormatArgs();
FFCur.CultureEnglishName = "en-US"; //Культура
FFCur.DecimalPlaces = 2;
FFCur.PrefixSymbol = "$";
ws.SetRangeDataFormat("D4:D8", CellDataFormatFlag.Currency, FFCur);
ws.SetRangeDataFormat("E4:E9", CellDataFormatFlag.Currency, FFCur);

//Данные
ws["A1"] = "Перечень радиокомпонентов электронного устройства";
ws["A3"] = "№";
ws["B3"] = "Наименование";
ws["C3"] = "Количество";
ws["D3"] = "Цена";
ws["E3"] = "Сумма";
ws["A9"] = "Итого:";

ws["A4"] = "1";
ws["A5"] = "2";
ws["A6"] = "3";
ws["A7"] = "4";
ws["A8"] = "5";

ws["B4"] = "ATMEGA8A-PU";
ws["B5"] = "L7805";
ws["B6"] = "100 uF 16V";
ws["B7"] = "10 k 0,25 W";
ws["B8"] = "BC557C";

ws["C4"] = "1";
ws["C5"] = "1";
ws["C6"] = "2";
ws["C7"] = "10";
ws["C8"] = "8";

ws["D4"] = 1;
ws["D5"] = 0.20000000000000001;
ws["D6"] = 0.10000000000000001;
ws["D7"] = 0.01;
ws["D8"] = 0.059999999999999998;

//Стили
WorksheetRangeStyle MyStyleTitle = new WorksheetRangeStyle();
MyStyleTitle.Flag = PlainStyleFlag.FontSize | PlainStyleFlag.HorizontalAlign | PlainStyleFlag.VerticalAlign | PlainStyleFlag.TextWrap;
MyStyleTitle.FontSize = 14;
MyStyleTitle.HAlign = ReoGridHorAlign.Center;
MyStyleTitle.VAlign = ReoGridVerAlign.Middle;
MyStyleTitle.TextWrapMode = TextWrapMode.WordBreak;

WorksheetRangeStyle MyStyleTableTitle = new WorksheetRangeStyle();
MyStyleTableTitle.Flag = PlainStyleFlag.FontStyleBold | PlainStyleFlag.HorizontalAlign | PlainStyleFlag.VerticalAlign | PlainStyleFlag.TextWrap;
MyStyleTableTitle.Bold = true;
MyStyleTableTitle.HAlign = ReoGridHorAlign.Center;
MyStyleTableTitle.VAlign = ReoGridVerAlign.Middle;
MyStyleTableTitle.TextWrapMode = TextWrapMode.WordBreak;

WorksheetRangeStyle MyStyleTableBody = new WorksheetRangeStyle();
MyStyleTableBody.Flag = PlainStyleFlag.AlignAll; //HAlign+VAlign
MyStyleTableBody.HAlign = ReoGridHorAlign.Left;
MyStyleTableBody.VAlign = ReoGridVerAlign.Middle;

WorksheetRangeStyle MyStyleTableTotal = new WorksheetRangeStyle();
MyStyleTableTotal.Flag = PlainStyleFlag.FontStyleBold | PlainStyleFlag.AlignAll;
MyStyleTableTotal.Bold = true;
MyStyleTableTotal.HAlign = ReoGridHorAlign.Right;
MyStyleTableTotal.VAlign = ReoGridVerAlign.Middle;

ws.SetRangeStyles("A1:E1", MyStyleTitle);
ws.SetRangeStyles("A3:E3", MyStyleTableTitle);
ws.SetRangeStyles("A4:E8", MyStyleTableBody);
ws.SetRangeStyles("A9:E9", MyStyleTableTotal);

//Границы
RangeBorderStyle MyStyleSolidBold = new RangeBorderStyle();
RangeBorderStyle MyStyleSolid = new RangeBorderStyle();

MyStyleSolidBold.Style = BorderLineStyle.BoldSolid;
MyStyleSolid.Style = BorderLineStyle.Solid;

MyStyleSolidBold.Color = Color.Black;
MyStyleSolid.Color = Color.Black;

ws.SetRangeBorders("A4:E8", BorderPositions.All, MyStyleSolid);
ws.SetRangeBorders("A3:E3", BorderPositions.All, MyStyleSolidBold);
ws.SetRangeBorders("A9:E9", BorderPositions.All, MyStyleSolidBold);

//Формулы
ws.Cells["E4"].Formula = "C4*D4";
ws.Cells["E5"].Formula = "C5*D5";
ws.Cells["E6"].Formula = "C6*D6";
ws.Cells["E7"].Formula = "C7*D7";
ws.Cells["E8"].Formula = "C8*D8";
ws.Cells["E9"].Formula = "SUM(E4:E8)";

//Сохранение
string strFileName = Application.StartupPath + "\\table.xlsx";
if (File.Exists(strFileName) == true) File.Delete(strFileName);
wb.Save(strFileName, unvell.ReoGrid.IO.FileFormat.Excel2007);

//Открытие
Process.Start(strFileName);
MessageBox.Show("Готово", "Инфо", MessageBoxButtons.OK, MessageBoxIcon.Information);

Пример 4. Создание редактора электронных таблиц начального уровня за 27 минут (VB.Net)

Пример включает все этапы создания проекта в Visual Studio. Исходный код полученного приложения, снабженный комментариями на русском и английском языках, доступен по ссылке, расположенной ниже. При просмотре видео кое-где может потребоваться выставить более высокий темп воспроизведения.

Просмотреть видеодемонстрацию

Загрузить исходный код (Visual Studio 2012, 7-zip)


Мини-учебник подготовлен для сайта reogrid.net.

Программный код проверялся для VB.Net/С# 2012 синтаксическим анализатором Visual Studio. Код на Visual Basic проверен тестовым приложением.

В некоторых примерах использованы изображения из английской версии руководства, а также снимок экрана из проекта Euro Truck Simulator 2

Краткие описания функций Excel взяты с официального сайта офисного пакета.