Spreadsheet Tools
The Telerik Blazor Spreadsheet organizes all its tools in a tool set with one or more tool set items. This article describes the built-in Spreadsheet tools and how to define custom tools.
- The building blocks of the Spreadsheet tool set
- The built-in Spreadsheet tools
- How to customize a built-in tool set
- How to define a custom tool set from scratch
- How to create a custom tool
Tool Set
The top of the Spreadsheet component displays a Menu and a ToolBar:
- The Menu and the ToolBar make up the Spreadsheet tool set (
SpreadsheetToolSet
). - The tool set has an
Items
property and includes one or more tool set items (SpreadsheetToolSetItem
). Each Menu item points to one tool set item. - Each tool set item includes one or more tools (
SpreadsheetTool
).
The SpreadsheetToolSetItem
class has the following properties:
Property Name | Type | Description |
---|---|---|
Title |
string |
The tool set name. Regard this as a single Menu item. |
Tools |
List<SpreadsheetTool> |
The collection of tools in the tool set item. Regard this collection as one TooBar instance. |
The Spreadsheet provides ready-to-use SpreadsheetToolSet
objects, for example, SpreadsheetToolSets.All
. A tool set provides a specific distribution and order of tools across tool set items. However, each tool can exist in any tool set item.
Built-in Tools
The following table lists all Spreadsheet tools, sorted by their default tool set and order index.
Tool Name | Class Name | Default Tool Set |
---|---|---|
Open | SpreadsheetOpenFileTool |
File |
Download | SpreadsheetDownloadFileTool |
File |
Undo | SpreadsheetUndoTool |
Home |
Redo | SpreadsheetRedoTool |
Home |
Font Family | SpreadsheetFontFamilyTool |
Home |
Font Size | SpreadsheetFontSizeTool |
Home |
Bold | SpreadsheetBoldTool |
Home |
Italic | SpreadsheetItalicTool |
Home |
Underline | SpreadsheetUnderlineTool |
Home |
Text Color | SpreadsheetTextColorTool |
Home |
Background Color | SpreadsheetBackgroundColorTool |
Home |
Horizontal Align | SpreadsheetHorizontalAlignTool |
Home |
Vertical Align | SpreadsheetVerticalAlignTool |
Home |
Text Wrap | SpreadsheetTextWrapTool |
Home |
Number and Date Format | SpreadsheetNumberFormatTool |
Format |
Decrease Decimals | SpreadsheetDecreaseDecimalTool |
Format |
Increase Decimals | SpreadsheetIncreaseDecimalTool |
Format |
Insert Link | SpreadsheetInsertLinkTool |
Insert |
Insert Image | SpreadsheetInsertImageTool |
Insert |
Merge Cells | SpreadsheetMergeCellsTool |
View |
Toggle Grid Lines | SpreadsheetGridLinesTool |
View |
The Spreadsheet component provides a few tools that have no specific action:
Tool Name | Class Name | Description |
---|---|---|
Separator | SpreadsheetToolSeparator |
The Separator tool inserts a visible border between other tools in the same tool set. |
Custom | SpreadsheetCustomTool |
The Custom tool allows you to add custom content to a Spreadsheet tool set. |
Customize Built-in Tool Sets
The Spreadsheet uses Telerik Blazor components to create its built-in tool sets and tools. You can add, remove, and reorder tools in the built-in tool sets. You can also customize the exposed tool properties.
The example below shows how to:
- Get the File and Home tool set items. The built-in tool set items are distinguishable by their index or
Title
. The title can change in localized applications, so you may need to use theITelerikStringLocalizer
service to search for the localizedTitle
string. - Change the label of the File tool set item.
- Obtain reference to a few built-in tools inside the Home tool set item. You can find tools by their type or order index. Using order index is not future-proof, as the built-in tool sets can change.
- Set the
Data
property of the Font Family and Font Size tools to change the available drop down options. - Set the
Colors
property of the Text Color and Background Color tools to change the available color palettes. - Disable or remove the Text Wrap tool.
@using Telerik.Blazor.Components.Spreadsheet
@using Telerik.Blazor.Components.Spreadsheet.ToolBar.ToolTypes
@using Telerik.Blazor.Resources
@using Telerik.Blazor.Services
@inject ITelerikStringLocalizer Localizer
<TelerikSpreadsheet Tools="@DefaultToolsWithCustomizations">
</TelerikSpreadsheet>
@code {
private SpreadsheetToolSet DefaultToolsWithCustomizations { get; set; } = SpreadsheetToolSets.All;
protected override void OnInitialized()
{
// Find the built-in File tool set item by its index.
SpreadsheetToolSetItem? fileToolSetItem = DefaultToolsWithCustomizations.Items.FirstOrDefault();
// Rename the File tool set item
if (fileToolSetItem != null)
{
fileToolSetItem.Title = "Custom File Label";
}
// Find the built-in Home tool set item by its localized title.
// You can hard-code the title string (for example, "Home") if the application is using just one language.
SpreadsheetToolSetItem? homeToolSetItem = DefaultToolsWithCustomizations.Items
.FirstOrDefault(x => x.Title == Localizer[nameof(Messages.Spreadsheet_ToolBar_HomeMenu)]);
var fontFamilyTool = homeToolSetItem?.Tools.FirstOrDefault(x => x is SpreadsheetFontFamilyTool) as SpreadsheetFontFamilyTool;
if (fontFamilyTool != null)
{
// Change the Font Family tool data.
fontFamilyTool.Data = new List<SpreadsheetDropDownListToolItem>()
{
new SpreadsheetDropDownListToolItem { Text = "Arial", Value = "Arial" },
new SpreadsheetDropDownListToolItem { Text = "Helvetica", Value = "Helvetica" },
new SpreadsheetDropDownListToolItem { Text = "Tahoma", Value = "Tahoma" },
new SpreadsheetDropDownListToolItem { Text = "Verdana", Value = "Verdana" }
};
}
var fontSizeTool = homeToolSetItem?.Tools.FirstOrDefault(x => x is SpreadsheetFontSizeTool) as SpreadsheetFontSizeTool;
if (fontSizeTool != null)
{
// Change the Font Size tool width.
fontSizeTool.Width = "6em";
// Change the Font Size tool data.
fontSizeTool.Data = new List<SpreadsheetDropDownListToolItem>()
{
new SpreadsheetDropDownListToolItem { Text = "12px", Value = "12px" },
new SpreadsheetDropDownListToolItem { Text = "16px", Value = "16px" },
new SpreadsheetDropDownListToolItem { Text = "24px", Value = "24px" },
new SpreadsheetDropDownListToolItem { Text = "36px", Value = "36px" }
};
}
var textColorTool = homeToolSetItem?.Tools.FirstOrDefault(x => x is SpreadsheetTextColorTool) as SpreadsheetTextColorTool;
if (textColorTool != null)
{
// Change the Text Color tool palette.
textColorTool.Colors = ColorPalettePresets.Basic;
}
var backgroundColorTool = homeToolSetItem?.Tools.FirstOrDefault(x => x is SpreadsheetTextColorTool) as SpreadsheetTextColorTool;
if (backgroundColorTool != null)
{
// Change the Background Color tool palette.
backgroundColorTool.Colors = ColorPalettePresets.Office;
}
var wrapTool = homeToolSetItem?.Tools.FirstOrDefault(x => x is SpreadsheetTextWrapTool) as SpreadsheetTextWrapTool;
if (wrapTool != null)
{
// Disable the Wrap tool.
//wrapTool.Enabled = false;
// Or remove the Wrap tool.
homeToolSetItem?.Tools.Remove(wrapTool);
}
base.OnInitialized();
}
}
Create a Custom Tool Set
Here is how to define a custom tool set from scratch. You can also set the available properties of each tool, such as Class
, Enabled
, Icon
, and Title
.
- Set the Spreadsheet
Tools
parameter to a newSpreadsheetToolSet
instance, for example,SpreadsheetTools
. - Set the
Items
property ofSpreadsheetTools
to anew List<SpreadsheetToolSetItem>()
. - Add one or more
SpreadsheetToolSetItem
objects to theItems
list. - Populate each
SpreadsheetToolSetItem
object with built-in tools or custom tools.
@using Telerik.Blazor.Components.Spreadsheet
<TelerikSpreadsheet Tools="@SpreadsheetTools">
</TelerikSpreadsheet>
@code {
private SpreadsheetToolSet SpreadsheetTools { get; set; } = new SpreadsheetToolSet();
protected override void OnInitialized()
{
SpreadsheetTools.Items = new List<SpreadsheetToolSetItem>()
{
new SpreadsheetToolSetItem()
{
Title = "Custom Tool Set Item",
Tools = new List<SpreadsheetTool>()
{
new SpreadsheetOpenFileTool(),
new SpreadsheetDownloadFileTool(),
new SpreadsheetToolSeparator(),
new SpreadsheetUndoTool(),
new SpreadsheetRedoTool(),
new SpreadsheetToolSeparator(),
new SpreadsheetHorizontalAlignTool(),
new SpreadsheetTextWrapTool(),
new SpreadsheetNumberFormatTool(),
new SpreadsheetInsertLinkTool()
}
}
};
base.OnInitialized();
}
}
Define Custom Tools
The SpreadsheetCustomTool
type has a Template
property that is a RenderFragment
. Generally, custom tools can do one of the following:
- Perform actions that relate to the Spreadsheet component, loaded Excel document, or app business logic.
- Modify the Excel document programmatically with the help of RadSpreadProcessing.
@using Telerik.Blazor.Components.Spreadsheet
<p>Click on <strong>File</strong> to see and use the custom tool.</p>
<TelerikSpreadsheet Data="@SpreadsheetData"
Tools="@SpreadsheetToolsWithCustomTool">
</TelerikSpreadsheet>
@code {
private byte[]? SpreadsheetData { get; set; }
private SpreadsheetToolSet SpreadsheetToolsWithCustomTool { get; set; } = SpreadsheetToolSets.All;
protected override void OnInitialized()
{
SpreadsheetToolSetItem fileToolSetItem = SpreadsheetToolsWithCustomTool.Items.First();
// Add a custom tool to the first tool set item
fileToolSetItem.Tools.Add(new SpreadsheetCustomTool()
{
Template = CustomToolFragment
});
base.OnInitialized();
}
private RenderFragment CustomToolFragment =>
@<TelerikButton Icon="@SvgIcon.FileExcel"
ButtonType="@ButtonType.Button"
ThemeColor="@ThemeConstants.Button.ThemeColor.Primary"
Title="Load Excel Template"
FillMode="@ThemeConstants.Button.FillMode.Flat"
OnClick="@OnCustomToolClick">
</TelerikButton>;
private void OnCustomToolClick()
{
SpreadsheetData = Convert.FromBase64String(SampleExcelFile);
}
private string SampleExcelFile = "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";
}