package Ġarray . mso ffic ere ader Ċ Ċ import Ġarray .* Ċ import Ġarray . builtins . Tag Catch Ċ import Ġarray . builtins . make Boolean Ċ import Ġorg . apache . poi . ss . user model .* Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ Ċ fun Ġread Excel File ( name : ĠString ): ĠA PL Value Ġ{ ĊĠĠĠ Ġval Ġworkbook Ġ= ĠWork book Factory . create ( File ( name )) ĊĠĠĠ Ġval Ġevaluator Ġ= Ġworkbook . creation Helper . create Formula Evaluator () ĊĠĠĠ Ġval Ġsheet Ġ= Ġworkbook . get Sheet At ( 0 ) ĊĠĠĠ Ġif Ġ( sheet . physical NumberOf Rows Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠA PL NullValue . AP L _ NULL _ INSTANCE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlast RowIndex Ġ= Ġsheet . last Row Num ĊĠĠĠ Ġval Ġrows Ġ= ĠArrayList < List < AP L Value >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. last RowIndex ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġread Row ( sheet . getRow ( i ), Ġevaluator ) ĊĠĠĠĠĠĠĠ Ġrows . add ( row ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġwidth Ġ= Ġrows . max Value By Ġ{ Ġit . size Ġ} ĊĠĠĠ Ġreturn ĠA PL Array Impl . make ( dimensions Of Size ( rows . size , Ġwidth )) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠ Ġval ĠrowIndex Ġ= Ġi Ġ/ Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġcol Index Ġ= Ġi Ġ% Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġrows [ rowIndex ] ĊĠĠĠĠĠĠĠ Ġif Ġ( col Index Ġ< Ġrow . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow [ col Index ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA PL NullValue . AP L _ NULL _ INSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġread Row ( row : ĠRow , Ġevaluator : ĠFormula Evaluator ): ĠList < AP L Value > Ġ{ ĊĠĠĠ Ġval Ġcell List Ġ= ĠArrayList < AP L Value >() ĊĠĠĠ Ġval Ġlast Cell Index Ġ= Ġrow . last Cell Num ĊĠĠĠ Ġvar Ġnum Pending Null s Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlast Cell Index ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġrow . getCell ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cell Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Pending Null s ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( num Pending Null s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell List . add ( AP L NullValue . AP L _ NULL _ INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Pending Null s Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell List . add ( cell To AP L Value ( cell , Ġevaluator )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcell List Ċ } Ċ Ċ fun Ġcell To AP L Value ( cell : ĠCell , Ġevaluator : ĠFormula Evaluator ): ĠA PL Value Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( cell . cell Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCell Type . FORM ULA Ġ-> Ġparse Evalu ated Cell ( cell , Ġevaluator ) ĊĠĠĠĠĠĠĠ ĠCell Type . BOOLEAN Ġ-> Ġmake Boolean ( cell . boolean CellValue ) ĊĠĠĠĠĠĠĠ ĠCell Type . BLANK Ġ-> ĠA PL LONG _ 0 ĊĠĠĠĠĠĠĠ ĠCell Type . NUMERIC Ġ-> ĠA PL Double ( cell . numeric CellValue ) ĊĠĠĠĠĠĠĠ ĠCell Type . STRING Ġ-> ĠA PL String . make ( cell . string CellValue ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġcell Ġtype : Ġ${ cell . cell Type }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġparse Evalu ated Cell ( cell : ĠCell , Ġevaluator : ĠFormula Evaluator ): ĠA PL Value Ġ{ ĊĠĠĠ Ġval Ġv Ġ= Ġevaluator . evaluate ( cell ) ĊĠĠĠ Ġreturn Ġwhen Ġ( cell . cell Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCell Type . FORM ULA Ġ-> Ġthrow ĠIllegalStateException (" The Ġresult Ġof Ġan Ġevaluation Ġshould Ġnot Ġbe Ġa Ġformula ") ĊĠĠĠĠĠĠĠ ĠCell Type . BOOLEAN Ġ-> Ġ( if Ġ( v . boolean Value ) Ġ 1 Ġelse Ġ 0 ). make AP L Number () ĊĠĠĠĠĠĠĠ ĠCell Type . BLANK Ġ-> ĠA PL LONG _ 0 ĊĠĠĠĠĠĠĠ ĠCell Type . NUMERIC Ġ-> Ġv . number Value . make AP L Number () ĊĠĠĠĠĠĠĠ ĠCell Type . STRING Ġ-> ĠA PL String . make ( v . stringValue ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unknown Ġcell Ġtype : Ġ${ v . cell Type }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLoad Excel File Function Ġ: ĠA PL Function Descriptor Ġ{ ĊĠĠĠ Ġclass ĠLoad Excel File Function Impl ( pos : ĠPosition ) Ġ: ĠNo Axis AP L Function ( pos ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval 1 Arg ( context : ĠRuntime Context , Ġa : ĠA PL Value ): ĠA PL Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġarray ToString ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Excel File ( filename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow AP L Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTag Catch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA PL Symbol ( context . engine . intern Symbol (" file NotFound ", Ġcontext . engine . keyword Namespace )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA PL String ( filename ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġnot Ġfound : Ġ${ filename }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġarray ToString ( a : ĠA PL Value ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a . rank Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow AP L Exception ( Invalid Dimensions Exception (" String Ġmust Ġbe Ġrank Ġ 1 ", Ġpos )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġa . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Value Ġ= Ġa . value At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Value Ġ! is ĠA PL Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow AP L Exception ( In compatible Type Exception (" Value Ġat Ġposition Ġ$ i Ġis Ġnot Ġa Ġcharacter ", Ġpos )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . add Code point ( char Value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval 2 Arg ( context : ĠRuntime Context , Ġa : ĠA PL Value , Ġb : ĠA PL Value ): ĠA PL Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmake ( pos : ĠPosition ) Ġ= ĠLoad Excel File Function Impl ( pos ) Ċ } Ċ Ċ class ĠMs Office Module Ġ: ĠK ap Module Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġget () Ġ= Ġ" mso ff ice " ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( engine : ĠEngine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġns Ġ= Ġengine . make Namespace (" mso ff ice ") ĊĠĠĠĠĠĠĠ Ġengine . register Function ( engine . intern Symbol (" read ", Ġns ), ĠLoad Excel File Function ()) ĊĠĠĠ Ġ} Ċ } Ċ