package Ġme . roy ba iley . neo 4 k . reporting . visitor Ċ Ċ import Ġme . roy ba iley . neo 4 k . reporting . Report Context Ċ import Ġme . roy ba iley . neo 4 k . reporting . Report Event Ċ import Ġme . roy ba iley . neo 4 k . reporting . Simple Report Visitor Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . apache . poi . h ss f . user model . H SS F Workbook Ċ import Ġorg . apache . poi . ss . user model . Cell Type Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . lang . Double . parseDouble Ċ import Ġjava . lang . String . valueOf ĊĊ Ċ class ĠExcel Report Visitor ( ĊĠĠĠĠĠĠĠ Ġreport Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġwriter : ĠOutputStream Ġ= ĠByteArrayOutputStream (), ĊĠĠĠĠĠĠĠ Ġval Ġworkbook : ĠH SS F Workbook Ġ= ĠH SS F Workbook () Ċ ) Ġ: ĠSimple Report Visitor ( report Name ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġreport Visit ( ctx : ĠReport Context ): ĠReport Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsuper . report Visit ( ctx ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ctx . evt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReport Event . END _ REPORT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Excel Report () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Excel Report () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcreate Helper Ġ= Ġworkbook . creation Helper ĊĠĠĠĠĠĠĠ Ġval Ġsheet Ġ= Ġworkbook . create Sheet ( report Name ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġr dx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġsheet . create Row ( rdx ++) ĊĠĠĠĠĠĠĠ Ġlist Columns . forEach Indexed Ġ{ Ġidx , Ġname Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" col =$ idx Ġnow =${ sheet . getColumn Width ( idx )} Ġlen =${ valueOf ( name ). length } Ġcal =${ list Column Widths [ idx ]} Ġdef =${ sheet . default Column Width }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġseems Ġinconsistent Ġto Ġcalculate Ġnew Ġwidths Ġfor Ġdifferent Ġplatforms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġusing Ġthe Ġdefault Width Ġas Ġmore Ġreliable Ġmeasure Ġof Ġ~ 7 Ġcharacters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcol Width Ġ= Ġsheet . getColumn Width ( idx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Max Width Ġ= Ġcol Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcalc Max Width Ġ= ĠMath . min ( list Column Widths [ idx ], Ġ 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( calc Max Width Ġ> Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Max Width Ġ+= Ġcol Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Max Width Ġ-= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsheet . set Column Width ( idx , Ġnew Max Width ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrow . create Cell ( idx , ĠCell Type . STRING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell . setCellValue ( valueOf ( name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata . forEach Indexed Ġ{ Ġidx , Ġvalues Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġ= Ġsheet . create Row ( rdx ++) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . values . forEach Indexed Ġ{ Ġidx , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber , ĠInt , ĠLong , ĠFloat , ĠDouble Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrow . create Cell ( idx , ĠCell Type . NUMERIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . setCellValue ( parseDouble ( valueOf ( value ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrow . create Cell ( idx , ĠCell Type . STRING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell . setCellValue ( valueOf ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsheet . create Freeze Pane ( 0 , 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwriter . toString () Ċ } ĊĊ