1111using FileExporter . Rules ;
1212using SpreadCheetah ;
1313using SpreadCheetah . Styling ;
14+ using SpreadCheetah . Tables ;
1415using SpreadCheetah . Worksheets ;
1516
1617namespace FileExporter . Exporters ;
@@ -76,8 +77,13 @@ private static async Task<byte[]> CreateXlsxFileAsync<T>(IEnumerable<T> dataSlic
7677 var options = new WorksheetOptions ( ) ;
7778 ApplyColumnWidths ( options , columns ) ;
7879
80+ options . FrozenRows = 1 ;
81+
7982 await spreadsheet . StartWorksheetAsync ( sheetName , options , token : cancellationToken ) ;
8083
84+ var table = new Table ( TableStyle . Medium2 ) ;
85+ spreadsheet . StartTable ( table ) ;
86+
8187 var headerStyleId = AddHeaderStyle ( spreadsheet ) ;
8288 await AddHeaderRowAsync ( spreadsheet , columns , headerStyleId , cancellationToken ) ;
8389
@@ -102,6 +108,7 @@ private static async Task<byte[]> CreateXlsxFileAsync<T>(IEnumerable<T> dataSlic
102108 return ms . ToArray ( ) ;
103109 }
104110
111+
105112 private static List < ExportColumn > BuildColumns < T > ( ExportRule < T > rule )
106113 where T : class
107114 {
@@ -309,26 +316,26 @@ private static Cell CreateCell(object value)
309316 {
310317 return value switch
311318 {
312- string s => new Cell ( s ) ,
313- bool b => new Cell ( b ) ,
314- int i => new Cell ( i ) ,
315- long l => new Cell ( l ) ,
316- short sh => new Cell ( sh ) ,
317- byte b8 => new Cell ( b8 ) ,
318- uint ui => new Cell ( ( double ) ui ) ,
319- ulong ul => new Cell ( ( double ) ul ) ,
320- float f => new Cell ( ( double ) f ) ,
321- double d => new Cell ( d ) ,
322- decimal m => new Cell ( ( double ) m ) ,
319+ string s => new Cell ( s ) ,
320+ bool b => new Cell ( b ) ,
321+ int i => new Cell ( i ) ,
322+ long l => new Cell ( l ) ,
323+ short sh => new Cell ( sh ) ,
324+ byte b8 => new Cell ( b8 ) ,
325+ uint ui => new Cell ( ( double ) ui ) ,
326+ ulong ul => new Cell ( ( double ) ul ) ,
327+ float f => new Cell ( ( double ) f ) ,
328+ double d => new Cell ( d ) ,
329+ decimal m => new Cell ( ( double ) m ) ,
323330
324331 DateTime dt => CreateDateCell ( dt ) ,
325- DateOnly d => CreateDateCell ( d . ToDateTime ( TimeOnly . MinValue ) ) ,
326- TimeOnly t => CreateDateCell ( DateTime . Today . Add ( t . ToTimeSpan ( ) ) ) ,
332+ DateOnly d => CreateDateCell ( d . ToDateTime ( TimeOnly . MinValue ) ) ,
333+ TimeOnly t => CreateDateCell ( DateTime . Today . Add ( t . ToTimeSpan ( ) ) ) ,
327334
328335 _ => new Cell ( value . ToString ( ) ?? string . Empty )
329336 } ;
330337 }
331-
338+
332339 private static Cell CreateDateCell ( DateTime dt )
333340 {
334341 try
@@ -355,9 +362,7 @@ private static async Task<byte[]> CreateMultiSheetXlsxFileAsync<T>(IList<T> list
355362
356363 await using ( var spreadsheet = await Spreadsheet . CreateNewAsync ( ms , cancellationToken : cancellationToken ) )
357364 {
358- // Sanitize once for sheet names
359365 var sanitizedBaseName = rule . FileName . ToValidName ( ExportLimits . MaxSheetNameLength ) ;
360-
361366 var headerStyleId = AddHeaderStyle ( spreadsheet ) ;
362367
363368 var totalRows = list . Count ;
@@ -366,13 +371,18 @@ private static async Task<byte[]> CreateMultiSheetXlsxFileAsync<T>(IList<T> list
366371 for ( var offset = 0 ; offset < totalRows ; offset += rowsPerSheet , sheetIndex ++ )
367372 {
368373 var take = Math . Min ( rowsPerSheet , totalRows - offset ) ;
369-
370374 var sheetName = BuildSheetName ( sanitizedBaseName , sheetIndex ) ;
371375
372376 var options = new WorksheetOptions ( ) ;
373377 ApplyColumnWidths ( options , columns ) ;
374378
379+ options . FrozenRows = 1 ;
380+
375381 await spreadsheet . StartWorksheetAsync ( sheetName , options , token : cancellationToken ) ;
382+
383+ var table = new Table ( TableStyle . Medium2 ) ;
384+ spreadsheet . StartTable ( table ) ;
385+
376386 await AddHeaderRowAsync ( spreadsheet , columns , headerStyleId , cancellationToken ) ;
377387
378388 for ( var i = 0 ; i < take ; i ++ )
0 commit comments