@@ -163,6 +163,9 @@ const App = () => {
163
163
const textAreaId = useId ( "textarea" ) ;
164
164
const [ isWriteLoading , setIsWriteLoading ] = useState ( false ) ;
165
165
const [ writeErrorMessage , setWriteErrorMessage ] = useState < string > ( ) ;
166
+ const [ writeProcessedRows , setWriteProcessedRows ] = useState ( 0 ) ;
167
+ const [ writeTotalRows , setWriteTotalRows ] = useState ( 0 ) ;
168
+ const writeSheetPercent = writeTotalRows > 0 ? ( ( writeProcessedRows / writeTotalRows ) * 100 ) . toFixed ( 2 ) : 0 ;
166
169
167
170
const incrementProcessedRows = ( ) => {
168
171
setProcessedRows ( ( state ) => state + 1 ) ;
@@ -460,6 +463,18 @@ const App = () => {
460
463
return columnName ;
461
464
}
462
465
const writeWorkbook = async ( jsonData : any ) => {
466
+ setWriteProcessedRows ( 0 ) ;
467
+ let totalRows = 0 ;
468
+ jsonData . worksheets . forEach ( sheet => {
469
+ // Count max row index in each worksheet
470
+ let maxRow = 0 ;
471
+ Object . values ( sheet . cells ) . forEach ( ( cell : any ) => {
472
+ maxRow = Math . max ( maxRow , cell . rowIndex ) ;
473
+ } ) ;
474
+ totalRows += maxRow + 1 ;
475
+ } ) ;
476
+ setWriteTotalRows ( totalRows ) ;
477
+ let writtenRows = 0 ;
463
478
await Excel . run ( async ( context ) => {
464
479
try {
465
480
const ROW_CHUNK_SIZE = 2 ; // Adjust based on performance needs
@@ -479,7 +494,6 @@ const App = () => {
479
494
480
495
context . application . suspendScreenUpdatingUntilNextSync ( ) ;
481
496
482
-
483
497
let sheet_cells = worksheet . getRange ( sheetData . cells [ Object . keys ( sheetData . cells ) [ 0 ] ] . address + ":" + sheetData . cells [ Object . keys ( sheetData . cells ) [ Object . keys ( sheetData . cells ) . length - 1 ] ] . address ) ;
484
498
const { properties, formulas, numberFormats } = parseExcelJsonTo2DArrays ( sheetData . cells ) ;
485
499
@@ -490,6 +504,12 @@ const App = () => {
490
504
} ) ;
491
505
sheet_cells . setCellProperties ( properties ) ;
492
506
507
+ // Simulate row-wise progress update
508
+ for ( let row = 0 ; row < formulas . length ; row ++ ) {
509
+ writtenRows ++ ;
510
+ setWriteProcessedRows ( writtenRows ) ;
511
+ }
512
+
493
513
sheet_cells . untrack ( ) ;
494
514
await context . sync ( ) ;
495
515
}
@@ -656,6 +676,15 @@ const App = () => {
656
676
</ Button >
657
677
</ div >
658
678
679
+ { isWriteLoading && (
680
+ < div className = { styles . progressContainer } >
681
+ < Text className = { styles . progressText } >
682
+ Writing Row { writeProcessedRows } of { writeTotalRows } ({ writeSheetPercent } %)
683
+ </ Text >
684
+ < ProgressBar value = { Number ( writeSheetPercent ) / 100 } />
685
+ </ div >
686
+ ) }
687
+
659
688
{ writeErrorMessage && (
660
689
< Text className = { styles . errorMessage } > { writeErrorMessage } </ Text >
661
690
) }
0 commit comments