Skip to content

Commit 45a0deb

Browse files
kb(Grid): Polish example (#3248)
Co-authored-by: Dimo Dimov <[email protected]>
1 parent cc16b4a commit 45a0deb

File tree

1 file changed

+127
-134
lines changed

1 file changed

+127
-134
lines changed

knowledge-base/grid-custom-cell-formatting-with-radspreadstreamprocessing.md

Lines changed: 127 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -79,171 +79,164 @@ To customize the cell format of the exported file before it reaches the client:
7979
</GridExport>
8080
8181
<GridColumns>
82-
<GridColumn Field="@nameof(SampleData.ProductId)" Title="ID" Width="100px" />
83-
<GridColumn Field="@nameof(SampleData.ProductName)" Title="Product Name" Width="300px" />
84-
<GridColumn Field="@nameof(SampleData.UnitsInStock)" Title="In stock" Width="100px" />
85-
<GridColumn Field="@nameof(SampleData.Price)" Title="Unit Price" Width="200px" />
86-
<GridColumn Field="@nameof(SampleData.Discontinued)" Title="Discontinued" Width="100px" />
87-
<GridColumn Field="@nameof(SampleData.FirstReleaseDate)" Title="Release Date" Width="300px" />
82+
<GridColumn Field="@nameof(Product.Id)" Title="ID" Width="60px" />
83+
<GridColumn Field="@nameof(Product.Name)" Title="Product Name" Width="180px" />
84+
<GridColumn Field="@nameof(Product.Price)" Width="160px" />
85+
<GridColumn Field="@nameof(Product.Quantity)" Width="120px" />
86+
<GridColumn Field="@nameof(Product.ReleaseDate)" Title="Release Date" DisplayFormat="{0:d}" Width="240px" />
87+
<GridColumn Field="@nameof(Product.Discontinued)" Width="160px" />
8888
</GridColumns>
8989
</TelerikGrid>
9090
9191
@code {
92-
private List<SampleData> GridData { get; set; }
92+
private List<Product> GridData { get; set; } = new();
9393
9494
private bool ExportAllPages { get; set; }
9595
96-
private async Task OnExcelAfterExport(GridAfterExcelExportEventArgs args)
96+
private void OnExcelAfterExport(GridAfterExcelExportEventArgs args)
9797
{
98-
var bytes = args.Stream.ToArray();
98+
byte[] bytes = args.Stream.ToArray();
9999
100-
var excelStream = new MemoryStream(bytes);
100+
using MemoryStream importStream = new MemoryStream(bytes);
101101
102-
var export = new MemoryStream();
102+
using MemoryStream exportStream = new MemoryStream();
103103
104-
//define the desired styling - https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/features/cell-styles
105-
SpreadCellFormat markedCell = new SpreadCellFormat()
106-
{
107-
Fill = SpreadPatternFill.CreateSolidFill(new SpreadColor(230, 238, 223)),
108-
IsBold = true
109-
};
104+
// Define the desired styling.
105+
// https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/features/cell-styles
106+
SpreadCellFormat customCellFormat = new SpreadCellFormat()
107+
{
108+
Fill = SpreadPatternFill.CreateSolidFill(new SpreadColor(230, 238, 223)),
109+
IsBold = true
110+
};
111+
112+
// Import the stream to modify it and then export it.
113+
// https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/model/workbook
114+
using IWorkbookImporter workBookImporter = SpreadImporter.CreateWorkbookImporter(SpreadDocumentFormat.Xlsx, importStream);
110115
111-
//import the stream to modify it and then export it -
112-
//see https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/model/workbook
113-
using (excelStream)
116+
using IWorkbookExporter workbookExporter = SpreadExporter.CreateWorkbookExporter(SpreadDocumentFormat.Xlsx, exportStream);
117+
118+
// Loop through the sheets to copy their content.
119+
foreach (IWorksheetImporter worksheetImporter in workBookImporter.WorksheetImporters)
114120
{
115-
using (IWorkbookImporter workBookImporter = SpreadImporter.CreateWorkbookImporter(SpreadDocumentFormat.Xlsx, excelStream))
121+
using IWorksheetExporter worksheetExporter = workbookExporter.CreateWorksheetExporter(worksheetImporter.Name);
122+
123+
// Set fixed width to all columns.
124+
// If you need to autofit the content, use the CellContentSizeHelper:
125+
//https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/features/text-measuring
126+
for (int i = 0; i < 6; i++)
127+
{
128+
IColumnExporter column = worksheetExporter.CreateColumnExporter();
129+
130+
column.SetWidthInPixels(160);
131+
132+
column.Dispose();
133+
}
134+
135+
int lastRow = 0;
116136
117-
using (IWorkbookExporter workbookExporter = SpreadExporter.CreateWorkbookExporter(SpreadDocumentFormat.Xlsx, export))
137+
// Loop through the rows to copy their content.
138+
foreach (IRowImporter rowImporter in worksheetImporter.Rows)
118139
{
119-
//loop through the sheets to copy their content
120-
foreach (IWorksheetImporter worksheetImporter in workBookImporter.WorksheetImporters)
140+
int rowDifference = rowImporter.RowIndex - lastRow;
141+
142+
// Ensure proper row order in case there are any empty rows.
143+
if (rowDifference > 1)
121144
{
122-
using (var worksheetExporter = workbookExporter.CreateWorksheetExporter(worksheetImporter.Name))
145+
worksheetExporter.SkipRows(rowDifference - 1);
146+
}
147+
148+
int lastColumn = 0;
149+
150+
using IRowExporter rowExporter = worksheetExporter.CreateRowExporter();
151+
152+
// Loop through the cells to copy their content.
153+
foreach (ICellImporter cellImporter in rowImporter.Cells)
154+
{
155+
string value = cellImporter.Value;
156+
157+
if (string.IsNullOrEmpty(value))
123158
{
124-
//this sets fixed width to all columns.
125-
//If you need to autofit the content, use the CellContentSizeHelper -
126-
//https://docs.telerik.com/devtools/document-processing/libraries/radspreadstreamprocessing/features/text-measuring
127-
for (int i = 0; i < 5; i++)
128-
{
129-
var column = worksheetExporter.CreateColumnExporter();
130-
131-
column.SetWidthInPixels(100);
132-
133-
column.Dispose();
134-
}
135-
136-
int lastRow = 0;
137-
138-
//loop through the rows to copy their content
139-
foreach (IRowImporter rowImporter in worksheetImporter.Rows)
140-
{
141-
int rowDifference = rowImporter.RowIndex - lastRow;
142-
143-
//this part ensures the proper cells order in case there are any empty rows
144-
if (rowDifference > 1)
145-
{
146-
worksheetExporter.SkipRows(rowDifference - 1);
147-
}
148-
149-
int lastColumn = 0;
150-
151-
using (var rowExporter = worksheetExporter.CreateRowExporter())
152-
{
153-
//loop through the cells to copy their content
154-
foreach (ICellImporter cellImporter in rowImporter.Cells)
155-
{
156-
string value = cellImporter.Value;
157-
158-
if (string.IsNullOrEmpty(value))
159-
{
160-
continue;
161-
}
162-
163-
var valueType = cellImporter.ValueType;
164-
165-
166-
var importedFormat = new SpreadCellFormat();
167-
168-
if (cellImporter.Format != null)
169-
{
170-
importedFormat = cellImporter.Format;
171-
}
172-
173-
174-
int cellDifference = cellImporter.ColumnIndex - lastColumn;
175-
176-
//this part ensures the proper cells order in case there are any empty cells
177-
if (cellDifference > 1)
178-
{
179-
rowExporter.SkipCells(cellDifference - 1);
180-
}
181-
182-
//check the cell value to apply proper formatting
183-
using (var cellExporter = rowExporter.CreateCellExporter())
184-
{
185-
switch (valueType)
186-
{
187-
case CellValueType.Boolean:
188-
var boolValue = bool.Parse(value);
189-
cellExporter.SetValue(boolValue);
190-
break;
191-
case CellValueType.Number:
192-
var dateNumberValue = double.Parse(value);
193-
cellExporter.SetFormat(importedFormat);
194-
cellExporter.SetValue(dateNumberValue);
195-
break;
196-
case CellValueType.Error:
197-
case CellValueType.Text:
198-
case CellValueType.SharedString:
199-
case CellValueType.RichText:
200-
cellExporter.SetValue(value);
201-
break;
202-
}
203-
204-
//apply the defined style to the desired cells
205-
if (cellImporter.RowIndex == 0)
206-
{
207-
cellExporter.SetFormat(markedCell);
208-
}
209-
}
210-
211-
lastColumn = cellImporter.ColumnIndex;
212-
}
213-
}
214-
215-
lastRow = rowImporter.RowIndex;
216-
}
159+
continue;
217160
}
161+
162+
CellValueType valueType = cellImporter.ValueType;
163+
164+
SpreadCellFormat importedFormat = new SpreadCellFormat();
165+
166+
if (cellImporter.Format != null)
167+
{
168+
importedFormat = cellImporter.Format;
169+
}
170+
171+
int cellDifference = cellImporter.ColumnIndex - lastColumn;
172+
173+
// Ensure proper cell order in case there are any empty cells.
174+
if (cellDifference > 1)
175+
{
176+
rowExporter.SkipCells(cellDifference - 1);
177+
}
178+
179+
// Check the cell value to apply proper formatting.
180+
using ICellExporter cellExporter = rowExporter.CreateCellExporter();
181+
182+
switch (valueType)
183+
{
184+
case CellValueType.Boolean:
185+
bool boolValue = bool.Parse(value);
186+
cellExporter.SetValue(boolValue);
187+
break;
188+
case CellValueType.Number:
189+
double dateNumberValue = double.Parse(value);
190+
cellExporter.SetFormat(importedFormat);
191+
cellExporter.SetValue(dateNumberValue);
192+
break;
193+
case CellValueType.Error:
194+
case CellValueType.Text:
195+
case CellValueType.SharedString:
196+
case CellValueType.RichText:
197+
cellExporter.SetValue(value);
198+
break;
199+
}
200+
201+
// Apply the defined style to the desired cells.
202+
if (cellImporter.RowIndex == 0)
203+
{
204+
cellExporter.SetFormat(customCellFormat);
205+
}
206+
207+
lastColumn = cellImporter.ColumnIndex;
218208
}
209+
210+
lastRow = rowImporter.RowIndex;
219211
}
220212
}
221213
222-
//pass the modified stream to the event arguments
223-
args.Stream = export;
214+
// Pass the modified stream to the GridAfterExcelExportEventArgs event argument.
215+
args.Stream = exportStream;
224216
}
225217
226218
protected override void OnInitialized()
227219
{
228-
GridData = Enumerable.Range(1, 100).Select(x => new SampleData
229-
{
230-
ProductId = x,
231-
ProductName = "Product " + x,
232-
UnitsInStock = x * 2,
233-
Price = 3.14159m * x,
234-
Discontinued = x % 4 == 0,
235-
FirstReleaseDate = DateTime.Now.AddDays(-x)
236-
}).ToList();
220+
Random rnd = Random.Shared;
221+
GridData = Enumerable.Range(1, 100).Select(x => new Product
222+
{
223+
Id = x,
224+
Name = $"Product {x}",
225+
Price = rnd.Next(1, 100) * 1.23m,
226+
Quantity = rnd.Next(0, 100),
227+
ReleaseDate = DateTime.Now.AddDays(-rnd.Next(1, 1000)),
228+
Discontinued = x % 4 == 0
229+
}).ToList();
237230
}
238231
239-
public class SampleData
232+
public class Product
240233
{
241-
public int ProductId { get; set; }
242-
public string ProductName { get; set; }
243-
public int UnitsInStock { get; set; }
234+
public int Id { get; set; }
235+
public string Name { get; set; } = string.Empty;
244236
public decimal Price { get; set; }
237+
public int Quantity { get; set; }
238+
public DateTime ReleaseDate { get; set; }
245239
public bool Discontinued { get; set; }
246-
public DateTime FirstReleaseDate { get; set; }
247240
}
248241
}
249242
````

0 commit comments

Comments
 (0)