|
| 1 | +--- |
| 2 | +title: Iterate Spreadsheet Data and Get Cell Values |
| 3 | +description: Learn how to iterate the Spreadsheet data cells and get their values as objects or strings. |
| 4 | +type: how-to |
| 5 | +page_title: How to Iterate Spreadsheet Data and Get Cell Values |
| 6 | +slug: spreadsheet-kb-get-cell-values |
| 7 | +tags: telerik, blazor, spreadsheet |
| 8 | +ticketid: 1661533 |
| 9 | +res_type: kb |
| 10 | +--- |
| 11 | + |
| 12 | +## Environment |
| 13 | + |
| 14 | +<table> |
| 15 | + <tbody> |
| 16 | + <tr> |
| 17 | + <td>Product</td> |
| 18 | + <td>Spreadsheet for Blazor</td> |
| 19 | + </tr> |
| 20 | + </tbody> |
| 21 | +</table> |
| 22 | + |
| 23 | +## Description |
| 24 | + |
| 25 | +This KB article answers the following questions: |
| 26 | + |
| 27 | +* How to iterate Spreadsheet cells? |
| 28 | +* How to get the Spreadsheet cell values? |
| 29 | +* How to obtain the data that users entered in the Blazor Spreadsheet? |
| 30 | + |
| 31 | +## Solution |
| 32 | + |
| 33 | +1. Install the required [Telerik Document Processing NuGet packages](https://docs.telerik.com/devtools/document-processing/libraries/radspreadprocessing/getting-started): |
| 34 | + * `Telerik.Documents.Spreadsheet` |
| 35 | + * `Telerik.Documents.Spreadsheet.FormatProviders.OpenXml` |
| 36 | +1. Set the [`@ref` attribute of the Spreadsheet]({%slug spreadsheet-overview%}#spreadsheet-reference-and-methods), so that you can call component methods. |
| 37 | +1. Use the [`ExportToExcelAsync()` Spreadsheet method]({%slug spreadsheet-overview%}#spreadsheet-reference-and-methods) to get the Excel file as a `byte[]`. |
| 38 | +1. Create a `MemoryStream` that contains the Excel file byte array. |
| 39 | + |
| 40 | + The steps below use the [Telerik RadSpreadProcessing API](https://docs.telerik.com/devtools/document-processing/api/) and are outside the scope of Telerik UI for Blazor. |
| 41 | + |
| 42 | +1. Use an [`XlsxFormatProvider` to import the Excel file as a `Workbook`](https://docs.telerik.com/devtools/document-processing/libraries/radspreadprocessing/formats-and-conversion/import-and-export-to-excel-file-formats/xlsx/xlsxformatprovider). |
| 43 | +1. Get the desired `Worksheet` object from the workbook. |
| 44 | +1. Get the desired `CellRange` from the worksheet. |
| 45 | +1. [Iterate the cell range](https://docs.telerik.com/devtools/document-processing/libraries/radspreadprocessing/working-with-cells/iterating-used-cells). |
| 46 | +1. Get each cell value (`ICellValue` object), cell value type (`CellValueType` object), and cell format (`CellValueFormat` object) to know more about the cell content. |
| 47 | +1. Use `ICellValue.RawValue` or `ICellValue.GetResultValueAsString(CellValueFormat cellFormat)` to obtain the actual cell content. |
| 48 | +1. [Excel stores dates as numbers](https://docs.telerik.com/devtools/document-processing/libraries/radspreadprocessing/working-with-cells/cell-value-types). Use [`FormatHelper.ConvertDoubleToDateTime(Convert.ToDouble(ICellValue.RawValue))`](https://docs.telerik.com/devtools/document-processing/api/telerik.windows.documents.spreadsheet.formatting.formathelper) to retrieve any `DateTime` values. |
| 49 | + |
| 50 | +>caption Iterate the Spreadsheet cells and get their values |
| 51 | +
|
| 52 | +<div class="skip-repl"></div> |
| 53 | + |
| 54 | +````CSHTML |
| 55 | +@using Telerik.Windows.Documents.Spreadsheet.FormatProviders |
| 56 | +@using Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx |
| 57 | +@using Telerik.Windows.Documents.Spreadsheet.Formatting |
| 58 | +@using Telerik.Windows.Documents.Spreadsheet.Formatting.FormatStrings |
| 59 | +@using Telerik.Windows.Documents.Spreadsheet.Model |
| 60 | +
|
| 61 | +<p> |
| 62 | + <TelerikButton ThemeColor="@ThemeConstants.Button.ThemeColor.Primary" |
| 63 | + OnClick="@OnButtonClick">Get Cell Values</TelerikButton> |
| 64 | + <TelerikLoader Visible="@LoaderVisible" /> |
| 65 | +</p> |
| 66 | +
|
| 67 | +<TelerikSpreadsheet @ref="@SpreadsheetRef" |
| 68 | + Data="@SpreadsheetData" |
| 69 | + Height="300px"> |
| 70 | +</TelerikSpreadsheet> |
| 71 | +
|
| 72 | +@if (SpreadsheetValues.Any()) |
| 73 | +{ |
| 74 | + <h3>Cell Values</h3> |
| 75 | + <table class="spreadsheet-values"> |
| 76 | + @foreach (KeyValuePair<int, List<object?>> row in SpreadsheetValues) |
| 77 | + { |
| 78 | + <tr> |
| 79 | + @foreach (var cell in row.Value) |
| 80 | + { |
| 81 | + <td>@cell</td> |
| 82 | + } |
| 83 | + </tr> |
| 84 | + } |
| 85 | + </table> |
| 86 | +
|
| 87 | + <h3>Cell Strings</h3> |
| 88 | + <table class="spreadsheet-values"> |
| 89 | + @foreach (KeyValuePair<int, List<string>> row in SpreadsheetStrings) |
| 90 | + { |
| 91 | + <tr> |
| 92 | + @foreach (var cell in row.Value) |
| 93 | + { |
| 94 | + <td>@cell</td> |
| 95 | + } |
| 96 | + </tr> |
| 97 | + } |
| 98 | + </table> |
| 99 | +} |
| 100 | +
|
| 101 | +<style> |
| 102 | + .spreadsheet-values { |
| 103 | + margin: 1em; |
| 104 | + } |
| 105 | +
|
| 106 | + .spreadsheet-values td { |
| 107 | + border: 1px solid #ccc; |
| 108 | + padding: .2em .4em; |
| 109 | + } |
| 110 | +</style> |
| 111 | +
|
| 112 | +@code { |
| 113 | + private TelerikSpreadsheet? SpreadsheetRef { get; set; } |
| 114 | + private byte[]? SpreadsheetData { get; set; } |
| 115 | +
|
| 116 | + private bool LoaderVisible { get; set; } |
| 117 | +
|
| 118 | + private Dictionary<int, List<object?>> SpreadsheetValues { get; set; } = new(); |
| 119 | + private Dictionary<int, List<string>> SpreadsheetStrings { get; set; } = new(); |
| 120 | +
|
| 121 | + private async Task OnButtonClick() |
| 122 | + { |
| 123 | + if (SpreadsheetRef == null) |
| 124 | + { |
| 125 | + return; |
| 126 | + } |
| 127 | +
|
| 128 | + SpreadsheetValues = new(); |
| 129 | + SpreadsheetStrings = new(); |
| 130 | +
|
| 131 | + LoaderVisible = true; |
| 132 | +
|
| 133 | + // Refresh the UI: https://docs.telerik.com/blazor-ui/components/loader/overview#creating-blazor-loader |
| 134 | + await Task.Delay(1); |
| 135 | +
|
| 136 | + byte[] excelFileToRead = await SpreadsheetRef.ExportToExcelAsync(); |
| 137 | +
|
| 138 | + using MemoryStream ms = new MemoryStream(excelFileToRead); |
| 139 | +
|
| 140 | + IWorkbookFormatProvider formatProvider = new XlsxFormatProvider(); |
| 141 | + Workbook workbook = formatProvider.Import(ms); |
| 142 | + Worksheet worksheet = workbook.Worksheets.First(); |
| 143 | +
|
| 144 | + CellRange cellRange = worksheet.UsedCellRange; |
| 145 | +
|
| 146 | + for (int rowIndex = cellRange.FromIndex.RowIndex; rowIndex <= cellRange.ToIndex.RowIndex; rowIndex++) |
| 147 | + { |
| 148 | + var rowValues = new List<object?>(); |
| 149 | + var rowStringValues = new List<string>(); |
| 150 | +
|
| 151 | + for (int columnIndex = cellRange.FromIndex.ColumnIndex; columnIndex <= cellRange.ToIndex.ColumnIndex; columnIndex++) |
| 152 | + { |
| 153 | + CellSelection cell = worksheet.Cells[rowIndex, columnIndex]; |
| 154 | + ICellValue cellValue = cell.GetValue().Value; |
| 155 | + CellValueType valueType = cellValue.ValueType; |
| 156 | + CellValueFormat cellFormat = cell.GetFormat().Value; |
| 157 | +
|
| 158 | + if (valueType == CellValueType.Number && |
| 159 | + cellFormat.FormatStringInfo.FormatType == FormatStringType.DateTime) |
| 160 | + { |
| 161 | + // Excel stores dates as numbers. |
| 162 | + // Excel date format strings differ from .NET format strings. |
| 163 | + DateTime? actualDateTimeValue = FormatHelper.ConvertDoubleToDateTime(Convert.ToDouble(cellValue.RawValue)); |
| 164 | +
|
| 165 | + rowValues.Add(actualDateTimeValue); |
| 166 | + rowStringValues.Add(cellValue.GetResultValueAsString(cellFormat)); |
| 167 | + } |
| 168 | + else if (valueType == CellValueType.Number) |
| 169 | + { |
| 170 | + double actualNumericValue = Convert.ToDouble(cellValue.RawValue); |
| 171 | +
|
| 172 | + rowValues.Add(actualNumericValue); |
| 173 | + rowStringValues.Add(actualNumericValue.ToString(cellFormat.FormatString)); |
| 174 | + } |
| 175 | + else if (valueType == CellValueType.Boolean) |
| 176 | + { |
| 177 | + bool actualBooleanValue = Convert.ToBoolean(cellValue.RawValue); |
| 178 | +
|
| 179 | + rowValues.Add(actualBooleanValue); |
| 180 | + rowStringValues.Add(actualBooleanValue.ToString().ToLowerInvariant()); |
| 181 | + } |
| 182 | + else if (valueType == CellValueType.Text || valueType == CellValueType.Empty) |
| 183 | + { |
| 184 | + rowValues.Add(cellValue.RawValue); |
| 185 | + rowStringValues.Add(cellValue.RawValue); |
| 186 | + } |
| 187 | + } |
| 188 | +
|
| 189 | + SpreadsheetValues.Add(rowIndex, rowValues); |
| 190 | + SpreadsheetStrings.Add(rowIndex, rowStringValues); |
| 191 | + } |
| 192 | +
|
| 193 | + LoaderVisible = false; |
| 194 | + } |
| 195 | +
|
| 196 | + protected override void OnInitialized() |
| 197 | + { |
| 198 | + SpreadsheetData = Convert.FromBase64String(Base64ExcelSource); |
| 199 | +
|
| 200 | + base.OnInitialized(); |
| 201 | + } |
| 202 | +
|
| 203 | + private const string Base64ExcelSource = "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"; |
| 204 | +} |
| 205 | +```` |
| 206 | + |
| 207 | +## See Also |
| 208 | + |
| 209 | +* [Spreadsheet Overview]({%slug spreadsheet-overview%}) |
| 210 | +* [Spreadsheet Tools]({%slug spreadsheet-tools%}) |
0 commit comments