n_dw2xls_band.sru 108 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533
  1. $PBExportHeader$n_dw2xls_band.sru
  2. forward
  3. global type n_dw2xls_band from nonvisualobject
  4. end type
  5. end forward
  6. global type n_dw2xls_band from nonvisualobject
  7. end type
  8. global n_dw2xls_band n_dw2xls_band
  9. type variables
  10. n_dw2xls_object inv_Objects[]
  11. n_dw2xls_Line inv_VLines[] //竖线
  12. n_dw2xls_Line inv_HLines[] //横线
  13. CONSTANT LONG COLOR_TRANSPARENT= 536870912
  14. Private:
  15. uLong il_hSheet
  16. string is_Name
  17. Long il_BkColor
  18. String is_BKColorExp
  19. Long il_BandHeight
  20. Long il_BottomSpaceHeight //如果数据窗口是Nest类型,当带区是detail区时,最后对象的Y2与细节区Y2之间的空白,会显示空白,这样可以插入一行空记录来实行
  21. Boolean ib_IsGroupBand =False
  22. Boolean ib_NewPage =False
  23. Boolean ib_FirstOut=TRUE
  24. Boolean ib_AutoHeight =False
  25. Boolean ib_HasNestReport =False
  26. Boolean ib_DynamicRowInfo =False //带区内的对象,如果动态调整了Y,HEIGHT的值,需要动态重新计算行列位置
  27. int ii_rowSpace=20
  28. Int ii_PictureObjCount=0
  29. n_dw2xls_Requestor inv_Requestor
  30. n_dw2xls_Layout inv_Layout
  31. n_dw2xls_WinApi inv_Api
  32. Datastore ids_Rows
  33. end variables
  34. forward prototypes
  35. public subroutine of_addobject (n_dw2xls_object anv_object)
  36. public subroutine of_sortobject_x ()
  37. public subroutine of_sortobject_y ()
  38. public subroutine of_sortline ()
  39. public function String of_getname ()
  40. public subroutine of_addhline (n_dw2xls_line anv_line)
  41. public subroutine of_addvline (n_dw2xls_line anv_line)
  42. public subroutine of_adjustposition (n_dw2xls_band anv_detail)
  43. public function integer of_getvlinescount ()
  44. public subroutine of_getlinecolrowinfo ()
  45. public subroutine of_setrequestor (readonly n_dw2xls_requestor anv_requestor, readonly string as_name)
  46. public subroutine of_registcolumninfo_1 ()
  47. public subroutine of_registcolumninfo_2 ()
  48. public function integer of_rowcount ()
  49. protected subroutine of_writepicture (readonly n_dw2xls_object anv_object, readonly long al_row, readonly long al_xlsrow)
  50. public subroutine of_calcpictureoffset ()
  51. public function Long of_getbkcolor ()
  52. public subroutine of_sortobject_row ()
  53. public subroutine of_setbkcolor (readonly long al_bkcolor, readonly string as_bkcolorexp)
  54. public subroutine of_setcellborder ()
  55. public subroutine of_sortobject_col ()
  56. public subroutine of_adjustposition ()
  57. public subroutine of_getobjectborderinfo ()
  58. public function n_dw2xls_Requestor of_getrequestor ()
  59. public function Boolean of_existsobject (readonly string as_name)
  60. public subroutine of_setdynamicrowinfo (readonly boolean ab_flag)
  61. public subroutine of_refreshrowinfo (long al_row)
  62. public subroutine of_getcolrowinfo2 ()
  63. public subroutine of_getcolrowinfo ()
  64. public subroutine of_updatecolumninfo ()
  65. public subroutine of_setworksheet (readonly unsignedlong al_hsheet)
  66. public function long of_output (readonly long al_row, readonly long al_xlsrow)
  67. public subroutine of_writeborder (readonly n_dw2xls_line anv_line, readonly long al_xlsrow)
  68. protected subroutine of_writeformat (readonly n_dw2xls_object anv_object, readonly long al_xlsrow, readonly long pcell, readonly long al_row)
  69. protected subroutine of_writevalue (readonly n_dw2xls_object anv_object, readonly long pcell, readonly long al_row, ref boolean ab_writevalue, ref boolean ab_samevalue)
  70. public subroutine of_registcolumninfo_3 ()
  71. public function integer of_gety1 (long ai_row)
  72. public function Long of_gety2 (integer ai_row)
  73. public subroutine of_updatebandheight (readonly long ai_height)
  74. public function Long of_getrowheight (integer ai_row)
  75. public function Long of_getbandheight ()
  76. public function integer of_getstartrow (long ai_y)
  77. public function integer of_getendrow (long ai_y)
  78. public function Long getrowheight (integer ai_row)
  79. public function Long of_getbottomspaceheight ()
  80. protected subroutine of_writerowheight (readonly long al_row, readonly long al_xlsrow)
  81. end prototypes
  82. public subroutine of_addobject (n_dw2xls_object anv_object);IF IsValid(anv_object) Then
  83. inv_objects[UpperBound(inv_objects)+1] = anv_object
  84. IF anv_Object.IsPicture OR anv_Object.IsGraph Then
  85. ii_PictureObjCount ++
  86. END IF
  87. IF inv_Requestor.OF_GetProcessing()<>'1' AND inv_Requestor.OF_GetProcessing()<>'4' Then
  88. IF anv_object.X1<inv_Layout.il_first_x1 Then
  89. inv_Layout.il_first_x1 = anv_Object.X1
  90. END IF
  91. IF anv_object.OF_GetTextRect_X2()>inv_Layout.il_last_x2 Then
  92. inv_Layout.il_last_x2 = anv_object.OF_GetTextRect_X2()
  93. END IF
  94. END IF
  95. IF inv_Requestor.OF_IsNested() AND ib_HasNestReport=False Then
  96. IF IsValid(anv_object.Inv_Report) Then
  97. ib_HasNestReport=TRUE
  98. END IF
  99. END IF
  100. END IF
  101. end subroutine
  102. public subroutine of_sortobject_x ();Int li,lj,li_cnt
  103. Boolean lb_Stop
  104. n_dw2xls_Object lnv_Temp
  105. //先按X值按序,再按Y值排序
  106. li_cnt = UpperBound(inv_Objects)
  107. lb_Stop=False
  108. Do While Not lb_Stop
  109. lb_Stop=TRUE
  110. For li=1 TO li_cnt -1
  111. lj =li+1
  112. IF inv_Objects[lj ].x1<inv_Objects[li].x1 OR &
  113. ( inv_Objects[lj ].x1=inv_Objects[li].x1 AND inv_Objects[lj ].Y1<inv_Objects[li].Y1 ) Then
  114. lnv_Temp = inv_Objects[lj]
  115. inv_Objects[lj] =inv_Objects[li]
  116. inv_Objects[li] = lnv_Temp
  117. lb_Stop=False
  118. END IF
  119. Next
  120. Loop
  121. end subroutine
  122. public subroutine of_sortobject_y ();Int li,lj,li_cnt
  123. Boolean lb_Stop
  124. n_dw2xls_Object lnv_Temp
  125. //先按Y值按序,再按x值排序
  126. li_cnt = UpperBound(inv_Objects)
  127. lb_Stop=False
  128. Do While Not lb_Stop
  129. lb_Stop=TRUE
  130. For li=1 TO li_cnt -1
  131. lj =li+1
  132. IF inv_Objects[lj ].y1<inv_Objects[li].y1 OR &
  133. (inv_Objects[lj ].y1=inv_Objects[li].y1 AND inv_Objects[lj ].X1<inv_Objects[li].X1 ) Then
  134. lnv_Temp = inv_Objects[lj]
  135. inv_Objects[lj] =inv_Objects[li]
  136. inv_Objects[li] = lnv_Temp
  137. lb_Stop=False
  138. END IF
  139. Next
  140. Loop
  141. end subroutine
  142. public subroutine of_sortline ();Int li,lj,li_cnt
  143. Boolean lb_Stop
  144. n_dw2xls_Line lnv_Temp
  145. //先按Y值按序,再按x值排序
  146. li_cnt = UpperBound(inv_HLines)
  147. lb_Stop=False
  148. Do While Not lb_Stop
  149. lb_Stop=TRUE
  150. For li=1 TO li_cnt -1
  151. lj =li+1
  152. IF inv_HLines[lj ].Y1 <inv_HLines[li].Y1 OR &
  153. (inv_HLines[lj ].Y1 = inv_HLines[li].Y1 AND inv_HLines[lj].X1< inv_HLines[li].X1) Then
  154. lnv_Temp = inv_HLines[lj]
  155. inv_HLines[lj] =inv_HLines[li]
  156. inv_HLines[li] = lnv_Temp
  157. lb_Stop=False
  158. END IF
  159. Next
  160. Loop
  161. //先按X值按序,再按Y值排序
  162. li_cnt = UpperBound(inv_VLines)
  163. lb_Stop=False
  164. Do While Not lb_Stop
  165. lb_Stop=TRUE
  166. For li=1 TO li_cnt -1
  167. lj =li+1
  168. IF inv_VLines[lj].x1<inv_VLines[li].x1 OR &
  169. (inv_VLines[lj ].X1 = inv_VLines[li].X1 AND inv_VLines[lj].Y1< inv_VLines[li].Y1) Then
  170. lnv_Temp = inv_VLines[lj]
  171. inv_VLines[lj] =inv_VLines[li]
  172. inv_VLines[li] = lnv_Temp
  173. lb_Stop=False
  174. END IF
  175. Next
  176. Loop
  177. end subroutine
  178. public function String of_getname ();Return is_Name
  179. end function
  180. public subroutine of_addhline (n_dw2xls_line anv_line);Int li
  181. n_dw2xls_Line lnv_Line
  182. IF IsValid(anv_Line ) Then
  183. //对于使用Border建立表格单元的数据窗口,各个单元格的横线是断开的,重新组成一条长的横线
  184. IF Not anv_Line.IsClone Then
  185. For li=1 To UpperBound(inv_HLines)
  186. lnv_Line = inv_HLines[li]
  187. IF (lnv_Line.Y1 -9 )<= anv_Line.Y1 AND (lnv_Line.Y1 +9 )>= anv_Line.Y1 Then
  188. IF lnv_Line.x2>=( anv_Line.x1 -20) AND lnv_Line.x1<=(anv_Line.x2 +20) AND &
  189. lnv_Line.PenColor = anv_Line.PenColor AND lnv_Line.PenWidth = anv_Line.PenWidth AND &
  190. lnv_Line.VisibleExp=anv_Line.VisibleExp Then
  191. IF lnv_Line.x1>anv_Line.x1 Then
  192. lnv_Line.x1 = anv_Line.x1
  193. END IF
  194. IF lnv_Line.x2<anv_Line.x2 THEN
  195. lnv_Line.x2 = anv_Line.x2
  196. END IF
  197. Return
  198. END IF
  199. END IF
  200. Next
  201. END IF
  202. inv_HLines[UpperBound(inv_HLines)+1] = anv_Line
  203. END IF
  204. end subroutine
  205. public subroutine of_addvline (n_dw2xls_line anv_line);Long li
  206. n_dw2xls_Line lnv_Line
  207. IF IsValid(anv_Line ) Then
  208. //对于使用Border建立表格单元的数据窗口,各个单元格的竖线是断开的,重新组成一条长的竖线
  209. For li=1 To UpperBound(inv_VLines)
  210. lnv_Line = inv_VLines[li]
  211. IF (lnv_Line.x1 -9 )<= anv_Line.x1 AND (lnv_Line.x1 +9 )>= anv_Line.x1 Then
  212. IF lnv_Line.y2>=( anv_Line.y1 -20) AND lnv_Line.y1<=(anv_Line.y2 +20) AND &
  213. lnv_Line.PenColor = anv_Line.PenColor AND lnv_Line.PenWidth = anv_Line.PenWidth AND &
  214. lnv_Line.VisibleExp=anv_Line.VisibleExp Then
  215. IF lnv_Line.y1>anv_Line.y1 Then
  216. lnv_Line.y1 = anv_Line.y1
  217. END IF
  218. IF lnv_Line.y2<anv_Line.y2 THEN
  219. lnv_Line.y2 = anv_Line.y2
  220. END IF
  221. Return
  222. END IF
  223. END IF
  224. Next
  225. inv_VLines[UpperBound(inv_VLines)+1] = anv_Line
  226. IF anv_Line.X1<inv_Layout.il_first_x1 Then
  227. inv_Layout.il_first_x1 = anv_Line.X1
  228. END IF
  229. IF anv_Line.X2>inv_Layout.il_last_x2 Then
  230. inv_Layout.il_last_x2 =anv_Line.X2
  231. END IF
  232. END IF
  233. end subroutine
  234. public subroutine of_adjustposition (n_dw2xls_band anv_detail);Int li, lj, lk ,li_cnt
  235. Long li_X1, li_X2
  236. n_dw2xls_Object lnv_Object , lnv_Object2 ,lnv_Object3
  237. IF is_Name="detail" Then
  238. Return
  239. END IF
  240. anv_Detail.OF_SortObject_X()
  241. li_cnt =UpperBound(anv_Detail.inv_Objects)
  242. For li=1 To UpperBound(inv_Objects)
  243. lnv_Object = inv_Objects[li]
  244. For lj=1 TO li_cnt
  245. lnv_Object2= anv_Detail.inv_Objects[lj]
  246. IF lnv_Object.Name=lnv_Object2.Name+"_t" AND &
  247. lnv_Object.X1<lnv_Object2.X2 AND &
  248. lnv_Object.X2>lnv_Object2.X1 Then
  249. li_X1 = lnv_Object.X1
  250. li_X2 = lnv_Object.X2
  251. IF lnv_Object.X1>li_X1 Then
  252. //找到前面一列
  253. For lk =lj -1 To 1 Step -1
  254. lnv_Object3 = anv_Detail.inv_Objects[lk]
  255. IF lnv_Object3.X2<li_X1 Then
  256. Exit
  257. END IF
  258. IF ( lnv_Object3.X1<li_X1 OR lnv_Object3.X1<lnv_Object2.X1) AND &
  259. lnv_Object3.Y2> lnv_Object2.Y1 AND &
  260. lnv_Object3.Y1< lnv_Object2.Y2 Then
  261. IF lnv_Object3.X2>li_X1 Then
  262. li_X1= lnv_Object3.X2
  263. END IF
  264. Exit
  265. END IF
  266. Next
  267. END IF
  268. IF lnv_Object2.X1 >li_X1 Then
  269. lnv_Object2.X1 =li_X1
  270. END IF
  271. IF li_X2> lnv_Object2.X2 Then
  272. //找到后面一列
  273. For lk =lj +1 To li_cnt
  274. lnv_Object3 = anv_Detail.inv_Objects[lk]
  275. IF lnv_Object3.X1>li_X2 Then
  276. Exit
  277. END IF
  278. IF ( lnv_Object3.X2>li_X2 OR lnv_Object3.X2>lnv_Object2.X2) AND &
  279. lnv_Object3.Y2> lnv_Object2.Y1 AND &
  280. lnv_Object3.Y1< lnv_Object2.Y2 Then
  281. IF lnv_Object3.X1<li_X2 Then
  282. li_X2= lnv_Object3.X1
  283. END IF
  284. Exit
  285. END IF
  286. Next
  287. END IF
  288. IF li_X2> lnv_Object2.X2 Then
  289. lnv_Object2.X2 =li_X2
  290. END IF
  291. lnv_Object.X1= lnv_Object2.X1
  292. lnv_Object.X2= lnv_Object2.X2
  293. Exit
  294. END IF
  295. Next
  296. Next
  297. end subroutine
  298. public function integer of_getvlinescount ();Return UpperBound(inv_VLines)
  299. end function
  300. public subroutine of_getlinecolrowinfo ();Int li,lj, li_Find
  301. Int li_StartRow, li_StartCol, li_EndRow, li_EndCol
  302. n_dw2xls_line lnv_line
  303. //带区只有横线,而且是作为上一带区的下边线或下一带区的上边线用的
  304. IF UpperBound(inv_Objects)=0 AND UpperBound(inv_VLines)=0 AND &
  305. ids_Rows.RowCount()=1 AND il_BandHeight<=30 Then
  306. For li=1 TO UpperBound(inv_HLines)
  307. lnv_line = inv_HLines[li]
  308. lnv_Line.StartCol = inv_Layout.OF_GetStartColumn(lnv_Line.X1+5 )
  309. lnv_Line.EndCol = inv_Layout.OF_GetEndColumn(lnv_Line.X2 -5 )
  310. IF is_Name="header" OR is_Name="header[1]" Then
  311. lnv_Line.StartRow =1
  312. lnv_Line.EndRow =1
  313. lnv_Line.ii_TopBottom =1
  314. ELSE
  315. lnv_Line.StartRow =0
  316. lnv_Line.EndRow =0
  317. lnv_Line.ii_TopBottom =2
  318. END IF
  319. Next
  320. ids_Rows.Reset()
  321. Return
  322. END IF
  323. For li=1 To UpperBound(inv_VLines)
  324. lnv_Line = inv_VLines[li]
  325. IF lnv_Line.IsClone Then
  326. Continue
  327. END IF
  328. lnv_Line.StartRow = OF_GetStartRow(lnv_Line.Y1 )
  329. lnv_Line.EndRow = OF_GetEndRow(lnv_Line.Y2 )
  330. li_Find=inv_Layout.ids_Columns.Find("x2="+String(lnv_Line.x1),1,inv_Layout.ids_Columns.RowCount())
  331. IF li_Find>0 Then
  332. lnv_Line.StartCol = li_Find
  333. lnv_Line.EndCol = li_Find
  334. lnv_Line.ii_LeftRight =2
  335. Continue
  336. END IF
  337. li_Find=inv_Layout.ids_Columns.Find("x1="+String(lnv_Line.x1),1,inv_Layout.ids_Columns.RowCount())
  338. IF li_Find>0 Then
  339. lnv_Line.StartCol = li_Find
  340. lnv_Line.EndCol = li_Find
  341. lnv_Line.ii_LeftRight =1
  342. Continue
  343. END IF
  344. li_Find=inv_Layout.ids_Columns.Find("x2<"+String(lnv_Line.x1+inv_Layout.ii_ColSpace)+" AND x2> "+String(lnv_Line.x1 - inv_Layout.ii_ColSpace),1,inv_Layout.ids_Columns.RowCount())
  345. IF li_Find>0 Then
  346. lnv_Line.StartCol = li_Find
  347. lnv_Line.EndCol = li_Find
  348. lnv_Line.ii_LeftRight =2
  349. Continue
  350. END IF
  351. li_Find=inv_Layout.ids_Columns.Find("x1<"+String(lnv_Line.x1+inv_Layout.ii_ColSpace)+" AND X1> "+String(lnv_Line.x1 - inv_Layout.ii_ColSpace),1,inv_Layout.ids_Columns.RowCount())
  352. IF li_Find>0 Then
  353. lnv_Line.StartCol = li_Find
  354. lnv_Line.EndCol = li_Find
  355. lnv_Line.ii_LeftRight =1
  356. Continue
  357. END IF
  358. Next
  359. For li=1 To UpperBound(inv_HLines)
  360. lnv_Line = inv_HLines[li]
  361. IF lnv_Line.IsClone Then
  362. Continue
  363. END IF
  364. lnv_Line.StartCol = inv_Layout.OF_GetStartColumn(lnv_Line.X1+5 )
  365. lnv_Line.EndCol = inv_Layout.OF_GetEndColumn(lnv_Line.X2 -5 )
  366. li_Find=ids_Rows.Find("y2="+String(lnv_Line.y1),1,ids_Rows.RowCount())
  367. IF li_Find>0 Then
  368. lnv_Line.StartRow = li_Find
  369. lnv_Line.EndRow = li_Find
  370. lnv_Line.ii_TopBottom=2
  371. Continue
  372. END IF
  373. li_Find=ids_Rows.Find("y1="+String(lnv_Line.y1),1,ids_Rows.RowCount())
  374. IF li_Find>0 Then
  375. lnv_Line.StartRow = li_Find
  376. lnv_Line.EndRow = li_Find
  377. lnv_Line.ii_TopBottom =1
  378. Continue
  379. END IF
  380. li_Find=ids_Rows.Find("y2<"+String(lnv_Line.y1 + 30)+" AND Y2> "+String(lnv_Line.y1 - 30),1,ids_Rows.RowCount())
  381. IF li_Find>0 Then
  382. lnv_Line.StartRow = li_Find
  383. lnv_Line.EndRow = li_Find
  384. lnv_Line.ii_TopBottom =2
  385. Continue
  386. END IF
  387. li_Find=ids_Rows.Find("y1<"+String(lnv_Line.y1 + 30)+" AND Y1> "+String(lnv_Line.y1 -30),1,ids_Rows.RowCount())
  388. IF li_Find>0 Then
  389. lnv_Line.StartRow = li_Find
  390. lnv_Line.EndRow = li_Find
  391. lnv_Line.ii_TopBottom =1
  392. Continue
  393. END IF
  394. li_Find = ids_Rows.Find("Y1<"+String(lnv_Line.Y1)+" AND Y2>"+String(lnv_Line.Y1),1,ids_Rows.RowCount())
  395. IF li_Find>0 Then
  396. lnv_Line.StartRow = li_Find
  397. lnv_Line.EndRow = li_Find
  398. IF ( ids_Rows.GetItemNumber(li_Find,"Y2") - lnv_Line.Y1)> ( lnv_Line.Y1 - ids_Rows.GetItemNumber(li_Find,"Y1") +20 ) Then
  399. lnv_Line.ii_TopBottom =1
  400. ELSE
  401. lnv_Line.ii_TopBottom =2
  402. END IF
  403. Continue
  404. END IF
  405. li_Find=ids_Rows.Find(" Y1>"+String(lnv_Line.y1 ),1,ids_Rows.RowCount() )
  406. IF li_Find>0 Then
  407. lnv_Line.StartRow = li_Find
  408. lnv_Line.EndRow = li_Find
  409. lnv_Line.ii_TopBottom =1
  410. Continue
  411. END IF
  412. li_Find=ids_Rows.Find("y1<"+String(lnv_Line.y1 ),ids_Rows.RowCount(),1)
  413. IF li_Find>0 Then
  414. lnv_Line.StartRow = li_Find
  415. lnv_Line.EndRow = li_Find
  416. lnv_Line.ii_TopBottom =2
  417. Continue
  418. END IF
  419. Next
  420. end subroutine
  421. public subroutine of_setrequestor (readonly n_dw2xls_requestor anv_requestor, readonly string as_name);String ls_Value, ls_Exp
  422. is_Name =as_Name
  423. inv_Requestor = anv_requestor
  424. inv_Layout= anv_requestor.OF_GetLayout()
  425. inv_Api = anv_Requestor.OF_GetWinApi()
  426. IF Not inv_Requestor.OF_IsWriteBKColor() Then
  427. il_BkColor = COLOR_TRANSPARENT
  428. ELSE
  429. inv_Requestor.OF_GetProperty("DataWindow."+is_Name+".Color", ls_Value, ls_Exp)
  430. IF IsNumber(ls_Value ) Then
  431. il_BkColor = inv_Api.OF_GetColor(Long(ls_Value) )
  432. ELSE
  433. il_BkColor = COLOR_TRANSPARENT
  434. END IF
  435. is_BKColorExp=ls_Exp
  436. inv_Requestor.OF_AddExpression(is_BKColorExp)
  437. END IF
  438. il_BandHeight = inv_Requestor.OF_GetBandHeight(as_name)
  439. IF inv_Requestor.OF_Describe("DataWindow."+as_Name+".Height.AutoSize")="yes" Then
  440. ib_AutoHeight =TRUE
  441. END IF
  442. IF Pos(as_Name,"header.")>0 OR Pos(as_Name,"trailer.")>0 Then
  443. ib_IsGroupBand =TRUE
  444. END IF
  445. end subroutine
  446. public subroutine of_registcolumninfo_1 ();Int li , lj, li_ColSpace,li_ObjCount
  447. Long li_x1, li_Pre_X1, li_X2
  448. n_dw2xls_Object lnv_Object, lnv_Object2
  449. IF is_Name<>"detail" Then
  450. RETURN
  451. END IF
  452. //如果是Grid或 Crosstab类型的数据窗口,则按细节区的对象进行登记
  453. //否则按细节区的竖线进行登记
  454. IF inv_Requestor.OF_GetProcessing()='1' OR inv_Requestor.OF_GetProcessing()='4' Then
  455. For li=1 To UpperBound(inv_Objects)
  456. lnv_Object = inv_Objects[li]
  457. IF lnv_Object.ObjType="tempobj" Then
  458. Continue
  459. END IF
  460. IF inv_Requestor.OF_IsChild() Then
  461. inv_Layout.OF_RegistObject(lnv_Object.x1 ,TRUE )
  462. ELSE
  463. inv_Layout.OF_RegistColumn(lnv_Object.x1 )
  464. END IF
  465. IF lnv_Object.X2>li_X2 Then
  466. li_x2 = lnv_Object.X2
  467. END IF
  468. Next
  469. IF inv_Requestor.OF_IsChild() Then
  470. inv_Layout.OF_RegistObject(li_x2,FALSE )
  471. ELSE
  472. inv_Layout.OF_RegistColumn(li_x2)
  473. END IF
  474. ELSE
  475. li_Pre_X1 =0
  476. li_ColSpace = inv_Layout.OF_GetColSpace()
  477. OF_SortLine()
  478. For li=1 To UpperBound(inv_VLines)
  479. li_x1 =inv_VLines[li].X1
  480. //两个线条之间间隔很少,则处理为同一列
  481. IF ( li_x1 - li_ColSpace )<li_Pre_X1 AND li_Pre_X1>0 Then
  482. Continue
  483. END IF
  484. IF inv_Requestor.OF_IsChild() Then
  485. inv_Layout.OF_RegistObject(li_x1 ,TRUE)
  486. ELSE
  487. inv_Layout.OF_RegistColumn(li_x1 )
  488. END IF
  489. li_Pre_x1 = li_x1
  490. IF li_X1>li_x2 Then
  491. li_x2 = li_X1
  492. END IF
  493. Next
  494. li_ObjCount = UpperBound(inv_Objects)
  495. For li=1 To li_ObjCount
  496. lnv_Object = inv_Objects[li]
  497. IF lnv_Object.ObjType="tempobj" Then
  498. Continue
  499. END IF
  500. IF IsValid(lnv_Object.inv_LeftLine)=False AND IsValid(lnv_Object.inv_RightLine)=False Then
  501. IF lnv_Object.alignment='1' Then
  502. inv_Layout.OF_RegistObject(lnv_Object.x2 ,FALSE)
  503. For lj=li -1 To 1 Step -1
  504. lnv_Object2 = inv_Objects[lj]
  505. IF ( lnv_Object2.X2 +inv_Layout.ii_ColSpace)<lnv_Object.X1 Then
  506. Exit
  507. END IF
  508. IF lnv_Object2.Y1<lnv_Object.Y2 AND lnv_Object2.Y2>lnv_Object.Y1 AND &
  509. ( lnv_Object2.X2>=lnv_Object.X1 OR ( lnv_Object.X1 - lnv_Object2.X2)<=inv_Layout.ii_ColSpace ) Then
  510. IF lnv_Object2.X2 < lnv_Object.X1 Then
  511. inv_Layout.OF_RegistObject(lnv_Object2.x2,FALSE )
  512. ELSE
  513. inv_Layout.OF_RegistObject(lnv_Object2.x1,TRUE )
  514. END IF
  515. Exit
  516. END IF
  517. Next
  518. ELSEIF lnv_Object.alignment='2' Then
  519. inv_Layout.OF_RegistObject(lnv_Object.x1,TRUE )
  520. inv_Layout.OF_RegistObject(lnv_Object.x2 ,FALSE )
  521. ELSE
  522. inv_Layout.OF_RegistObject(lnv_Object.x1,TRUE )
  523. END IF
  524. IF lnv_Object.X2>li_X2 Then
  525. li_x2 = lnv_Object.X2
  526. END IF
  527. END IF
  528. Next
  529. IF inv_Requestor.OF_IsChild() Then
  530. inv_Layout.OF_RegistObject(li_x2,FALSE )
  531. ELSE
  532. inv_Layout.OF_RegistColumn(li_x2)
  533. END IF
  534. END IF
  535. end subroutine
  536. public subroutine of_registcolumninfo_2 ();IF Not IsValid(inv_Requestor) Then
  537. Return
  538. END IF
  539. IF Not IsValid(inv_Layout) Then
  540. Return
  541. END IF
  542. Int li, lj
  543. Int li_Vlines, li_HLines ,li_ObjCount
  544. Int li_Find
  545. Long li_x1, li_x2 ,li_Y1, li_Y2,li_Pre_x1 ,li_Next_X1
  546. Long li_ColSpace, li_RowSpace
  547. Boolean lb_HasLine ,lb_HasObject
  548. n_dw2xls_Line lnv_Line
  549. n_dw2xls_Object lnv_Object
  550. IF is_Name<>"detail" Then //如果是细节区, 已经在OF_RegistColumn_1登记过了
  551. li_Pre_X1 =0
  552. li_ColSpace = inv_Layout.OF_GetColSpace()
  553. For li=1 To UpperBound(inv_VLines)
  554. li_x1 =inv_VLines[li].X1
  555. //两个线条之间间隔很少,则处理为同一列
  556. IF ( li_x1 - li_ColSpace )<li_Pre_X1 AND li_Pre_X1>0 Then
  557. Continue
  558. END IF
  559. inv_Layout.OF_RegistObject(li_x1,TRUE )
  560. li_Pre_x1 = li_x1
  561. Next
  562. END IF
  563. li_ObjCount = UpperBound(inv_Objects)
  564. For li=1 To li_ObjCount
  565. IF inv_Objects[li].ObjType="report" Then
  566. Continue
  567. END IF
  568. IF inv_Objects[li].ObjType="tempobj" Then
  569. Continue
  570. END IF
  571. lnv_Object = inv_Objects[li]
  572. IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then
  573. Continue
  574. END IF
  575. IF ( inv_Requestor.OF_GetProcessing()="1" OR inv_Requestor.OF_GetProcessing()="4" ) AND lnv_Object.IsForeGround=False Then
  576. IF Not inv_Requestor.OF_ContaintBand("detail") THEN
  577. inv_Layout.OF_RegistColumn(lnv_Object.X1 )
  578. END IF
  579. Continue
  580. END IF
  581. IF lnv_Object.BorderStyle='2' OR lnv_Object.BorderStyle='4' Then
  582. IF lnv_Object.SkipBorder Then
  583. inv_Layout.OF_AddObject( lnv_Object)
  584. ELSE
  585. inv_Layout.OF_RegistObject(lnv_Object.X1,TRUE)
  586. inv_Layout.OF_RegistObject(lnv_Object.X2,FALSE )
  587. END IF
  588. END IF
  589. Next
  590. For li=1 To UpperBound(inv_HLines)
  591. lnv_Line =inv_HLines[li]
  592. inv_Layout.OF_RegistObject(lnv_Line.X1,TRUE)
  593. inv_Layout.OF_RegistObject(lnv_Line.X2,FALSE )
  594. Next
  595. end subroutine
  596. public function integer of_rowcount ();Return ids_Rows.RowCount()
  597. end function
  598. protected subroutine of_writepicture (readonly n_dw2xls_object anv_object, readonly long al_row, readonly long al_xlsrow);String ls_FileName
  599. IF anv_Object.IsGraph Then
  600. inv_Layout.OF_AddGraph(al_xlsRow + anv_Object.StartRow ,anv_Object.StartCol ,inv_Requestor , anv_Object.Name , anv_Object.Picture_OffsetX, anv_Object.Picture_OffsetY , anv_Object.Width , anv_Object.Height )
  601. ELSE
  602. IF anv_Object.ObjType ="bitmap" Then
  603. ls_FileName = anv_Object.PictureName
  604. ELSEIF anv_Object.ObjType="column" Then
  605. ls_FileName = inv_Requestor.OF_GetItemString(al_Row, anv_Object.Name)
  606. ELSEIF anv_Object.ObjType="compute" Then
  607. ls_FileName = inv_Requestor.OF_Evaluate(al_Row , anv_Object.PictureExp ) //不能用OF_GetExpValue
  608. END IF
  609. IF Pos(ls_FileName,":")=0 Then
  610. IF Left(ls_FileName,1)="\" THen
  611. ls_FileName =Left(inv_Api.OF_GetAppPath(),2)+ls_FileName
  612. ELSE
  613. ls_FileName=inv_Api.OF_GetAppPath() +ls_FileName
  614. END IF
  615. END IF
  616. IF FileExists(ls_FileName) Then
  617. inv_Layout.OF_AddPicture(al_xlsRow + anv_Object.StartRow ,anv_Object.StartCol ,ls_FileName, anv_Object.Picture_OffsetX, anv_Object.Picture_OffsetY , anv_Object.Width , anv_Object.Height )
  618. END IF
  619. END IF
  620. end subroutine
  621. public subroutine of_calcpictureoffset ();Int li
  622. n_dw2xls_Object lnv_Object
  623. IF ii_PictureObjCount<=0 Then
  624. Return
  625. END IF
  626. For li =1 To UpperBound(inv_Objects)
  627. lnv_Object = inv_Objects[li]
  628. IF lnv_Object.IsPicture OR lnv_Object.IsGraph THen
  629. lnv_Object.Picture_OffSetX=lnv_Object.X1 - inv_Layout.OF_GetColumn_X1( lnv_Object.StartCol )
  630. lnv_Object.Picture_OffSetY=lnv_Object.Y1 - OF_GetY1( lnv_Object.StartRow )
  631. END IF
  632. Next
  633. end subroutine
  634. public function Long of_getbkcolor ();Return il_BKColor
  635. end function
  636. public subroutine of_sortobject_row ();Int li,lj,li_cnt
  637. Boolean lb_Stop
  638. n_dw2xls_Object lnv_Temp
  639. //先按行按序,再按列排序
  640. li_cnt = UpperBound(inv_Objects)
  641. lb_Stop=False
  642. Do While Not lb_Stop
  643. lb_Stop=TRUE
  644. For li=1 TO li_cnt -1
  645. lj =li+1
  646. IF inv_Objects[lj ].StartRow<inv_Objects[li].StartRow OR &
  647. (inv_Objects[lj ].StartRow=inv_Objects[li].StartRow AND inv_Objects[lj ].StartCol<inv_Objects[li].StartCol ) OR &
  648. (inv_Objects[lj ].StartRow=inv_Objects[li].StartRow AND inv_Objects[lj ].StartCol=inv_Objects[li].StartCol AND inv_Objects[lj ].EndRow<inv_Objects[li].EndRow ) Then
  649. lnv_Temp = inv_Objects[lj]
  650. inv_Objects[lj] =inv_Objects[li]
  651. inv_Objects[li] = lnv_Temp
  652. lb_Stop=False
  653. END IF
  654. Next
  655. Loop
  656. end subroutine
  657. public subroutine of_setbkcolor (readonly long al_bkcolor, readonly string as_bkcolorexp);il_BkColor = al_BKColor
  658. is_BKColorExp = as_BKColorExp
  659. end subroutine
  660. public subroutine of_setcellborder ();
  661. Int li, lj,lk
  662. Int li_Row
  663. Int li_x1 ,li_y1, li_x2, li_y2
  664. Int li_StartCol, li_EndCol, li_StartRow, li_EndRow , li_StartRow2, li_EndRow2
  665. Int li_Pre_StartRow, li_Pre_EndRow
  666. Int li_StartRow3, li_EndRow3
  667. Int li_FirstRow , li_LastRow
  668. Int li_BorderBegin_Y, li_BorderBegin_Row, li_MaxRow
  669. Boolean lb_Flag
  670. n_dw2xls_Object lnv_Object
  671. n_dw2xls_Line lnv_Line
  672. n_dw2xls_Object lnv_TempObs[]
  673. n_dw2xls_Band lnv_Detail
  674. IF inv_Requestor.OF_GetProcessing()<>"1" AND inv_Requestor.OF_GetProcessing()<>'4' Then
  675. Return
  676. END IF
  677. //Footer区不需要处理
  678. IF is_Name="footer" Then
  679. Return
  680. END IF
  681. IF (inv_Requestor.OF_GetProcessing()='1' OR inv_Requestor.OF_GetProcessing()='4') Then
  682. IF is_Name='detail' Then
  683. For li=1 TO UpperBound(inv_Objects)
  684. inv_Objects[li].BorderStyle='2'
  685. Next
  686. Return
  687. END IF
  688. IF is_Name=inv_Requestor.OF_GetHeader_BeginBand() Then
  689. li_BorderBegin_Y = inv_Requestor.OF_GetHeader_BeginY()
  690. li_BorderBegin_Row =OF_GetStartRow(li_BorderBegin_Y)
  691. ELSE
  692. IF inv_Requestor.OF_GetProcessing()='4' AND Pos(is_name,"header")>0 Then
  693. IF is_Name<inv_Requestor.OF_GetHeader_BeginBand() Then
  694. Return
  695. END IF
  696. END IF
  697. li_BorderBegin_Row =1
  698. END IF
  699. li_MaxRow = ids_Rows.RowCount()
  700. IF inv_Requestor.OF_ContaintBand("detail") Then
  701. lnv_Detail = inv_Requestor.OF_GetBand("detail")
  702. For li=1 To UpperBound(lnv_Detail.inv_Objects)
  703. li_StartCol = lnv_Detail.inv_Objects[li].StartCol
  704. li_EndCol = lnv_Detail.inv_Objects[li].EndCol
  705. lb_Flag =False
  706. For lj=1 To UpperBound(inv_Objects)
  707. IF inv_Objects[lj].StartCol <= li_StartCol AND inv_Objects[lj].EndCol >= li_StartCol Then
  708. IF inv_Objects[lj].StartRow>=li_BorderBegin_Row Then //And inv_Objects[lj].EndRow>=li_Row Then
  709. inv_Objects[lj].BorderStyle='2'
  710. lb_Flag=TRUE
  711. END IF
  712. ELSEIF inv_Objects[lj].StartCol>li_StartCol Then
  713. EXIT
  714. END IF
  715. Next
  716. IF Not lb_Flag Then
  717. lnv_Object = Create n_dw2xls_Object
  718. lnv_Object.ObjType="tempobj"
  719. lnv_Object.StartRow =li_BorderBegin_Row
  720. lnv_Object.EndRow =li_MaxRow
  721. lnv_Object.StartCol = li_StartCol
  722. lnv_Object.EndCol =li_EndCol
  723. lnv_Object.BorderStyle='2'
  724. inv_Objects[ UpperBound(inv_Objects)+1] = lnv_Object
  725. END IF
  726. Next
  727. ELSE
  728. For li=1 To inv_Layout.OF_ColumnCount()
  729. li_StartCol =li
  730. li_EndCol =li
  731. lb_Flag =False
  732. For lj=1 To UpperBound(inv_Objects)
  733. IF inv_Objects[lj].StartCol <= li_StartCol AND inv_Objects[lj].EndCol >= li_StartCol Then
  734. IF inv_Objects[lj].StartRow>=li_BorderBegin_Row Then
  735. inv_Objects[lj].BorderStyle='2'
  736. lb_Flag=TRUE
  737. END IF
  738. ELSEIF inv_Objects[lj].StartCol > li_StartCol Then
  739. EXIT
  740. END IF
  741. Next
  742. IF Not lb_Flag Then
  743. lnv_Object = Create n_dw2xls_Object
  744. lnv_Object.ObjType="tempobj"
  745. lnv_Object.StartRow =li_BorderBegin_Row
  746. lnv_Object.EndRow =li_MaxRow
  747. lnv_Object.StartCol = li_StartCol
  748. lnv_Object.EndCol =li_EndCol
  749. lnv_Object.BorderStyle='2'
  750. inv_Objects[ UpperBound(inv_Objects)+1] = lnv_Object
  751. END IF
  752. Next
  753. END IF
  754. END IF
  755. end subroutine
  756. public subroutine of_sortobject_col ();Int li,lj,li_cnt
  757. Boolean lb_Stop
  758. n_dw2xls_Object lnv_Temp
  759. //先按列按序,再按行排序
  760. li_cnt = UpperBound(inv_Objects)
  761. lb_Stop=False
  762. Do While Not lb_Stop
  763. lb_Stop=TRUE
  764. For li=1 TO li_cnt -1
  765. lj =li+1
  766. IF inv_Objects[lj ].StartCol<inv_Objects[li].StartCol OR &
  767. (inv_Objects[lj ].StartCol=inv_Objects[li].StartCol AND inv_Objects[lj ].StartRow<inv_Objects[li].StartRow ) OR &
  768. (inv_Objects[lj ].StartCol=inv_Objects[li].StartCol AND inv_Objects[lj ].StartRow=inv_Objects[li].StartRow AND inv_Objects[lj ].hAlignment<inv_Objects[li].hAlignment ) Then
  769. lnv_Temp = inv_Objects[lj]
  770. inv_Objects[lj] =inv_Objects[li]
  771. inv_Objects[li] = lnv_Temp
  772. lb_Stop=False
  773. END IF
  774. Next
  775. Loop
  776. end subroutine
  777. public subroutine of_adjustposition ();//Int li,lj,li_cnt
  778. //Int li_Begin_Y
  779. //Boolean lb_UpObj, lb_DownObj
  780. //
  781. //IF is_Name="detail" OR is_Name="header[1]" Then
  782. // Return
  783. //END IF
  784. //
  785. //IF is_Name=inv_Requestor.OF_GetHeader_BeginBand() Then
  786. // li_Begin_Y =inv_Requestor.OF_GetHeader_BeginY()
  787. //ELSE
  788. // li_Begin_Y =0
  789. //END IF
  790. //
  791. //li_cnt = UpperBound(inv_Objects)
  792. //For li=1 To li_cnt
  793. //
  794. // IF inv_Objects[li].IsForeGround OR inv_Objects[li].Y1<li_Begin_Y THen
  795. // Continue
  796. // END IF
  797. //
  798. // lb_UpObj =False
  799. // lb_DownObj=False
  800. //
  801. // For lj=1 To li_cnt
  802. // IF li = lj Then
  803. // Continue
  804. // END IF
  805. //
  806. // IF (inv_Objects[lj].x1+10)>inv_Objects[li].x1 AND (inv_Objects[lj].x2 -10)<inv_Objects[li].x2 Then
  807. // IF inv_Objects[lj].Y1<inv_Objects[li].y1 Then
  808. // lb_UpObj =TRUE
  809. // ELSEIF inv_Objects[lj].Y1>inv_Objects[li].y1 Then
  810. // lb_DownObj =TRUE
  811. // END IF
  812. // END IF
  813. // Next
  814. //
  815. // IF Not lb_UpObj Then
  816. // inv_Objects[li].Y1 = li_Begin_Y
  817. // END IF
  818. //
  819. // IF Not lb_DownObj Then
  820. // inv_Objects[li].Y2=il_BandHeight
  821. // END IF
  822. //Next
  823. end subroutine
  824. public subroutine of_getobjectborderinfo ();IF Not IsValid(inv_Requestor) Then
  825. Return
  826. END IF
  827. IF Not IsValid(inv_Layout) Then
  828. Return
  829. END IF
  830. Int li, lj
  831. Int li_Vlines, li_HLines ,li_ObjCount
  832. Int li_Find
  833. Long li_x1, li_x2 ,li_Y1, li_Y2,li_Pre_x1 ,li_Next_X1
  834. Long li_ColSpace, li_RowSpace
  835. Boolean lb_HasLine ,lb_HasObject
  836. n_dw2xls_Line lnv_Line
  837. n_dw2xls_Object lnv_Object, lnv_Object2
  838. li_Vlines = UpperBound(inv_VLines)
  839. li_HLines = UpperBound(inv_HLines)
  840. IF li_Vlines = 0 AND li_HLines=0 Then
  841. Return
  842. END IF
  843. //对线条进行排序
  844. OF_SortLine()
  845. //两条横线之间,没有任何对象,则插入一个空对象,以便生成行记录
  846. For li=li_HLines To 2 Step -1
  847. lb_HasObject =False
  848. IF (inv_HLines[li].Y1 - inv_HLines[ li -1].Y1)<50 Then
  849. Continue
  850. END IF
  851. For lj=1 To UpperBound(inv_Objects)
  852. lnv_Object = inv_Objects[lj]
  853. IF lnv_Object.Y1>= (inv_HLines[ li -1].Y1 -30 ) AND lnv_Object.Y2<=(inv_HLines[ li ].Y1 +30 ) Then
  854. lb_HasObject=TRUE
  855. Exit
  856. END IF
  857. NEXT
  858. IF Not lb_HasObject Then
  859. lnv_object = Create n_dw2xls_object
  860. lnv_object.objType="tempobj"
  861. lnv_object.inv_TopLine = inv_HLines[ li -1]
  862. lnv_object.inv_BottomLine = inv_HLines[ li ]
  863. lnv_Object.OF_SetPosition(inv_HLines[li].X1+30, inv_HLines[ li -1].Y1+20, inv_HLines[li].X1+50 ,inv_HLines[ li].Y1 -20 ,"" ,"" ,"" ,"" )
  864. OF_AddObject(lnv_object)
  865. END IF
  866. Next
  867. li_ObjCount = UpperBound(inv_Objects)
  868. //先查找对象的左、右边线
  869. IF li_Vlines>0 Then
  870. OF_SortObject_X()
  871. For li=1 TO li_ObjCount
  872. lnv_Object = inv_Objects[li]
  873. IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" OR &
  874. lnv_Object.IsBorderOnly OR lnv_Object.IsPicture Then
  875. Continue
  876. END IF
  877. li_x1= lnv_Object.x1
  878. li_y1 = lnv_Object.y1
  879. li_x2= lnv_Object.x2
  880. li_y2 = lnv_Object.y2
  881. //查找左边线
  882. lb_HasLine=False
  883. lb_HasObject=False
  884. For lj=li_Vlines To 1 Step -1
  885. lnv_Line = inv_VLines[lj]
  886. IF lnv_Line.Y1<=(li_y1 +30) AND lnv_Line.Y2>=( li_y2 -30 ) AND lnv_Line.X1<( li_x1 +30 ) Then //对象可能超过边线一点,所以加上30
  887. lb_HasLine=TRUE
  888. Exit
  889. END IF
  890. Next
  891. IF lb_HasLine THEN
  892. For lj=li -1 TO 1 Step -1 //与左线条之间,有没其它对象
  893. IF (inv_Objects[lj].x2 -30 )< lnv_Line.x1 Then
  894. Exit
  895. END IF
  896. IF inv_Objects[lj].ObjType="report" Or inv_Objects[lj].ObjType="tempobj" OR &
  897. inv_Objects[lj].IsBorderOnly OR inv_Objects[lj].IsPicture Then
  898. Continue
  899. END IF
  900. IF ( inv_Objects[lj].Y1+30)<li_y2 AND ( inv_Objects[lj].Y2 -30) >li_y1 Then
  901. lnv_Object.Inv_LeftObject = inv_Objects[lj]
  902. inv_Objects[lj].inv_RightObject= lnv_Object
  903. SetNull(inv_Objects[lj].inv_LeftLine)
  904. lb_HasObject=TRUE
  905. Exit
  906. END IF
  907. Next
  908. IF Not lb_HasObject THEN
  909. lnv_Object.inv_LeftLine = lnv_Line
  910. END IF
  911. END IF
  912. //如果没有左边线,则没必要查找是否有右边线了,因为不是一个完整的单元格了
  913. IF Not IsValid(lnv_Object.inv_LeftLine) Then
  914. Continue
  915. END IF
  916. //查找右边线
  917. lb_HasLine=False
  918. lb_HasObject=False
  919. For lj=1 To li_Vlines
  920. lnv_Line = inv_VLines[lj]
  921. IF lnv_Line.Y1<=( li_y1+30) AND lnv_Line.Y2>=( li_y2 - 30)AND lnv_Line.X1>(li_x2 -30) Then //对象可以超过边线一点,所以减去30
  922. lb_HasLine=TRUE
  923. Exit
  924. END IF
  925. Next
  926. IF lb_HasLine Then
  927. For lj=li +1 TO li_ObjCount ////与右边线之间,有没其它对象
  928. IF ( inv_Objects[lj].x1+30)> lnv_Line.x1 Then
  929. Exit
  930. END IF
  931. IF inv_Objects[lj].ObjType="tempobj" OR inv_Objects[lj].IsBorderOnly Then
  932. Continue
  933. END IF
  934. IF ( inv_Objects[lj].Y1+30)<li_y2 AND ( inv_Objects[lj].Y2 -30) >li_y1 Then
  935. lnv_Object.Inv_RightObject = inv_Objects[lj]
  936. inv_Objects[lj].inv_LeftObject= lnv_Object
  937. SetNull(inv_Objects[lj].inv_RightLine)
  938. lb_HasObject=TRUE
  939. Exit
  940. END IF
  941. Next
  942. IF Not lb_HasObject THEN
  943. lnv_Object.inv_RightLine = lnv_Line
  944. END IF
  945. END IF
  946. Next
  947. END IF
  948. IF li_HLines>0 Then
  949. OF_SortObject_Y()
  950. For li=1 TO li_ObjCount
  951. lnv_Object = inv_Objects[li]
  952. IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" OR &
  953. lnv_Object.IsPicture Or lnv_Object.IsBorderOnly Then
  954. Continue
  955. END IF
  956. li_x1= lnv_Object.x1
  957. li_y1 = lnv_Object.y1
  958. li_x2= lnv_Object.x2
  959. li_y2 = lnv_Object.y2
  960. //查找上边线
  961. lb_HasLine=False
  962. lb_HasObject=False
  963. For lj=li_HLines To 1 Step -1
  964. lnv_Line = inv_HLines[lj]
  965. IF lnv_Line.X1<li_x2 AND lnv_Line.X2>li_x1 AND lnv_Line.Y1<( li_y1 +30 ) Then
  966. lb_HasLine=TRUE
  967. Exit
  968. END IF
  969. Next
  970. IF lb_HasLine THEN
  971. IF IsValid(lnv_Object.inv_LeftLine) Then
  972. li_x1 = lnv_Object.inv_LeftLine.X1
  973. ELSE
  974. li_X1 = Min(lnv_Line.X1, lnv_Object.X1)
  975. END IF
  976. IF IsValid(lnv_Object.inv_RightLine) Then
  977. li_x2 = lnv_Object.inv_RightLine.X1
  978. ELSE
  979. li_X2 = Max(lnv_Line.X2, lnv_Object.X2)
  980. END IF
  981. For lj=li -1 TO 1 Step -1 //与上线条之间,有没其它对象
  982. lnv_Object2 =inv_Objects[lj]
  983. IF (inv_Objects[lj].Y2 -30) < lnv_Line.Y1 Then
  984. Exit
  985. END IF
  986. IF inv_Objects[lj].ObjType="report" Or inv_Objects[lj].ObjType="tempobj" OR &
  987. inv_Objects[lj].IsBorderOnly OR inv_Objects[lj].IsPicture Then
  988. Continue
  989. END IF
  990. IF ( lnv_Object2.X1+30)<li_x2 AND (lnv_Object2.X2 -30)>li_x1 Then //AND ( lnv_Object2.OF_GetTextRect_Y2() -15)<lnv_Object.Y1
  991. lnv_Object.Inv_UpObject =lnv_Object2
  992. lnv_Object2.inv_DownObject= lnv_Object
  993. SetNull(lnv_Object2.inv_TopLine)
  994. lb_HasObject=TRUE
  995. Exit
  996. END IF
  997. Next
  998. IF Not lb_HasObject THEN
  999. lnv_Object.inv_TopLine = lnv_Line
  1000. END IF
  1001. END IF
  1002. //查找下边线
  1003. li_x1= lnv_Object.x1
  1004. li_x2= lnv_Object.x2
  1005. lb_HasLine=False
  1006. lb_HasObject=False
  1007. For lj=1 To li_HLines
  1008. lnv_Line = inv_HLines[lj]
  1009. IF lnv_Line.X1<li_x2 AND lnv_Line.X2>li_x1 AND lnv_Line.Y1>=(li_Y2 -30) Then
  1010. lb_HasLine=TRUE
  1011. Exit
  1012. END IF
  1013. Next
  1014. IF lb_HasLine THEN
  1015. IF IsValid(lnv_Object.inv_LeftLine) Then
  1016. li_x1 = lnv_Object.inv_LeftLine.X1
  1017. ELSE
  1018. li_X1 = Min(lnv_Line.X1, lnv_Object.X1)
  1019. END IF
  1020. IF IsValid(lnv_Object.inv_RightLine) Then
  1021. li_x2 = lnv_Object.inv_RightLine.X1
  1022. ELSE
  1023. li_X2 = Max(lnv_Line.X2, lnv_Object.X2)
  1024. END IF
  1025. For lj=li+1 TO li_ObjCount
  1026. lnv_Object2=inv_Objects[lj]
  1027. IF (lnv_Object2.Y1+30)> lnv_Line.Y1 Then
  1028. Exit
  1029. END IF
  1030. IF inv_Objects[lj].ObjType="tempobj" OR inv_Objects[lj].IsBorderOnly Then
  1031. Continue
  1032. END IF
  1033. IF (lnv_Object2.X1+30)<li_X2 AND (lnv_Object2.X2 -30)>li_X1 Then // AND ( lnv_Object2.Y1+15)>lnv_Object.OF_GetTextRect_Y2()
  1034. lnv_Object.Inv_DownObject =lnv_Object2
  1035. lnv_Object2.inv_UpObject= lnv_Object
  1036. SetNull(lnv_Object2.inv_BottomLine)
  1037. lb_HasObject=TRUE
  1038. Exit
  1039. END IF
  1040. Next
  1041. IF Not lb_HasObject THEN
  1042. lnv_Object.inv_BottomLine = lnv_Line
  1043. END IF
  1044. END IF
  1045. Next
  1046. END IF
  1047. end subroutine
  1048. public function n_dw2xls_Requestor of_getrequestor ();Return inv_Requestor
  1049. end function
  1050. public function Boolean of_existsobject (readonly string as_name);Int li,li_cnt
  1051. li_cnt =UpperBound(inv_Objects)
  1052. For li=1 TO li_cnt
  1053. IF inv_Objects[li].Name = as_Name Then
  1054. Return TRUE
  1055. END IF
  1056. Next
  1057. Return False
  1058. end function
  1059. public subroutine of_setdynamicrowinfo (readonly boolean ab_flag);ib_DynamicRowInfo = ab_Flag
  1060. end subroutine
  1061. public subroutine of_refreshrowinfo (long al_row);Long li,li_cnt
  1062. Boolean lb_RowInfoChange
  1063. li_cnt = UpperBound(inv_Objects)
  1064. For li=1 To li_cnt
  1065. IF inv_Objects[li].OF_UpdatePosition(al_Row) Then
  1066. lb_RowInfoChange =TRUE
  1067. END IF
  1068. Next
  1069. IF Not lb_RowInfoChange Then
  1070. Return
  1071. END IF
  1072. //li_cnt = UpperBound(inv_VLines)
  1073. li_cnt = UpperBound(inv_Objects)
  1074. For li=1 To li_cnt
  1075. inv_Objects[li].StartRow =1
  1076. inv_Objects[li].EndRow =1
  1077. Next
  1078. OF_GetColRowInfo2()
  1079. OF_SortObject_Row()
  1080. end subroutine
  1081. public subroutine of_getcolrowinfo2 ();Long li, lj,lk,li_Loop,li_ObjCount
  1082. Long li_Row, li_Find
  1083. Long li_x1, li_x2 ,li_Y1, li_Y2
  1084. Long li_Pre_x1, li_Pre_y1
  1085. Long li_TopSpace, li_BottomSpace
  1086. Long li_VLines, li_HLines , li_MaxRow ,li_RowCount , li_MaxY2
  1087. String ls_Processing
  1088. Boolean lb_HasObject,lb_HasLine,lb_InsertRows
  1089. n_dw2xls_Line lnv_Line
  1090. n_dw2xls_Object lnv_Object ,lnv_Object2
  1091. ls_Processing = inv_Requestor.OF_GetProcessing()
  1092. IF (ls_Processing="1" or ls_Processing="4" ) AND is_Name="detail" AND ib_HasNestReport=False Then
  1093. ids_Rows.Reset()
  1094. ids_Rows.InsertRow(0)
  1095. ids_Rows.SetItem(1,"y1",0)
  1096. ids_Rows.SetItem(1,"y2",il_BandHeight)
  1097. IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then
  1098. For li=1 To UpperBound(inv_Objects)
  1099. inv_Objects[li].VAlignment=inv_Api.VAlign_TOP
  1100. Next
  1101. END IF
  1102. Return
  1103. END IF
  1104. OF_SortObject_Y()
  1105. li_ObjCount = UpperBound(inv_Objects)
  1106. ids_Rows.Reset()
  1107. //判断行数
  1108. li_MaxRow =1
  1109. For li_Loop=1 To 2 //需要循环执行两次
  1110. For li=1 To li_ObjCount
  1111. lnv_Object = inv_Objects[li]
  1112. IF Not lnv_Object.Visible Then
  1113. Continue
  1114. END IF
  1115. IF IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) AND &
  1116. IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then
  1117. li_Y1 = lnv_Object.inv_TopLine.Y1
  1118. li_Y2 = lnv_Object.inv_BottomLine.Y1
  1119. ELSE
  1120. li_Y1= lnv_Object.Y1
  1121. IF lnv_Object.BorderStyle<>'0' Then
  1122. li_Y2 = lnv_Object.Y2
  1123. ELSE
  1124. li_Y2 = lnv_Object.OF_GetTextRect_Y2()
  1125. END IF
  1126. END IF
  1127. IF li_Y1>=li_Y2 Then
  1128. Continue
  1129. END IF
  1130. IF li_Y2>li_MaxY2 Then
  1131. li_MaxY2 =li_Y2
  1132. END IF
  1133. //找到对象的开始行
  1134. For lj=li -1 To 1 Step -1
  1135. IF IsValid( inv_Objects[lj].inv_BottomLine) Then
  1136. IF inv_Objects[lj].inv_BottomLine.Y1<= li_Y1 THen
  1137. lnv_Object.StartRow = inv_Objects[lj].EndRow +1
  1138. lnv_Object.EndRow= lnv_Object.StartRow
  1139. Exit
  1140. END IF
  1141. ELSEIF (inv_Objects[lj].Y1<li_Y1 -15) AND (inv_Objects[lj].Y2<(li_Y1+15) OR inv_Objects[lj].OF_GetTextRect_Y2() <(li_Y1+15)) Then //加15是避免Y2与Y1重叠在一起的情况
  1142. lnv_Object.StartRow = inv_Objects[lj].EndRow +1
  1143. lnv_Object.EndRow= lnv_Object.StartRow
  1144. Exit
  1145. END IF
  1146. Next
  1147. //找到对象的结束行
  1148. lb_HasObject =False
  1149. For lj=li+1 To li_ObjCount
  1150. IF Not inv_Objects[lj].Visible Then
  1151. Continue
  1152. END IF
  1153. IF IsValid(inv_Objects[lj].inv_TopLine) AND &
  1154. inv_Objects[lj].inv_TopLine = lnv_Object.inv_BottomLine Then
  1155. IF inv_Objects[lj].StartRow>lnv_Object.StartRow Then
  1156. lnv_Object.EndRow = inv_Objects[lj].StartRow -1
  1157. END IF
  1158. lb_HasObject=TRUE
  1159. Exit
  1160. ELSEIF (inv_Objects[lj].Y1+20)>li_Y2 Then
  1161. IF inv_Objects[lj].StartRow>lnv_Object.StartRow Then
  1162. lnv_Object.EndRow = inv_Objects[lj].StartRow -1
  1163. END IF
  1164. lb_HasObject=TRUE
  1165. Exit
  1166. END IF
  1167. NEXT
  1168. IF lnv_Object.EndRow>li_MaxROW Then
  1169. li_MaxROW = lnv_Object.EndRow
  1170. END IF
  1171. IF Not lb_HasObject Then
  1172. lnv_Object.EndRow = li_MaxROW
  1173. END IF
  1174. IF lnv_Object.StartRow>lnv_Object.EndRow Then
  1175. lnv_Object.StartRow = lnv_Object.EndRow
  1176. END IF
  1177. IF li_Loop <2 Then
  1178. Continue
  1179. END IF
  1180. For lj=ids_Rows.RowCount()+1 To li_MaxROW
  1181. ids_Rows.InsertRow(0)
  1182. ids_Rows.SetItem(ids_Rows.RowCount(),"Y1",90000 )
  1183. ids_Rows.SetItem(ids_Rows.RowCount(),"TextRect_y1",90000)
  1184. Next
  1185. IF IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) Then
  1186. ids_Rows.SetItem(lnv_Object.StartRow,"TopLine","1")
  1187. IF lnv_Object.inv_TopLine.Y1<ids_Rows.GetItemNumber(lnv_Object.StartRow,"Y1") Then
  1188. ids_Rows.SetItem(lnv_Object.StartRow ,"Y1",lnv_Object.inv_TopLine.Y1)
  1189. END IF
  1190. ELSEIF li_Y1<ids_Rows.GetItemNumber(lnv_Object.StartRow,"Y1") Then
  1191. ids_Rows.SetItem(lnv_Object.StartRow ,"Y1",li_Y1)
  1192. END IF
  1193. IF IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) Then
  1194. ids_Rows.SetItem(lnv_Object.EndRow,"BottomLine","1")
  1195. IF lnv_Object.inv_BottomLine.Y2>ids_Rows.GetItemNumber(lnv_Object.EndRow,"Y2") Then
  1196. ids_Rows.SetItem(lnv_Object.EndRow ,"Y2",lnv_Object.inv_BottomLine.Y2)
  1197. END IF
  1198. ELSEIF li_Y2>ids_Rows.GetItemNumber(lnv_Object.EndRow,"Y2") Then
  1199. ids_Rows.SetItem(lnv_Object.EndRow ,"Y2",li_Y2)
  1200. END IF
  1201. IF lnv_Object.Y1<ids_Rows.GetItemNumber(lnv_Object.StartRow,"TextRect_y1") Then
  1202. ids_Rows.SetItem(lnv_Object.StartRow ,"TextRect_y1",lnv_Object.Y1)
  1203. END IF
  1204. IF lnv_Object.OF_GetTextRect_Y2() >ids_Rows.GetItemNumber(lnv_Object.EndRow,"TextRect_y2") Then
  1205. ids_Rows.SetItem(lnv_Object.EndRow ,"TextRect_y2",lnv_Object.OF_GetTextRect_Y2() )
  1206. END IF
  1207. Next
  1208. Next
  1209. IF ids_Rows.RowCount()=0 Then
  1210. ids_Rows.InsertRow(0)
  1211. ids_Rows.SetItem(1,"Y1",0)
  1212. ids_Rows.SetItem(1,"Y2",il_BandHeight)
  1213. END IF
  1214. IF ls_Processing='3' Then
  1215. ids_Rows.SetItem(1,"Y1",0)
  1216. IF inv_Requestor.OF_GetControlHeight()>0 Then
  1217. ids_Rows.SetItem(ids_Rows.RowCount() ,"Y2",inv_Requestor.OF_GetControlHeight())
  1218. END IF
  1219. For li=1 To ids_Rows.RowCount() -1
  1220. IF ids_Rows.GetItemNumber(li,"Y2")> ids_Rows.GetItemNumber(li+1,"Y1") Then
  1221. ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1"))
  1222. END IF
  1223. Next
  1224. Return
  1225. END IF
  1226. For li=1 To ids_Rows.RowCount()
  1227. ids_Rows.SetItem(li,"OldRowNum",li) //先保存原来的行号码,为下一步更新对象的行记录提供对应依据
  1228. Next
  1229. IF is_Name="detail" AND inv_Requestor.OF_IsNested() Then
  1230. il_BottomSpaceHeight = il_BandHeight - li_MaxY2
  1231. IF il_BottomSpaceHeight<=20 Then
  1232. il_BottomSpaceHeight =0
  1233. END IF
  1234. END IF
  1235. IF ib_AutoHeight Then
  1236. il_BandHeight = li_MaxY2
  1237. END IF
  1238. //if is_name="detail" then
  1239. // ids_rows.saveas("c:\rows1.txt",text!,true)
  1240. //END IF
  1241. IF (ls_Processing="1" or ls_Processing="4" ) Then
  1242. ids_Rows.SetItem(ids_Rows.RowCount(),"Y2",il_BandHeight)
  1243. IF ids_Rows.RowCount()=1 Then
  1244. Goto label1
  1245. END IF
  1246. IF Pos(is_Name,"header")<=0 Then
  1247. ids_Rows.SetItem(0,"Y1",0)
  1248. Goto label1
  1249. ELSE
  1250. IF is_Name>inv_Requestor.Of_GetHeader_BeginBand () Then
  1251. goto label1
  1252. ELSEIF is_Name=inv_Requestor.Of_GetHeader_BeginBand () Then
  1253. li_Row =ids_Rows.Find("Y1>="+String(inv_Requestor.Of_GetHeader_BeginY () ),1,ids_Rows.RowCount())
  1254. IF li_Row>0 Then
  1255. For li= li_Row To ids_Rows.RowCount()
  1256. ids_Rows.SetItem(li,"TopLine","1")
  1257. ids_Rows.SetItem(li,"BottomLine","1")
  1258. Next
  1259. END IF
  1260. END IF
  1261. END IF
  1262. END IF
  1263. For li=1 TO UpperBound(inv_HLines)
  1264. lnv_Line = inv_HLines[li]
  1265. lb_HasLine=False
  1266. li_Row = ids_Rows.Find("Y1="+String(lnv_Line.y1),1,ids_Rows.RowCount())
  1267. IF li_Row>0 Then
  1268. ids_Rows.SetItem(li_Row,"TopLine","1")
  1269. li_Row = ids_Rows.Find("Y2="+String(lnv_Line.y1),1,ids_Rows.RowCount())
  1270. IF li_Row>0 Then
  1271. ids_Rows.SetItem(li_Row,"BottomLine","1")
  1272. END IF
  1273. Continue
  1274. END IF
  1275. li_Row = ids_Rows.Find("Y2="+String(lnv_Line.y1),1,ids_Rows.RowCount())
  1276. IF li_Row>0 Then
  1277. ids_Rows.SetItem(li_Row,"BottomLine","1")
  1278. Continue
  1279. END IF
  1280. IF li_MaxROW>1 Then
  1281. For lj=li_MaxROW To 2 Step -1
  1282. IF ( ids_Rows.GetItemNumber(lj -1,"Y2") -30)<lnv_Line.y1 AND (ids_Rows.GetItemNumber(lj,"Y1")+30)>lnv_Line.y1 AND &
  1283. ( ids_Rows.GetItemString(lj,"TopLine")<>"1" AND ids_Rows.GetItemString(lj -1,"BottomLine")<>"1" ) AND &
  1284. (( ids_Rows.GetItemNumber(lj ,"Y1") - ids_Rows.GetItemNumber(lj -1,"Y2"))<60) Then
  1285. ids_Rows.SetItem(lj,"Y1",lnv_Line.Y1)
  1286. ids_Rows.SetItem(lj,"TopLine",'1' )
  1287. ids_Rows.SetItem(lj -1,"Y2",lnv_Line.Y1)
  1288. ids_Rows.SetItem(lj -1,"BottomLine",'1' )
  1289. lb_HasLine=TRUE
  1290. Exit
  1291. END IF
  1292. Next
  1293. END IF
  1294. IF lb_HasLine Then
  1295. Continue
  1296. END IF
  1297. IF lnv_Line.Y1< ids_Rows.GetItemNumber(1,"Y1") Then
  1298. IF ids_Rows.GetItemNumber(1,"Y1") - lnv_Line.Y1>=50 Then
  1299. lb_InsertRows =TRUE
  1300. li_Y2 = ids_Rows.GetItemNumber(1,"Y1")
  1301. li_Row=ids_Rows.InsertRow(1)
  1302. ids_Rows.SetItem(li_Row,"Y1",lnv_Line.Y1)
  1303. ids_Rows.SetItem(li_Row,"Y2",li_Y2)
  1304. ids_Rows.SetItem(li_Row,"TopLine","1")
  1305. ids_Rows.SetItem(li_Row,"textRect_Y1",lnv_Line.Y1)
  1306. ids_Rows.SetItem(li_Row,"textRect_Y2",li_Y2)
  1307. li_MaxROW++
  1308. END IF
  1309. ELSEIF lnv_LIne.Y1> ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") Then
  1310. IF lnv_Line.Y1 - ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") >=50 Then
  1311. lb_InsertRows =TRUE
  1312. li_Y1 = ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2")
  1313. li_Row=ids_Rows.InsertRow(0)
  1314. ids_Rows.SetItem(li_Row,"BottomLine","1")
  1315. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1316. ids_Rows.SetItem(li_Row,"Y2",lnv_Line.Y1 )
  1317. ids_Rows.SetItem(li_Row,"textRect_Y1",li_Y1)
  1318. ids_Rows.SetItem(li_Row,"textRect_Y2",lnv_Line.Y1)
  1319. li_MaxROW++
  1320. END IF
  1321. ELSE
  1322. li_Row = ids_Rows.Find("Y1>"+String(lnv_Line.Y1),1,ids_Rows.RowCount())
  1323. IF li_Row >0 Then
  1324. IF ids_Rows.GetItemString(li_Row,'TopLine')='1' THen
  1325. li_Y2 = ids_Rows.GetItemNumber(li_Row,"Y1")
  1326. ELSE
  1327. li_Y2 = ids_Rows.GetItemNumber(li_Row,"TextRect_Y1")
  1328. END IF
  1329. //跟下边距的距离比较多,则插入空行
  1330. //如果跟上边距离较多
  1331. IF (( li_Y2 - lnv_Line.Y1 )>=50 AND ids_Rows.GetItemString(li_Row,'TopLine')<>'1' ) OR &
  1332. (( li_Y2 -lnv_Line.Y1 )>=30 AND ids_Rows.GetItemString(li_Row,'TopLine')='1' ) Then
  1333. lb_HasObject=False
  1334. For lj=1 To li_ObjCount
  1335. lnv_Object = inv_Objects[lj]
  1336. IF lnv_Object.NoContaint Then
  1337. Continue
  1338. END IF
  1339. IF lnv_Object.Y2>(lnv_Line.Y1+ii_RowSpace) AND lnv_Object.Y1<( li_Y2 - ii_RowSpace)Then
  1340. lb_HasObject =TRUE
  1341. Exit
  1342. END IF
  1343. Next
  1344. IF Not lb_HasObject Then
  1345. lb_InsertRows =TRUE
  1346. li_Row=ids_Rows.InsertRow(li_Row )
  1347. ids_Rows.SetItem(li_Row -1,"BottomLine","1")
  1348. ids_Rows.SetItem(li_Row -1, "Y2",lnv_Line.Y1)
  1349. ids_Rows.SetItem(li_Row,"TopLine","1")
  1350. ids_Rows.SetItem(li_Row,"Y1",lnv_Line.Y1)
  1351. ids_Rows.SetItem(li_Row,"Y2",li_Y2 )
  1352. ids_Rows.SetItem(li_Row,"textRect_Y1",lnv_Line.Y1)
  1353. ids_Rows.SetItem(li_Row,"textRect_Y2",li_Y2)
  1354. li_MaxROW++
  1355. END IF
  1356. Continue
  1357. END IF
  1358. END IF
  1359. li_Row = ids_Rows.Find("Y2<"+String(lnv_Line.Y1),ids_Rows.RowCount(),1)
  1360. IF li_Row >0 Then
  1361. IF ids_Rows.GetItemString(li_Row,'BottomLine')='1' THen
  1362. li_Y1 = ids_Rows.GetItemNumber(li_Row,"Y2")
  1363. ELSE
  1364. li_Y1 = ids_Rows.GetItemNumber(li_Row,"TextRect_Y2")
  1365. END IF
  1366. IF li_Row<ids_Rows.RowCount() Then
  1367. IF ids_Rows.GetItemString(li_Row+1,"TopLine")="1" Then
  1368. li_Y2 = ids_Rows.GetItemNumber(li_Row,"Y1")
  1369. ELSE
  1370. li_Y2 = ids_Rows.GetItemNumber(li_Row,"TextRect_Y1")
  1371. END IF
  1372. ELSE
  1373. li_Y2 =il_BandHeight
  1374. END IF
  1375. //跟上边距的距离比较多,而且这范围内没有对象,则插入空行
  1376. IF (( lnv_Line.Y1 - li_Y1 )>=50 AND ids_Rows.GetItemString(li_Row,'BottomLine')<>'1' ) OR &
  1377. (( lnv_Line.Y1 -li_Y1 )>=30 AND ids_Rows.GetItemString(li_Row,'BottomLine')='1' ) Then
  1378. lb_HasObject=False
  1379. For lj=1 To li_ObjCount
  1380. lnv_Object = inv_Objects[lj]
  1381. IF lnv_Object.NoContaint Then
  1382. Continue
  1383. END IF
  1384. IF lnv_Object.Y2>(li_Y1+ii_RowSpace) AND lnv_Object.Y1<( lnv_Line.Y1 -ii_RowSpace) Then
  1385. lb_HasObject =TRUE
  1386. Exit
  1387. END IF
  1388. Next
  1389. IF Not lb_HasObject Then
  1390. lb_InsertRows =TRUE
  1391. li_Row=ids_Rows.InsertRow(li_Row+1 )
  1392. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1393. ids_Rows.SetItem(li_Row,"Y2", lnv_Line.Y1)
  1394. ids_Rows.SetItem(li_Row,"BottomLine","1")
  1395. ids_Rows.SetItem(li_Row,"textRect_Y1",li_Y1 )
  1396. ids_Rows.SetItem(li_Row,"textRect_Y2",lnv_Line.Y1)
  1397. li_MaxROW++
  1398. END IF
  1399. Continue
  1400. END IF
  1401. END IF
  1402. END IF
  1403. Next
  1404. //if is_name="header" then
  1405. // ids_rows.saveas("c:\rows2.txt",text!,true)
  1406. //END IF
  1407. //计算行间距
  1408. For li=1 To ids_Rows.RowCount()
  1409. IF ids_Rows.GetItemString(li,"TopLine")="1" AND ids_Rows.GetItemString(li,"BottomLine")="1" Then
  1410. ids_Rows.SetItem(li,"TopSpace",0)
  1411. ids_Rows.SetItem(li,"BottomSpace",0)
  1412. Continue
  1413. END IF
  1414. //上边距
  1415. IF li=1 Then
  1416. IF ids_Rows.GetItemString(li,"TopLine")="1" Then
  1417. ids_Rows.SetItem(1,"TopSpace", ids_Rows.GetItemNumber(1,"Y1"))
  1418. ELSE
  1419. ids_Rows.SetItem(1,"TopSpace", ids_Rows.GetItemNumber(1,"textRect_Y1"))
  1420. END IF
  1421. ELSE
  1422. IF ids_Rows.GetItemString(li,"TopLine")="1" Then
  1423. IF ids_Rows.GetItemString(li -1 ,"BottomLine")="1" Then
  1424. ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"Y1") - ids_Rows.GetItemNumber(li -1,"y2") )
  1425. ELSE
  1426. ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"Y1") - ids_Rows.GetItemNumber(li -1,"textRect_Y2") )
  1427. END IF
  1428. ELSE
  1429. IF ids_Rows.GetItemString(li -1 ,"BottomLine")="1" Then
  1430. ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"textRect_Y1") - ids_Rows.GetItemNumber(li -1,"y2") )
  1431. ELSE
  1432. ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"textRect_Y1") - ids_Rows.GetItemNumber(li -1,"y2") )
  1433. END IF
  1434. END IF
  1435. END IF
  1436. IF li = ids_Rows.RowCount() Then
  1437. IF ids_Rows.GetItemString(li,"BottomLine")="1" Then
  1438. ids_Rows.SetItem(li,"BottomSpace", il_BandHeight - ids_Rows.GetItemNumber(li,"Y2"))
  1439. ELSE
  1440. ids_Rows.SetItem(li,"BottomSpace", il_BandHeight - ids_Rows.GetItemNumber(li,"textRect_Y2"))
  1441. END IF
  1442. ELSE
  1443. IF ids_Rows.GetItemString(li,"BottomLine")="1" Then
  1444. IF ids_Rows.GetItemString(li +1 ,"TopLine")="1" Then
  1445. ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"Y1") - ids_Rows.GetItemNumber(li ,"y2") )
  1446. ELSE
  1447. ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"textRect_Y1") - ids_Rows.GetItemNumber(li ,"y2") )
  1448. END IF
  1449. ELSE
  1450. IF ids_Rows.GetItemString(li +1 ,"TopLine")="1" Then
  1451. ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"Y1") - ids_Rows.GetItemNumber(li ,"textRect_Y2") )
  1452. ELSE
  1453. ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"textRect_Y1") - ids_Rows.GetItemNumber(li ,"textRect_Y2") )
  1454. END IF
  1455. END IF
  1456. END IF
  1457. IF ids_Rows.GetItemNumber(li,"TopSpace")<0 Then
  1458. ids_Rows.SetItem(li,"TopSpace",0)
  1459. END IF
  1460. IF ids_Rows.GetItemNumber(li,"BottomSpace")<0 Then
  1461. ids_Rows.SetItem(li,"BottomSpace",0)
  1462. END IF
  1463. Next
  1464. //if is_name="header" then
  1465. // ids_rows.saveas("c:\rows3.txt",text!,true)
  1466. //END IF
  1467. //如果对象跟后一行的间距比较多,则补入空行
  1468. For li=ids_Rows.RowCount() To 1 Step -1
  1469. li_TopSpace = ids_Rows.GetItemNumber(li,"TopSpace")
  1470. li_BottomSpace = ids_Rows.GetItemNumber(li,"BottomSpace")
  1471. IF li_BottomSpace>=60 Then //补入空行
  1472. IF ids_Rows.GetItemString(li,"BottomLine")="1" Then
  1473. li_Y1 =ids_Rows.GetItemNumber(li,"Y2")
  1474. ids_Rows.SetItem(li,"BottomSpace",0)
  1475. lb_InsertRows =TRUE
  1476. li_Row=ids_Rows.InsertRow(li+1)
  1477. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1478. ids_Rows.SetItem(li_Row,"Y2",li_Y1 + li_BottomSpace)
  1479. ELSE
  1480. IF ids_Rows.GetItemString(li,"TopLine")="1" Then
  1481. li_Y1 =ids_Rows.GetItemNumber(li,"TextRect_Y2") + ( ids_Rows.GetItemNumber(li,"TextRect_Y1") -ids_Rows.GetItemNumber(li,"Y1"))
  1482. IF li=ids_Rows.RowCount() Then
  1483. li_Y2 =il_BandHeight
  1484. ELSE
  1485. li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1")
  1486. END IF
  1487. ids_Rows.SetItem(li,"BottomSpace",0)
  1488. lb_InsertRows =TRUE
  1489. li_Row=ids_Rows.InsertRow(li+1)
  1490. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1491. ids_Rows.SetItem(li_Row,"Y2",li_Y2)
  1492. ELSE
  1493. IF li_TopSpace<=60 Then
  1494. li_Y1 =ids_Rows.GetItemNumber(li,"TextRect_Y2") +li_TopSpace/2
  1495. IF li>1 Then
  1496. ids_Rows.SetItem(li -1 , "BottomSpace",ids_Rows.GetItemNumber(li -1, "BottomSpace") - li_TopSpace/2)
  1497. END IF
  1498. //ELSE
  1499. // li_Y1+=20
  1500. // IF li>1 Then
  1501. // ids_Rows.SetItem(li -1 , "BottomSpace",ids_Rows.GetItemNumber(li -1, "BottomSpace") -20)
  1502. // END IF
  1503. END IF
  1504. IF li=ids_Rows.RowCount() Then
  1505. li_Y2 =il_BandHeight
  1506. ELSE
  1507. li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1")
  1508. END IF
  1509. ids_Rows.SetItem(li,"BottomSpace",0)
  1510. lb_InsertRows =TRUE
  1511. li_Row=ids_Rows.InsertRow(li+1)
  1512. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1513. ids_Rows.SetItem(li_Row,"Y2",li_Y2)
  1514. END IF
  1515. END IF
  1516. ELSE
  1517. IF li<ids_Rows.RowCount() AND li_BottomSpace>=30 Then //两个横线之间的间隔
  1518. IF ids_Rows.GetItemString(li,"BottomLine")="1" AND ids_Rows.GetItemString(li+1,"TopLine")="1" Then
  1519. li_Y1 = ids_Rows.GetItemNumber(li,"Y2")
  1520. li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1")
  1521. lb_InsertRows =TRUE
  1522. li_Row=ids_Rows.InsertRow(li+1)
  1523. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1524. ids_Rows.SetItem(li_Row,"Y2",li_Y2)
  1525. END IF
  1526. END IF
  1527. END IF
  1528. Next
  1529. //if is_name="header" then
  1530. // ids_rows.saveas("c:\rows4.txt",text!,true)
  1531. //END IF
  1532. //处理第一行的上边距
  1533. li_TopSpace = ids_Rows.GetItemNumber(1,"TopSpace")
  1534. IF li_TopSpace>=60 OR ( ids_Rows.GetItemString(1 ,"TopLine")="1" AND li_TopSpace>=30 ) Then //补入空行
  1535. IF ids_Rows.GetItemString(1,"TopLine")="1" Then
  1536. li_Y2 =ids_Rows.GetItemNumber(1,"Y1")
  1537. ELSE
  1538. li_Y2= ids_Rows.GetItemNumber(1,"TextRect_Y1")
  1539. END IF
  1540. lb_InsertRows =TRUE
  1541. ids_Rows.SetItem(1,"TopSpace",0)
  1542. li_Row=ids_Rows.InsertRow(1)
  1543. ids_Rows.SetItem(li_Row,"Y1",0)
  1544. ids_Rows.SetItem(li_Row,"Y2",li_Y2)
  1545. END IF
  1546. //处理最后一行
  1547. IF Not ib_AutoHeight Then
  1548. li_BottomSpace = ids_Rows.GetItemNumber(ids_Rows.RowCount() ,"BottomSpace")
  1549. IF li_BottomSpace>=60 OR ( ids_Rows.GetItemString(ids_Rows.RowCount() ,"BottomLine")="1" AND li_BottomSpace>=30 ) Then //补入空行
  1550. IF ids_Rows.GetItemString(ids_Rows.RowCount(),"BottomLine")="1" Then
  1551. li_Y1 =ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2")
  1552. ELSE
  1553. li_Y1= ids_Rows.GetItemNumber(ids_Rows.RowCount(),"TextRect_Y2")
  1554. END IF
  1555. lb_InsertRows =TRUE
  1556. ids_Rows.SetItem(ids_Rows.RowCount(),"BottomSpace",0)
  1557. li_Row=ids_Rows.InsertRow(0)
  1558. ids_Rows.SetItem(li_Row,"Y1",li_Y1)
  1559. ids_Rows.SetItem(li_Row,"Y2",il_BandHeight )
  1560. END IF
  1561. END IF
  1562. //if is_name="detail" AND inv_Requestor.OF_IsChild()=False then
  1563. // ids_rows.saveas("c:\rows5.txt",text!,true)
  1564. //END IF
  1565. label1:
  1566. IF ids_Rows.GetItemString(1,"TopLine")<>"1" Then
  1567. ids_Rows.SetItem(1,"Y1",0)
  1568. END IF
  1569. IF ids_Rows.GetItemString(ids_Rows.RowCount() ,"BottomLine")<>"1" AND ib_AutoHeight=False Then //
  1570. ids_Rows.SetItem(ids_Rows.RowCount(),"Y2",il_BandHeight )
  1571. END IF
  1572. For li=1 To ids_Rows.RowCount()
  1573. ids_Rows.SetItem(li,"NewRowNum",li)
  1574. IF li<ids_Rows.RowCount() Then
  1575. IF ids_Rows.GetItemString(li,"BottomLine")="1" Then
  1576. IF ids_Rows.GetItemString(li+1,"TopLine")<>"1" Then
  1577. ids_Rows.SetItem(li+1,"Y1", ids_Rows.GetItemNumber(li,"Y2"))
  1578. END IF
  1579. ELSEIF ids_Rows.GetItemString(li,"TopLine")="1" Then
  1580. ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1"))
  1581. ELSE
  1582. li_BottomSpace = ids_Rows.GetItemNumber(li+1,"Y1") - ids_Rows.GetItemNumber(li,"Y2")
  1583. IF li_BottomSpace<=60 Then
  1584. ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li,"Y2") +li_BottomSpace/2 )
  1585. ELSE
  1586. ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li,"Y2") +20 )
  1587. END IF
  1588. ids_Rows.SetItem(li+1,"Y1", ids_Rows.GetItemNumber(li,"Y2") )
  1589. END IF
  1590. END IF
  1591. NEXT
  1592. //if is_name="header" then
  1593. // ids_rows.saveas("c:\rows6.txt",text!,true)
  1594. //END IF
  1595. IF lb_InsertRows AND ids_Rows.RowCount()>1 Then
  1596. For li=1 To UpperBound(inv_Objects)
  1597. lnv_Object = inv_Objects[li]
  1598. li_Row = ids_Rows.Find("OldRowNum="+String(lnv_Object.StartRow),1, ids_Rows.RowCount())
  1599. IF li_Row>0 Then
  1600. lnv_Object.StartRow = ids_Rows.GetItemNumber(li_Row,"NewRowNum")
  1601. END IF
  1602. li_Row = ids_Rows.Find("OldRowNum="+String(lnv_Object.EndRow),1, ids_Rows.RowCount())
  1603. IF li_Row>0 Then
  1604. lnv_Object.EndRow = ids_Rows.GetItemNumber(li_Row,"NewRowNum")
  1605. END IF
  1606. Next
  1607. li_MaxROW = ids_Rows.RowCount()
  1608. END IF
  1609. For li=1 To ids_Rows.RowCount() -1
  1610. IF ids_Rows.GetItemNumber(li,"Y2")> ids_Rows.GetItemNumber(li+1,"Y1") Then
  1611. ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1"))
  1612. END IF
  1613. Next
  1614. ////检查所有单元,避免多个对象输出到同一单元
  1615. OF_SortObject_Col()
  1616. li_ObjCount = UpperBound(inv_Objects)
  1617. For li=1 TO li_ObjCount
  1618. lnv_Object = inv_Objects[li]
  1619. IF Not lnv_Object.Visible Then
  1620. Continue
  1621. END IF
  1622. IF lnv_Object.StartCol = lnv_Object.EndCol Then
  1623. Continue
  1624. END IF
  1625. IF lnv_Object.NoContaint AND lnv_Object.BorderStyle='0' Then
  1626. Continue
  1627. END IF
  1628. IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" THEN
  1629. Continue
  1630. END IF
  1631. //与前面是否有对象重复输出相同的单元
  1632. For lj=li -1 To 1 Step -1
  1633. lnv_Object2=inv_Objects[lj]
  1634. IF Not lnv_Object2.Visible Then
  1635. Continue
  1636. END IF
  1637. IF lnv_Object2.NoContaint AND lnv_Object.BorderStyle='0' Then
  1638. Continue
  1639. END IF
  1640. IF lnv_Object2.ObjType="report" OR lnv_Object2.ObjType="tempobj" THEN
  1641. Continue
  1642. END IF
  1643. IF lnv_Object2.StartRow<=lnv_Object.EndRow AND &
  1644. lnv_Object2.EndRow>=lnv_Object.StartRow AND &
  1645. lnv_Object2.EndCol <lnv_Object.StartCol Then
  1646. Exit
  1647. END IF
  1648. IF lnv_Object2.StartRow<=lnv_Object.EndRow AND &
  1649. lnv_Object2.EndRow>=lnv_Object.StartRow AND &
  1650. lnv_Object2.StartCol<=lnv_Object.EndCol AND &
  1651. lnv_Object2.EndCol>=lnv_Object.StartCol Then
  1652. //如果上一对象实际需要显示的内容,与当前对象开始列很近
  1653. IF lnv_Object2.EndCol> lnv_Object2.StartCol Then
  1654. li_x1 = inv_Layout.OF_GetColumn_X1( lnv_Object.StartCol )
  1655. IF (lnv_Object2.x2 - li_x1)<100 OR ( lnv_Object2.OF_GetTextRect_X2() -ii_RowSpace)< li_x1 Then
  1656. lnv_Object.EndCol = lnv_Object2.StartCol -1
  1657. EXIT
  1658. END IF
  1659. END IF
  1660. //如果当前对象离下一列很近,或实际显示的内容在下一列
  1661. IF lnv_Object.EndCol>lnv_Object2.EndCol Then
  1662. li_x2 = inv_Layout.OF_GetColumn_X2( lnv_Object2.EndCol )
  1663. IF ( li_X2 - lnv_Object.X1 )<100 OR ( lnv_Object2.OF_GetTextRect_X1()+ii_RowSpace) > li_x2 Then
  1664. lnv_Object.StartCol =lnv_Object2.EndCol+1
  1665. EXIT
  1666. END IF
  1667. END IF
  1668. //则按对象的实际显示位置,再处理一次
  1669. IF lnv_Object2.Alignment='0' Then
  1670. lnv_Object2.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object2.OF_GetTextRect_X2() )
  1671. IF lnv_Object2.EndCol < lnv_Object.StartCol Then
  1672. Continue
  1673. END IF
  1674. END IF
  1675. IF lnv_Object.Alignment='1' Then
  1676. lnv_Object.StartCol= inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X1() )
  1677. IF lnv_Object.StartCol> lnv_Object2.EndCol Then
  1678. Continue
  1679. END IF
  1680. END IF
  1681. IF lnv_Object.Alignment<>'0' Then
  1682. lnv_Object.StartCol =inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() )
  1683. lnv_Object.EndCol =inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() )
  1684. END IF
  1685. IF lnv_Object2.Alignment='2' Then
  1686. lnv_Object2.StartCol =inv_Layout.OF_GetStartColumn( lnv_Object2.OF_GetTextRect_X1() )
  1687. lnv_Object2.EndCol =inv_Layout.OF_GetEndColumn( lnv_Object2.OF_GetTextRect_X2() )
  1688. END IF
  1689. IF lnv_Object2.Alignment='0' AND lnv_Object2.VisibleExp="" AND lnv_Object.VisibleExp="" AND &
  1690. lnv_Object2.EndCol> lnv_Object2.StartCol AND lnv_Object2.EndCol = lnv_Object.StartCol Then
  1691. lnv_Object2.EndCol = lnv_Object.StartCol -1
  1692. Exit
  1693. END IF
  1694. IF lnv_Object.Alignment='1' AND lnv_Object2.VisibleExp="" AND lnv_Object.VisibleExp="" AND &
  1695. lnv_Object.EndCol> lnv_Object.StartCol AND lnv_Object.StartCol = lnv_Object2.EndCol Then
  1696. lnv_Object.StartCol = lnv_Object2.EndCol +1
  1697. Exit
  1698. END IF
  1699. lnv_Object.CellHasMultiObjects =TRUE
  1700. lnv_Object2.CellHasMultiObjects =TRUE
  1701. END IF
  1702. Next
  1703. //与后面是否有
  1704. For lj=li +1 To li_ObjCount
  1705. lnv_Object2=inv_Objects[lj]
  1706. IF Not lnv_Object2.Visible Then
  1707. Continue
  1708. END IF
  1709. IF lnv_Object2.NoContaint AND lnv_Object.BorderStyle='0' Then
  1710. Continue
  1711. END IF
  1712. IF lnv_Object2.ObjType="report" OR lnv_Object2.ObjType="tempobj" THEN
  1713. Continue
  1714. END IF
  1715. IF lnv_Object2.StartRow<=lnv_Object.EndRow AND &
  1716. lnv_Object2.EndRow>=lnv_Object.StartRow AND &
  1717. lnv_Object2.EndCol <lnv_Object.StartCol Then
  1718. Exit
  1719. END IF
  1720. IF lnv_Object2.StartRow<=lnv_Object.EndRow AND &
  1721. lnv_Object2.EndRow>=lnv_Object.StartRow AND &
  1722. lnv_Object2.StartCol<=lnv_Object.EndCol AND &
  1723. lnv_Object2.EndCol>=lnv_Object.StartCol Then
  1724. //如果下一对象实际需要显示的内容,与当前对象开始列很近
  1725. li_x1 = inv_Layout.OF_GetColumn_X1( lnv_Object2.StartCol )
  1726. IF Abs(lnv_Object.x2 - li_x1)<100 OR ( lnv_Object.OF_GetTextRect_X2() -ii_RowSpace)< li_x1 Then
  1727. lnv_Object.EndCol = lnv_Object2.StartCol -1
  1728. EXIT
  1729. END IF
  1730. lnv_Object.CellHasMultiObjects =TRUE
  1731. lnv_Object2.CellHasMultiObjects =TRUE
  1732. END IF
  1733. Next
  1734. Next
  1735. //如果自动行高
  1736. IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then
  1737. For li=1 To UpperBound(inv_Objects)
  1738. inv_Objects[li].VAlignment=inv_Api.VAlign_TOP
  1739. Next
  1740. END IF
  1741. OF_GetLineColRowInfo()
  1742. end subroutine
  1743. public subroutine of_getcolrowinfo ();Long li, lj,lk
  1744. Long li_Row, li_Find ,li_ObjCount, li_Count
  1745. Long li_x1, li_x2 ,li_Y1, li_Y2
  1746. Long li_Pre_x1, li_Pre_y1
  1747. String ls_Processing
  1748. Boolean lb_HasObject
  1749. n_dw2xls_Object lnv_Object
  1750. n_dw2xls_Line lnv_Line
  1751. //先处理子数据窗口对象
  1752. For li=1 TO UpperBound(inv_Objects)
  1753. IF inv_Objects[li].ObjType="report" AND IsValid( inv_Objects[li].inv_Report) Then
  1754. inv_Objects[li].inv_Report.OF_GetColRowInfo()
  1755. END IF
  1756. Next
  1757. //判断对象的起止列
  1758. OF_SortObject_X()
  1759. li_ObjCount = UpperBound(inv_Objects)
  1760. ls_Processing = inv_Requestor.OF_GetProcessing()
  1761. For li=1 TO li_ObjCount
  1762. lnv_Object = inv_Objects[li]
  1763. IF Not lnv_Object.Visible Then
  1764. Continue
  1765. END IF
  1766. IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) AND &
  1767. IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) Then
  1768. lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.inv_LeftLine.x1 )
  1769. lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.inv_RightLine.X1 )
  1770. ELSE
  1771. lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.x1 )
  1772. lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.X2 )
  1773. /*
  1774. IF lnv_Object.EndCol>lnv_Object.StartCol Then
  1775. IF ls_Processing<>"1" AND ls_Processing<>"4" AND is_Name<>"detail" Then
  1776. IF IsValid(lnv_Object.inv_LeftLine)=False AND IsValid(lnv_Object.inv_RightLine) =False Then
  1777. IF lnv_Object.Alignment='1' Then
  1778. lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() )
  1779. ELSEIF lnv_Object.Alignment='2' Then
  1780. lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() )
  1781. lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() )
  1782. ELSE
  1783. lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() )
  1784. END IF
  1785. END IF
  1786. END IF
  1787. END IF
  1788. */
  1789. END IF
  1790. IF lnv_Object.StartCol<inv_Requestor.OF_GetFirstColumn() Then
  1791. inv_Requestor.OF_SetFirstColumn( lnv_Object.StartCol)
  1792. END IF
  1793. IF lnv_Object.EndCol>inv_Requestor.OF_GetLastColumn() Then
  1794. inv_Requestor.OF_SetLastColumn( lnv_Object.EndCol)
  1795. END IF
  1796. Next
  1797. For li=1 TO li_ObjCount
  1798. lnv_Object = inv_Objects[li]
  1799. IF Not lnv_Object.Visible Then
  1800. Continue
  1801. END IF
  1802. //查找前面一列
  1803. IF lnv_Object.BorderStyle='2' OR ( ls_Processing='1' OR ls_Processing='4') Then
  1804. IF lnv_Object.StartCol>1 Then
  1805. IF (inv_Layout.OF_GetColumn_X1(lnv_Object.StartCol) - lnv_Object.X1)>10 AND &
  1806. ( lnv_Object.X1 - inv_Layout.OF_GetColumn_X1(lnv_Object.StartCol -1))<=50 then //inv_Layout.ii_ColSpace Then
  1807. //前面是否有相同的对象?
  1808. lb_HasObject=False
  1809. For lj= li -1 To 1 Step -1
  1810. IF inv_Objects[lj].Y1<lnv_Object.Y2 AND inv_Objects[lj].Y2>lnv_Object.Y1 AND inv_Objects[lj].EndCol>= (lnv_Object.StartCol -1) Then
  1811. lb_HasObject=TRUE
  1812. Exit
  1813. END IF
  1814. NEXT
  1815. IF Not lb_HasObject Then
  1816. lnv_Object.StartCol =lnv_Object.StartCol -1
  1817. END IF
  1818. END IF
  1819. END IF
  1820. IF lnv_Object.EndCol<inv_Layout.OF_ColumnCount() Then
  1821. IF ( lnv_Object.X2 - inv_Layout.OF_GetColumn_X2(lnv_Object.EndCol))>10 AND &
  1822. ( inv_Layout.OF_GetColumn_X1(lnv_Object.EndCol +1) - lnv_Object.X2)<=50 Then
  1823. //后面是否有相同的对象?
  1824. lb_HasObject=False
  1825. For lj= li +1 To li_ObjCount
  1826. IF inv_Objects[lj].Y1<lnv_Object.Y2 AND inv_Objects[lj].Y2>lnv_Object.Y1 AND inv_Objects[lj].StartCol<= (lnv_Object.EndCol +1) Then
  1827. lb_HasObject=TRUE
  1828. Exit
  1829. END IF
  1830. NEXT
  1831. IF Not lb_HasObject Then
  1832. lnv_Object.EndCol =lnv_Object.EndCol +1
  1833. END IF
  1834. END IF
  1835. END IF
  1836. END IF
  1837. Next
  1838. //IF is_Name="detail" Then
  1839. // inv_Layout.ids_Columns.SaveAs("c:\columns.Txt",Text!,True)
  1840. //END IF
  1841. //Grid或Crosstab形式的数据窗口,细节区对象的起止行号都为1,不需要特别处理
  1842. IF (ls_Processing="1" or ls_Processing="4" ) AND is_Name="detail" AND ib_HasNestReport=False Then
  1843. ids_Rows.InsertRow(0)
  1844. ids_Rows.SetItem(1,"y1",0)
  1845. ids_Rows.SetItem(1,"y2",il_BandHeight)
  1846. IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then
  1847. For li=1 To UpperBound(inv_Objects)
  1848. inv_Objects[li].VAlignment=inv_Api.VAlign_TOP
  1849. Next
  1850. END IF
  1851. Return
  1852. END IF
  1853. //查找对象的Slideup的基准对象
  1854. OF_SortObject_Y()
  1855. For li=1 TO li_ObjCount
  1856. lnv_Object = inv_Objects[li]
  1857. IF Not lnv_Object.Visible Then
  1858. Continue
  1859. END IF
  1860. li_x1= lnv_Object.x1
  1861. li_y1 = lnv_Object.y1
  1862. li_x2= lnv_Object.x2
  1863. li_y2 = lnv_Object.y2
  1864. IF lnv_Object.IsSlideup Then
  1865. For lj=li -1 To 1 Step -1
  1866. IF (inv_Objects[lj].objType="report" OR UpperBound(inv_Objects[lj].inv_SlideupObject)>0 ) AND &
  1867. inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1<li_y1 AND &
  1868. inv_Objects[lj].X2>li_x1 AND inv_Objects[lj].X1<li_x2 Then
  1869. lnv_Object.OF_AddSlideUpObject( inv_Objects[lj])
  1870. IF (inv_Objects[lj].x1 -30)<=lnv_Object.X1 AND (inv_Objects[lj].x2+30)>=lnv_Object.X2 Then
  1871. Exit
  1872. END IF
  1873. END IF
  1874. NEXT
  1875. END IF
  1876. Next
  1877. OF_SortLine()
  1878. li_Count= UpperBound(inv_HLines)
  1879. For li=1 To li_Count
  1880. lnv_Line = inv_HLines[li]
  1881. li_x1= lnv_Line.x1
  1882. li_y1 = lnv_Line.y1
  1883. li_x2= lnv_Line.x2
  1884. li_y2 = lnv_Line.y2
  1885. IF lnv_Line.IsSlideup Then
  1886. For lj=li_ObjCount To 1 Step -1
  1887. IF (inv_Objects[lj].objType="report" OR UpperBound(inv_Objects[lj].inv_SlideupObject)>0 ) AND &
  1888. inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1<li_y1 AND &
  1889. inv_Objects[lj].X2>li_x1 AND inv_Objects[lj].X1<li_x2 Then
  1890. lnv_Line.inv_SlideupObject = inv_Objects[lj]
  1891. Exit
  1892. END IF
  1893. NEXT
  1894. END IF
  1895. Next
  1896. li_Count= UpperBound(inv_VLines)
  1897. For li=1 To li_Count
  1898. lnv_Line = inv_VLines[li]
  1899. li_x1= lnv_Line.x1
  1900. li_y1 = lnv_Line.y1
  1901. li_x2= lnv_Line.x2
  1902. li_y2 = lnv_Line.y2
  1903. IF lnv_Line.IsSlideup Then
  1904. For lj=li_ObjCount To 1 Step -1
  1905. IF (inv_Objects[lj].objType="report" OR UpperBound(inv_Objects[lj].inv_SlideupObject)>0 ) AND &
  1906. inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1<li_y1 AND &
  1907. inv_Objects[lj].X2>li_x1 AND inv_Objects[lj].X1<li_x2 Then
  1908. lnv_Line.inv_SlideupObject = inv_Objects[lj]
  1909. Exit
  1910. END IF
  1911. NEXT
  1912. END IF
  1913. Next
  1914. OF_GetColRowInfo2()
  1915. end subroutine
  1916. public subroutine of_updatecolumninfo ();Int li, li_ObjCount
  1917. Long li_Width
  1918. n_dw2xls_Object lnv_Object
  1919. li_ObjCount = UpperBound(inv_Objects)
  1920. //如果文本所在的列,不能完整显示文本对象,则显示列的宽度,以便完整显示
  1921. For li=1 To li_ObjCount
  1922. lnv_Object = inv_Objects[li]
  1923. //先处理子数据窗口对象
  1924. IF lnv_Object.ObjType="report" Then
  1925. IF IsValid( lnv_Object.inv_Report) Then
  1926. lnv_Object.inv_Report.OF_UpdateColumnInfo()
  1927. END IF
  1928. Continue
  1929. END IF
  1930. IF lnv_Object.EndCol > lnv_Object.StartCol Then
  1931. Continue
  1932. END IF
  1933. IF lnv_Object.NoContaint AND lnv_Object.BorderStyle='0' Then
  1934. Continue
  1935. END IF
  1936. IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" THEN
  1937. Continue
  1938. END IF
  1939. IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then
  1940. Continue
  1941. END IF
  1942. IF lnv_Object.TextWidth>0 Then
  1943. li_Width = inv_Layout.OF_GetColumn_Width(lnv_Object.StartCol)
  1944. IF li_Width<lnv_Object.TextWidth THEN
  1945. IF lnv_Object.TextWidth <lnv_Object.Width Then
  1946. inv_Layout.OF_UpdateColumn_TextWidth( lnv_Object.StartCol , lnv_Object.TextWidth)
  1947. ELSE
  1948. inv_Layout.OF_UpdateColumn_TextWidth( lnv_Object.StartCol , lnv_Object.Width)
  1949. END IF
  1950. END IF
  1951. END IF
  1952. Next
  1953. end subroutine
  1954. public subroutine of_setworksheet (readonly unsignedlong al_hsheet);il_hSheet = al_hSheet
  1955. end subroutine
  1956. public function long of_output (readonly long al_row, readonly long al_xlsrow);Long li ,lj ,lk
  1957. Long li_startRow ,li_StartCol, li_EndRow, li_EndCol ,li_Rows
  1958. Long li_CurRow, li_Max_EndRow ,li_OutRows, li_DataRow
  1959. Long pCell ,li_Cell ,li_xf
  1960. String ls_Temp
  1961. Boolean lb_WriteValue , lb_SameValue
  1962. n_dw2xls_Object lnv_Object
  1963. //根据对象的位置,重新计算行列位置
  1964. IF ib_DynamicRowInfo Then // AND al_Row>1
  1965. OF_RefreshRowInfo(al_Row )
  1966. END IF
  1967. //计算表达式的值
  1968. inv_Requestor.OF_UpdateExpValues(al_Row)
  1969. //输出行高
  1970. OF_WriteRowHeight(al_Row , al_XlsRow)
  1971. //输出背景
  1972. IF OF_RowCount()>0 Then
  1973. IF is_BKColorExp<>'' Then
  1974. il_BkColor =inv_Api.OF_GetColor(Long(inv_Requestor.OF_Evaluate(al_Row,is_BKColorExp)))
  1975. END IF
  1976. IF il_BKColor>0 AND il_BkColor<>COLOR_TRANSPARENT AND il_BKColor<> inv_Requestor.OF_GetBKColor() Then
  1977. inv_Api.SetBackColor(il_hSheet, 1+al_xlsRow, inv_Requestor.OF_GetFirstColumn() , OF_RowCount()+al_xlsRow, inv_Requestor.OF_GetLastColumn() ,il_BKColor )
  1978. END IF
  1979. END IF
  1980. // 输出边线
  1981. For li=1 TO UpperBound(inv_HLines)
  1982. IF inv_HLines[li].IsClone Then
  1983. Continue
  1984. END IF
  1985. IF inv_HLines[li].IsSlideUp AND IsValid( inv_HLines[li].inv_SlideUpObject) Then
  1986. Continue
  1987. END IF
  1988. IF inv_HLines[li].VisibleExp<>"" Then
  1989. IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_HLines[li].VisibleExp))=0 Then
  1990. Continue
  1991. END IF
  1992. END IF
  1993. OF_WriteBorder( inv_HLines[li], al_XlsRow)
  1994. li_EndRow = al_XlsRow + inv_HLines[li].EndRow
  1995. IF li_EndRow > li_Max_EndRow Then
  1996. li_Max_EndRow = li_EndRow
  1997. END IF
  1998. Next
  1999. For li=1 TO UpperBound(inv_VLines)
  2000. IF inv_VLines[li].IsClone Then
  2001. Continue
  2002. END IF
  2003. IF inv_VLines[li].IsSlideUp AND IsValid( inv_VLines[li].inv_SlideUpObject) Then
  2004. Continue
  2005. END IF
  2006. IF inv_VLines[li].VisibleExp<>"" Then
  2007. IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_VLines[li].VisibleExp))=0 Then
  2008. Continue
  2009. END IF
  2010. END IF
  2011. OF_WriteBorder( inv_VLines[li], al_XlsRow)
  2012. li_EndRow = al_XlsRow + inv_VLines[li].EndRow
  2013. IF li_EndRow > li_Max_EndRow Then
  2014. li_Max_EndRow = li_EndRow
  2015. END IF
  2016. Next
  2017. //输出对象内容
  2018. For li=1 To UpperBound(inv_Objects)
  2019. IF inv_Requestor.OF_IsCancel() Then
  2020. Return -1
  2021. END IF
  2022. lnv_Object = inv_Objects[li]
  2023. IF Not lnv_Object.Visible Then
  2024. Continue
  2025. END IF
  2026. IF lnv_Object.IsBorderOnly OR ( lnv_Object.NoContaint AND lnv_Object.CellHasMultiObjects ) Then
  2027. Continue
  2028. END IF
  2029. li_DataRow = al_Row+lnv_Object.RowInDetail -1
  2030. IF li_DataRow>inv_Requestor.OF_RowCount() Then
  2031. Continue
  2032. END IF
  2033. IF lnv_Object.VisibleExp<>"" Then
  2034. //由于VisibleExp没有通过OF_AddExpression加入到表达式数组,所以不能用OF_GetExpValue来取值
  2035. IF Long(inv_Requestor.OF_Evaluate(li_DataRow,lnv_Object.VisibleExp))=0 Then
  2036. Continue
  2037. END IF
  2038. END IF
  2039. IF IsValid(lnv_Object.inv_Report) Then
  2040. IF inv_Requestor.OF_IsNested() AND al_Row>1 Then // Then
  2041. inv_Requestor.OF_UpdateReport(al_Row, lnv_Object.Name, lnv_Object.inv_Report)
  2042. END IF
  2043. IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then
  2044. li_CurRow = lnv_Object.OF_GetLastRow()
  2045. IF (lnv_Object.Y1 - lnv_Object.inv_SlideUpObject[1].Y2)>=25 Then //已经从Y从大向小排序
  2046. li_CurRow++
  2047. lj =lnv_Object.Y1 - lnv_Object.inv_SlideUpObject[1].Y2
  2048. lj = UnitsToPixels(lj,YUnitsToPixels!) /96*1440
  2049. inv_Api.SetRowHeight(il_hSheet, li_CurRow, lj)
  2050. END IF
  2051. li_EndRow = lnv_Object.inv_Report.OF_OutPut(il_hSheet ,li_CurRow )
  2052. ELSE
  2053. li_EndRow = lnv_Object.inv_Report.OF_OutPut(il_hSheet , lnv_Object.StartRow +al_XlsRow -1 )
  2054. END IF
  2055. lnv_Object.LastRow = li_EndRow
  2056. IF li_EndRow>li_Max_EndRow Then
  2057. li_Max_EndRow = li_EndRow
  2058. END IF
  2059. Continue
  2060. END IF
  2061. IF lnv_Object.IsPicture OR lnv_Object.IsGraph Then
  2062. IF inv_Requestor.OF_IsWritePictures() Then
  2063. OF_WritePicture(lnv_Object, li_DataRow, al_XlsRow)
  2064. END IF
  2065. Continue
  2066. END IF
  2067. li_StartRow = lnv_Object.StartRow
  2068. li_EndRow = lnv_Object.EndRow
  2069. li_StartCol = lnv_Object.StartCol
  2070. li_EndCol = lnv_Object.EndCol
  2071. IF li_StartCol<1 OR li_EndCol<1 OR li_StartRow<1 OR li_EndRow<1 Then
  2072. Continue
  2073. END IF
  2074. IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then
  2075. li_CurRow = lnv_Object.OF_GetLastRow() +1
  2076. ELSE
  2077. li_CurRow = li_StartRow + al_xlsrow
  2078. END IF
  2079. li_EndRow = li_CurRow + li_EndRow - li_StartRow
  2080. pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_StartCol)
  2081. IF pCell<=0 Then
  2082. Continue
  2083. END IF
  2084. lb_WriteValue=false
  2085. lb_SameValue=False
  2086. IF lnv_Object.ObjType<>"tempobj" AND lnv_Object.NoContaint=False Then
  2087. OF_WriteValue(lnv_Object, pCell, li_DataRow ,lb_WriteValue,lb_SameValue ) //输出内容
  2088. END IF
  2089. IF lnv_Object.CellHasMultiObjects Then
  2090. IF lb_WriteValue Then
  2091. OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式
  2092. END IF
  2093. ELSEIF lnv_Object.DynamicPosition Then // OR ib_AutoHeight
  2094. IF lb_WriteValue OR lnv_Object.PositionChanged=False Then
  2095. OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式
  2096. END IF
  2097. ELSE
  2098. OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式
  2099. END IF
  2100. IF lnv_Object.IsSparse AND lb_SameValue AND lnv_Object.LastRow>0 AND lnv_Object.LastWriteValueRow<al_Row AND al_Row>1 Then //AND inv_Requestor.OF_IsDetail_Begin()=False
  2101. IF inv_Requestor.OF_GetProcessing()="1" OR inv_Requestor.OF_GetProcessing()="4" Then
  2102. inv_Api.SetBorder(pCell,inv_Api.Border_TOP,inv_Api.BorderStyle_NONE, 0)
  2103. li_Cell = inv_Api.GetCell(il_hSheet, lnv_Object.LastRow,lnv_Object.StartCol )
  2104. IF li_Cell>0 Then
  2105. inv_Api.SetBorder(li_Cell,inv_Api.Border_BOTTOM ,inv_Api.BorderStyle_NONE, 0)
  2106. END IF
  2107. END IF
  2108. END IF
  2109. //合并单元
  2110. IF lnv_Object.EndRow> lnv_Object.StartRow OR lnv_Object.EndCOl>lnv_Object.StartCol Then
  2111. IF lnv_Object.CellHasMultiObjects Then //OR ib_AutoHeight
  2112. IF lb_WriteValue Then
  2113. inv_Api.MergeCells(il_hSheet, li_CurRow,li_StartCol, li_EndRow, li_EndCol)
  2114. END IF
  2115. ELSEIF lnv_Object.DynamicPosition Then
  2116. IF lb_WriteValue OR lnv_Object.PositionChanged=False Then
  2117. inv_Api.MergeCells(il_hSheet, li_CurRow,li_StartCol, li_EndRow, li_EndCol)
  2118. END IF
  2119. ELSE
  2120. inv_Api.MergeCells(il_hSheet, li_CurRow ,li_StartCol, li_EndRow , li_EndCol)
  2121. END IF
  2122. END IF
  2123. IF lb_WriteValue OR ( lnv_Object.AutoHeight=False AND lnv_Object.CellHasMultiObjects =False) Then
  2124. IF li_EndRow > li_Max_EndRow Then
  2125. li_Max_EndRow = li_EndRow
  2126. END IF
  2127. END IF
  2128. IF lnv_Object.IsSparse AND lb_WriteValue AND al_Row>1 Then
  2129. For lj=li+1 To UpperBound(inv_Objects)
  2130. IF inv_Objects[lj].IsSparse Then
  2131. inv_Objects[lj].LastWriteValueRow = al_Row
  2132. END IF
  2133. Next
  2134. END IF
  2135. lnv_Object.LastRow =li_EndRow
  2136. Next
  2137. li_OutRows = li_Max_EndRow - al_xlsrow
  2138. IF li_OutRows>OF_RowCount() Then //存在子数据窗口,则根据线条的位置重新设置边线
  2139. For li=1 TO UpperBound(inv_HLines)
  2140. IF inv_HLines[li].ii_TopBottom<>2 Then
  2141. Continue
  2142. END IF
  2143. IF inv_HLines[li].IsClone Then
  2144. Continue
  2145. END IF
  2146. IF inv_HLines[li].Y1Exp_RowHeight=False AND &
  2147. ((inv_HLines[li].Y1+30)<il_BandHeight) AND &
  2148. inv_HLines[li].IsSlideUp=False Then
  2149. Continue
  2150. END IF
  2151. IF inv_HLines[li].VisibleExp<>"" Then
  2152. IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_HLines[li].VisibleExp))=0 Then //OF_GetExpValue
  2153. Continue
  2154. END IF
  2155. END IF
  2156. IF inv_HLines[li].IsSlideUp AND IsValid(inv_HLines[li].inv_SlideupObject) Then
  2157. OF_WriteBorder( inv_HLines[li], inv_HLines[li].inv_SlideupObject.LastRow - inv_HLines[li].inv_SlideupObject.StartRow ) //+ inv_HLines[li].StartRow
  2158. ELSEIF inv_HLines[li].Y1Exp_RowHeight Then
  2159. li_StartRow = inv_HLines[li].StartRow
  2160. li_EndRow = inv_HLines[li].EndRow
  2161. inv_HLines[li].StartRow = li_OutRows
  2162. inv_HLines[li].EndRow = li_OutRows
  2163. OF_WriteBorder( inv_HLines[li], al_XlsRow)
  2164. inv_HLines[li].StartRow=li_StartRow
  2165. inv_HLines[li].EndRow= li_EndRow
  2166. END IF
  2167. Next
  2168. For li=1 TO UpperBound(inv_VLines)
  2169. IF inv_VLines[li].IsClone Then
  2170. Continue
  2171. END IF
  2172. IF inv_VLines[li].Y2Exp_RowHeight=False AND ((inv_VLines[li].Y2+30)<il_BandHeight) Then
  2173. Continue
  2174. END IF
  2175. IF inv_VLines[li].VisibleExp<>"" Then
  2176. IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_VLines[li].VisibleExp))=0 Then
  2177. Continue
  2178. END IF
  2179. END IF
  2180. li_EndRow = inv_VLines[li].EndRow
  2181. inv_VLines[li].EndRow = li_OutRows
  2182. OF_WriteBorder( inv_VLines[li], al_XlsRow)
  2183. inv_VLines[li].EndRow= li_EndRow
  2184. Next
  2185. END IF
  2186. IF ib_AutoHeight Then
  2187. IF li_OutRows<0 Then
  2188. li_OutRows =0
  2189. END IF
  2190. ELSE
  2191. IF li_OutRows<OF_RowCount() Then
  2192. li_OutRows =OF_RowCount()
  2193. END IF
  2194. END IF
  2195. //提高生成Excel文件的效率
  2196. IF ib_FirstOut AND (is_Name="detail" OR ib_IsGroupBand ) THEN
  2197. For li=1 To UpperBound(inv_Objects)
  2198. lnv_Object=inv_Objects[li]
  2199. IF Not lnv_Object.WritedFormat Then //如果还没输入格式,则不通过GetXF来提高效率,因为有可以第一行Visible为0,没是正常输出了
  2200. Continue
  2201. END IF
  2202. IF lnv_Object.FontNameExp="" AND &
  2203. lnv_Object.FontSizeExp="" AND &
  2204. lnv_Object.FontBoldExp="" AND &
  2205. lnv_Object.FontItalicExp="" AND &
  2206. lnv_Object.FontUnderlineExp="" AND &
  2207. lnv_Object.FontStrikeoutExp="" AND &
  2208. lnv_Object.FormatExp="" AND &
  2209. lnv_Object.ColorExp="" AND &
  2210. lnv_Object.BKColorExp="" AND &
  2211. (lnv_Object.BKColor<>COLOR_TRANSPARENT OR is_BKColorExp="") AND &
  2212. lnv_Object.IsSparse=False Then
  2213. IF IsValid(lnv_Object.inv_TopLine) Then
  2214. IF lnv_Object.inv_TopLine.VisibleExp<>'' THen
  2215. Continue
  2216. END IF
  2217. END IF
  2218. IF IsValid(lnv_Object.inv_BottomLine) Then
  2219. IF lnv_Object.inv_BottomLine.VisibleExp<>'' THen
  2220. Continue
  2221. END IF
  2222. END IF
  2223. IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then
  2224. li_StartRow = lnv_Object.OF_GetLastRow() +1
  2225. li_EndRow = li_StartRow + (lnv_Object.EndRow - lnv_Object.StartRow)
  2226. ELSE
  2227. li_StartRow = lnv_Object.StartRow
  2228. li_EndRow = lnv_Object.EndRow
  2229. END IF
  2230. li_StartCol = lnv_Object.StartCol
  2231. li_EndCol = lnv_Object.EndCol
  2232. IF li_StartCol<1 OR li_EndCol<1 OR li_StartRow<1 OR li_EndRow<1 Then
  2233. Continue
  2234. END IF
  2235. li_CurRow = li_StartRow + al_xlsrow
  2236. pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_StartCol)
  2237. lnv_Object.xfIndex =inv_Api.GetXF(pCell)
  2238. END IF
  2239. Next
  2240. END IF
  2241. ib_FirstOut =False
  2242. Return li_OutRows
  2243. Return 0
  2244. end function
  2245. public subroutine of_writeborder (readonly n_dw2xls_line anv_line, readonly long al_xlsrow);Int li_Row, li_Col , li_Side
  2246. Int li_StartRow ,li_EndRow, li_StartCol, li_EndCol
  2247. Long li_CurRow,pCell
  2248. IF anv_Line.IsClone Then
  2249. Return
  2250. END IF
  2251. IF anv_Line.ii_LeftRight<>0 Then
  2252. IF anv_Line.ii_LeftRight=1 Then
  2253. li_Col =anv_Line.StartCol
  2254. li_Side = inv_Api.BORDER_LEFT
  2255. ELSE
  2256. li_Col = anv_Line.EndCol
  2257. li_Side = inv_Api.BORDER_RIGHT
  2258. END IF
  2259. For li_Row = anv_Line.StartRow To anv_Line.EndRow
  2260. li_CurRow = al_xlsRow + li_Row
  2261. pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_Col)
  2262. inv_Api.SetBorder(pCell, li_Side, anv_Line.BorderStyle ,anv_Line.PenColor )
  2263. Next
  2264. ELSEIF anv_Line.ii_TopBottom<>0 Then
  2265. IF anv_Line.ii_TopBottom=1 Then
  2266. li_Row =anv_Line.StartRow
  2267. li_Side = inv_Api.BORDER_TOP
  2268. ELSE
  2269. li_Row = anv_Line.EndRow
  2270. li_Side = inv_Api.BORDER_BOTTOM
  2271. END IF
  2272. For li_Col = anv_Line.StartCol To anv_Line.EndCol
  2273. li_CurRow = al_xlsRow + li_Row
  2274. pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_Col)
  2275. inv_Api.SetBorder(pCell, li_Side, anv_Line.BorderStyle ,anv_Line.PenColor )
  2276. Next
  2277. END IF
  2278. end subroutine
  2279. protected subroutine of_writeformat (readonly n_dw2xls_object anv_object, readonly long al_xlsrow, readonly long pcell, readonly long al_row);Long li ,lj
  2280. String ls_Temp
  2281. Long li_Temp,li_Cell, li_XF
  2282. //输出对象的格式,如字体、对齐方式、边框等
  2283. IF anv_Object.XFIndex<> -1 Then
  2284. inv_Api.SetXF(pCell, anv_Object.XFIndex )
  2285. ELSEIF anv_Object.NoContaint Then
  2286. IF anv_Object.BorderStyle='2' Then
  2287. FOR lj=anv_Object.StartCol To anv_Object.EndCol
  2288. li_Cell = inv_Api.GetCell(il_hSheet, al_xlsRow + anv_Object.EndRow - anv_Object.StartRow,lj )
  2289. inv_Api.SetBorder(pCell, inv_Api.borderstyle_thin, 0 )
  2290. Next
  2291. ELSEIF anv_Object.BorderStyle='4' Then
  2292. FOR lj=anv_Object.StartCol To anv_Object.EndCol
  2293. li_Cell = inv_Api.GetCell(il_hSheet, al_xlsRow + anv_Object.EndRow - anv_Object.StartRow,lj )
  2294. inv_Api.SetBorder(pCell, inv_Api.Border_BOTTOM, inv_Api.borderstyle_thin, 0 )
  2295. Next
  2296. END IF
  2297. ELSE
  2298. IF anv_Object.ObjType="tempobj" Then
  2299. IF is_BKColorExp<>"" Then
  2300. //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, is_BKColorExp )) )
  2301. li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue(is_BKColorExp,1 )) )
  2302. IF li_Temp<>COLOR_TRANSPARENT Then
  2303. inv_Api.SetBackColor(pCell, li_Temp )
  2304. END IF
  2305. ELSEIF il_BkColor<>COLOR_TRANSPARENT Then
  2306. inv_Api.SetBackColor(pCell, il_BkColor )
  2307. END IF
  2308. ELSE
  2309. IF anv_Object.FontNameExp="" Then
  2310. inv_Api.SetFontName(pCell, anv_Object.FontName )
  2311. ELSE
  2312. //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontNameExp)
  2313. ls_Temp =inv_Requestor.OF_GetExpValue(anv_Object.FontNameExp,anv_Object.RowInDetail )
  2314. IF ls_Temp="" Then
  2315. inv_Api.SetFontName(pCell, anv_Object.FontName )
  2316. ELSE
  2317. inv_Api.SetFontName(pCell, ls_Temp )
  2318. END IF
  2319. END IF
  2320. IF anv_Object.FontSizeExp="" Then
  2321. inv_Api.SetFontSize(pCell, anv_Object.FontSize )
  2322. ELSE
  2323. // li_Temp =Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontSizeExp))
  2324. li_Temp =Long(inv_Requestor.OF_GetExpValue( anv_Object.FontSizeExp, anv_Object.RowInDetail ))
  2325. IF li_Temp=0 Then
  2326. inv_Api.SetFontSize(pCell, anv_Object.FontSize )
  2327. ELSE
  2328. IF li_Temp>0 Then
  2329. inv_Api.SetFontSize(pCell, inv_Requestor.OF_GetWinApi().OF_GetFontSize(li_Temp, inv_Requestor.OF_GetUnits() ) )
  2330. ELSE
  2331. inv_Api.SetFontSize(pCell, Abs(li_Temp) )
  2332. END IF
  2333. END IF
  2334. END IF
  2335. IF anv_Object.FontBoldExp="" Then
  2336. inv_Api.SetFontBold(pCell, anv_Object.FontBold )
  2337. ELSE
  2338. //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontBoldExp)
  2339. ls_Temp =inv_Requestor.OF_GetExpValue(anv_Object.FontBoldExp , anv_Object.RowInDetail )
  2340. IF ls_Temp>='700' Then
  2341. inv_Api.SetFontBold(pCell, True )
  2342. ELSE
  2343. inv_Api.SetFontBold(pCell, False )
  2344. END IF
  2345. END IF
  2346. IF anv_Object.FontItalicExp="" Then
  2347. inv_Api.SetFontItalic(pCell, anv_Object.FontItalic )
  2348. ELSE
  2349. // ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontItalicExp)
  2350. ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontItalicExp,anv_Object.RowInDetail )
  2351. IF ls_Temp="1" OR ls_Temp="yes" Then
  2352. inv_Api.SetFontItalic(pCell, True )
  2353. ELSE
  2354. inv_Api.SetFontItalic(pCell, False )
  2355. END IF
  2356. END IF
  2357. IF anv_Object.FontUnderlineExp="" Then
  2358. inv_Api.SetFontUnderline(pCell, anv_Object.FontUnderline )
  2359. ELSE
  2360. //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontUnderlineExp)
  2361. ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontUnderlineExp,anv_Object.RowInDetail )
  2362. IF ls_Temp="1" OR ls_Temp="yes" Then
  2363. inv_Api.SetFontUnderline(pCell, True )
  2364. ELSE
  2365. inv_Api.SetFontUnderline(pCell, False )
  2366. END IF
  2367. END IF
  2368. IF anv_Object.FontStrikeoutExp="" Then
  2369. inv_Api.SetFontStrikeout(pCell, anv_Object.FontStrikeout )
  2370. ELSE
  2371. //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontStrikeoutExp)
  2372. ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontStrikeoutExp,anv_Object.RowInDetail )
  2373. IF ls_Temp="1" OR ls_Temp="yes" Then
  2374. inv_Api.SetFontStrikeout(pCell, True )
  2375. ELSE
  2376. inv_Api.SetFontStrikeout(pCell, False )
  2377. END IF
  2378. END IF
  2379. IF anv_Object.ColorExp="" Then
  2380. IF anv_Object.Color<>COLOR_TRANSPARENT Then
  2381. inv_Api.SetTextColor(pCell, anv_Object.Color)
  2382. END IF
  2383. ELSE
  2384. //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.ColorExp)) )
  2385. li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue( anv_Object.ColorExp,anv_Object.RowInDetail )) )
  2386. IF li_Temp<>COLOR_TRANSPARENT Then
  2387. inv_Api.SetTextColor(pCell, li_Temp )
  2388. END IF
  2389. END IF
  2390. IF anv_Object.bkColorExp="" Then
  2391. IF anv_Object.BkColor<>COLOR_TRANSPARENT AND anv_Object.BkColor<>inv_Requestor.OF_GetBKColor() Then
  2392. inv_Api.SetBackColor(pCell, anv_Object.BkColor)
  2393. END IF
  2394. ELSE
  2395. //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.bkColorExp)) )
  2396. li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue( anv_Object.bkColorExp, anv_Object.RowInDetail )) )
  2397. IF li_Temp<>inv_Requestor.OF_GetBKColor() AND li_Temp<>COLOR_TRANSPARENT Then
  2398. inv_Api.SetBackColor(pCell, li_Temp )
  2399. END IF
  2400. END IF
  2401. //输出数据格式、对齐方式
  2402. inv_Api.SetHalignment(pCell, anv_Object.HAlignment )
  2403. inv_Api.SetValignment(pCell, anv_Object.VAlignment )
  2404. inv_Api.SetTextWrap(pCell,anv_Object.WrapText )
  2405. IF anv_Object.FormatExp='' Then
  2406. IF anv_Object.Format<>'' Then
  2407. inv_Api.SetFormat(pCell, anv_Object.Format )
  2408. END IF
  2409. ELSE
  2410. // ls_Temp = inv_Requestor.OF_Evaluate(al_Row, anv_Object.FormatExp)
  2411. ls_Temp = inv_Requestor.OF_GetExpValue( anv_Object.FormatExp ,anv_Object.RowInDetail )
  2412. IF ls_Temp<>"" Then
  2413. inv_Api.SetFormat(pCell, ls_Temp )
  2414. END IF
  2415. END IF
  2416. END IF
  2417. //输出边框\颜色等
  2418. IF anv_Object.BorderStyle='2' Then
  2419. inv_Api.SetBorder(pCell, inv_Api.borderstyle_thin, 0)
  2420. ELSEIF anv_Object.BorderStyle='4' Then //下边线
  2421. inv_Api.SetBorder(pCell, inv_Api.Border_BOTTOM, inv_Api.borderstyle_thin, 0 )
  2422. END IF
  2423. END IF
  2424. anv_Object.WritedFormat =TRUE
  2425. end subroutine
  2426. protected subroutine of_writevalue (readonly n_dw2xls_object anv_object, readonly long pcell, readonly long al_row, ref boolean ab_writevalue, ref boolean ab_samevalue);Long li_Pos ,li_Cell ,li_LastRow
  2427. String ls_Value
  2428. Double ldb_Value
  2429. Date ld_Value
  2430. Datetime ldt_Value
  2431. Time lt_Value
  2432. ab_WriteValue =False
  2433. ab_SameValue =False
  2434. IF anv_Object.IsSparse Then
  2435. li_LastRow = anv_Object.OF_GetLastWriteValueRow()
  2436. END IF
  2437. //输出对象的数据内容
  2438. IF anv_Object.ObjType="text" Then
  2439. IF anv_Object.TextExp<>'' Then
  2440. //ls_Value =inv_Requestor.OF_Evaluate(al_Row, anv_Object.TextExp)
  2441. ls_Value =inv_Requestor.OF_GetExpValue( anv_Object.TextExp , anv_Object.RowInDetail )
  2442. ELSE
  2443. ls_Value = anv_Object.Text
  2444. END IF
  2445. IF Pos(ls_Value,"~r")>0 AND Pos(ls_Value,"~n")<=0 Then
  2446. ls_Value=inv_Requestor.OF_ReplaceAll(ls_Value,"~r","~r~n")
  2447. anv_Object.WrapText=TRUE
  2448. inv_Api.SetTextWrap(pcell, TRUE )
  2449. END IF
  2450. IF IsNull(ls_Value) Then
  2451. ls_Value=""
  2452. END IF
  2453. IF ls_Value<>'' Then
  2454. IF anv_Object.WrapText=False AND anv_Object.Alignment='0' AND &
  2455. (anv_Object.X1 - inv_Layout.OF_GetColumn_X1(anv_Object.StartCol ))>anv_Object.SpaceCharWidth AND anv_Object.SpaceCharWidth>0 Then
  2456. ls_Value=Space(Ceiling( ( anv_Object.X1 - inv_Layout.OF_GetColumn_X1(anv_Object.StartCol )) / anv_Object.SpaceCharWidth) ) + ls_Value
  2457. //ELSEIF anv_Object.Alignment='1' AND ( inv_Layout.OF_GetColumn_X2(anv_Object.EndCol ) - anv_Object.X2 )>anv_Object.SpaceCharWidth AND anv_Object.SpaceCharWidth>0 Then
  2458. // ls_Value =ls_Value+Space(Ceiling( (inv_Layout.OF_GetColumn_X2(anv_Object.EndCol ) - anv_Object.X2 ) / anv_Object.SpaceCharWidth) )
  2459. END IF
  2460. inv_Api.SetValue(pcell, ls_Value )
  2461. ab_WriteValue =TRUE
  2462. END IF
  2463. ELSEIF anv_Object.IsGetDisplayValue Then
  2464. ls_Value =inv_Requestor.OF_GetDisplayValue(al_Row, anv_Object.ColID, anv_Object.Name, anv_Object.IsCloneColumn, anv_Object.EditStyle , anv_Object.ColType )
  2465. IF IsNull(ls_Value) Then
  2466. ls_Value=""
  2467. END IF
  2468. IF ls_Value<>"?" AND ls_Value<>"!" AND ls_Value<>"" Then
  2469. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False THEN
  2470. IF li_LastRow<al_Row Then
  2471. IF anv_Object.PriorRowValue= ls_Value Then
  2472. ab_SameValue=TRUE
  2473. ELSE
  2474. inv_Api.SetValue(pcell, ls_Value)
  2475. ab_WriteValue =TRUE
  2476. END IF
  2477. ELSE
  2478. inv_Api.SetValue(pcell, ls_Value)
  2479. ab_WriteValue =TRUE
  2480. END IF
  2481. ELSE
  2482. inv_Api.SetValue(pcell, ls_Value)
  2483. ab_WriteValue =TRUE
  2484. END IF
  2485. END IF
  2486. IF anv_Object.IsSparse Then
  2487. IF anv_Object.PriorRowValue =ls_Value AND al_Row>1 Then
  2488. ab_SameValue =TRUE
  2489. ELSE
  2490. anv_Object.PriorRowValue =ls_Value
  2491. END IF
  2492. END IF
  2493. ELSEIF anv_Object.ObjType="column" OR anv_Object.ObjType="compute" Then
  2494. IF anv_Object.ColType="" Then //对象的计算公式可能无效
  2495. Return
  2496. END IF
  2497. IF anv_Object.ColType="char" Then
  2498. IF anv_Object.ColID>0 Then
  2499. ls_Value = inv_Requestor.OF_GetItemString(al_Row, anv_Object.ColID)
  2500. ELSE
  2501. ls_Value = inv_Requestor.OF_GetItemString(al_Row, anv_Object.Name)
  2502. END IF
  2503. IF IsNull(ls_Value) Then
  2504. ls_Value=""
  2505. END IF
  2506. IF anv_Object.IsCheckBox AND anv_Object.CheckBox_Text<>"" Then
  2507. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2508. IF li_LastRow<al_Row Then
  2509. IF anv_Object.PriorRowValue=ls_Value Then
  2510. ab_SameValue=TRUE
  2511. ELSE
  2512. IF ls_Value = anv_Object.CheckBox_On Then
  2513. IF anv_Object.CheckBox_LeftText Then
  2514. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2515. ELSE
  2516. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2517. END IF
  2518. ELSE
  2519. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2520. END IF
  2521. ab_WriteValue =TRUE
  2522. END IF
  2523. ELSE
  2524. IF ls_Value = anv_Object.CheckBox_On Then
  2525. IF anv_Object.CheckBox_LeftText Then
  2526. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2527. ELSE
  2528. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2529. END IF
  2530. ELSE
  2531. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2532. END IF
  2533. ab_WriteValue =TRUE
  2534. END IF
  2535. ELSE
  2536. IF ls_Value = anv_Object.CheckBox_On Then
  2537. IF anv_Object.CheckBox_LeftText Then
  2538. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2539. ELSE
  2540. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2541. END IF
  2542. ELSE
  2543. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2544. END IF
  2545. ab_WriteValue =TRUE
  2546. END IF
  2547. ELSE
  2548. IF anv_Object.IsCheckBox Then
  2549. IF ls_Value=anv_Object.CheckBox_On Then
  2550. ls_Value=" √ "
  2551. ELSE
  2552. ls_Value=""
  2553. END IF
  2554. END IF
  2555. IF ls_Value<>"" AND IsNull(ls_Value)=False Then
  2556. IF Pos(ls_Value,"~r")>0 AND Pos(ls_Value,"~n")<=0 Then
  2557. ls_Value=inv_Requestor.OF_ReplaceAll(ls_Value,"~r","~r~n")
  2558. END IF
  2559. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2560. IF li_LastRow<al_Row Then
  2561. IF anv_Object.PriorRowValue=ls_Value Then
  2562. ab_SameValue=TRUE
  2563. ELSE
  2564. inv_Api.SetValue(pcell, ls_Value)
  2565. ab_WriteValue =TRUE
  2566. END IF
  2567. ELSE
  2568. inv_Api.SetValue(pcell, ls_Value)
  2569. ab_WriteValue =TRUE
  2570. END IF
  2571. ELSE
  2572. inv_Api.SetValue(pcell, ls_Value)
  2573. ab_WriteValue =TRUE
  2574. END IF
  2575. END IF
  2576. END IF
  2577. IF anv_Object.IsSparse Then
  2578. IF anv_Object.PriorRowValue=ls_Value AND al_Row>1 Then
  2579. ab_SameValue=TRUE
  2580. ELSE
  2581. anv_Object.PriorRowValue =ls_Value
  2582. END IF
  2583. END IF
  2584. ELSEIF anv_Object.ColType="datetime" Then
  2585. IF anv_Object.ColID>0 Then
  2586. ldt_Value = inv_Requestor.OF_GetItemDateTime(al_Row,anv_Object.ColID)
  2587. ELSE
  2588. ldt_Value = inv_Requestor.OF_GetItemDateTime(al_Row,anv_Object.Name)
  2589. END IF
  2590. IF IsNull(ldt_Value)=False Then //Date(ldt_Value)<>Date("1900-01-01") AND
  2591. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2592. IF li_LastRow<al_Row Then
  2593. IF anv_Object.PriorRowValue=ldt_Value Then
  2594. ab_SameValue=TRUE
  2595. ELSE
  2596. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue(ldt_Value) )
  2597. ab_WriteValue =TRUE
  2598. END IF
  2599. ELSE
  2600. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue(ldt_Value) )
  2601. ab_WriteValue =TRUE
  2602. END IF
  2603. ELSE
  2604. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue( ldt_Value) )
  2605. ab_WriteValue =TRUE
  2606. END IF
  2607. END IF
  2608. IF anv_Object.IsSparse Then
  2609. anv_Object.PriorRowValue =ldt_Value
  2610. END IF
  2611. ELSEIF anv_Object.ColType="date" THEN
  2612. IF anv_Object.ColID>0 Then
  2613. ld_Value = inv_Requestor.OF_GetItemDate(al_Row,anv_Object.ColID)
  2614. ELSE
  2615. ld_Value = inv_Requestor.OF_GetItemDate(al_Row,anv_Object.Name)
  2616. END IF
  2617. IF Not IsNull(ld_Value) Then //Date(ld_Value)<>Date("1900-01-01") AND
  2618. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2619. IF li_LastRow<al_Row Then
  2620. IF anv_Object.PriorRowValue=ld_Value Then
  2621. ab_SameValue=TRUE
  2622. ELSE
  2623. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue(ld_Value))
  2624. ab_WriteValue =TRUE
  2625. END IF
  2626. ELSE
  2627. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue(ld_Value))
  2628. ab_WriteValue =TRUE
  2629. END IF
  2630. ELSE
  2631. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue(ld_Value))
  2632. ab_WriteValue =TRUE
  2633. END IF
  2634. END IF
  2635. IF anv_Object.IsSparse Then
  2636. anv_Object.PriorRowValue =ld_Value
  2637. END IF
  2638. ELSEIF anv_Object.ColType="time" THEN
  2639. IF anv_Object.ColID>0 Then
  2640. lt_Value = inv_Requestor.OF_GetItemTime(al_Row,anv_Object.ColID)
  2641. ELSE
  2642. lt_Value = inv_Requestor.OF_GetItemTime(al_Row,anv_Object.Name)
  2643. END IF
  2644. IF IsNull(lt_Value)=False Then
  2645. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2646. IF li_LastRow<al_Row Then
  2647. IF anv_Object.PriorRowValue=lt_Value Then
  2648. ab_SameValue=TRUE
  2649. ELSE
  2650. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue( lt_Value) )
  2651. ab_WriteValue =TRUE
  2652. END IF
  2653. ELSE
  2654. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue( lt_Value) )
  2655. ab_WriteValue =TRUE
  2656. END IF
  2657. ELSE
  2658. inv_Api.SetValue(pcell, inv_Api.OF_GetDoubleValue( lt_Value))
  2659. ab_WriteValue =TRUE
  2660. END IF
  2661. END IF
  2662. IF anv_Object.IsSparse Then
  2663. anv_Object.PriorRowValue =lt_Value
  2664. END IF
  2665. ELSE
  2666. IF anv_Object.ColID>0 Then
  2667. ldb_Value =inv_Requestor.OF_GetItemNumber(al_Row, anv_Object.ColID )
  2668. ELSE
  2669. ldb_Value =inv_Requestor.OF_GetItemNumber(al_Row, anv_Object.Name)
  2670. END IF
  2671. IF anv_Object.IsCheckBox AND anv_Object.CheckBox_Text<>"" Then
  2672. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2673. IF li_LastRow<al_Row Then
  2674. IF anv_Object.PriorRowValue=ls_Value Then
  2675. ab_SameValue=TRUE
  2676. ELSE
  2677. IF string(ldb_Value) = anv_Object.CheckBox_On Then
  2678. IF anv_Object.CheckBox_LeftText Then
  2679. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2680. ELSE
  2681. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2682. END IF
  2683. ELSE
  2684. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2685. END IF
  2686. ab_WriteValue =TRUE
  2687. END IF
  2688. ELSE
  2689. IF string(ldb_Value) = anv_Object.CheckBox_On Then
  2690. IF anv_Object.CheckBox_LeftText Then
  2691. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2692. ELSE
  2693. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2694. END IF
  2695. ELSE
  2696. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2697. END IF
  2698. ab_WriteValue =TRUE
  2699. END IF
  2700. ELSE
  2701. IF string(ldb_Value) = anv_Object.CheckBox_On Then
  2702. IF anv_Object.CheckBox_LeftText Then
  2703. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text +" √")
  2704. ELSE
  2705. inv_Api.SetValue(pcell, "√ "+anv_Object.CheckBox_Text )
  2706. END IF
  2707. ELSE
  2708. inv_Api.SetValue(pcell, anv_Object.CheckBox_Text )
  2709. END IF
  2710. ab_WriteValue =TRUE
  2711. END IF
  2712. ELSE
  2713. IF anv_Object.IsCheckBox Then
  2714. IF string(ldb_Value)=anv_Object.CheckBox_On Then
  2715. ls_Value=" √ "
  2716. ELSE
  2717. ls_Value=""
  2718. END IF
  2719. IF ls_Value<>"" AND IsNull(ls_Value)=False Then
  2720. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2721. IF li_LastRow<al_Row Then
  2722. IF anv_Object.PriorRowValue=ldb_Value Then
  2723. ab_SameValue=TRUE
  2724. ELSE
  2725. inv_Api.SetValue(pcell, ls_Value)
  2726. ab_WriteValue =TRUE
  2727. END IF
  2728. ELSE
  2729. inv_Api.SetValue(pcell, ls_Value)
  2730. ab_WriteValue =TRUE
  2731. END IF
  2732. ELSE
  2733. inv_Api.SetValue(pcell, ls_Value)
  2734. ab_WriteValue =TRUE
  2735. END IF
  2736. END IF
  2737. ELSEIF Not IsNull(ldb_Value) Then
  2738. IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then
  2739. IF li_LastRow<al_Row Then
  2740. IF anv_Object.PriorRowValue=ldb_Value Then
  2741. ab_SameValue=TRUE
  2742. ELSE
  2743. inv_Api.SetValue(pcell, ldb_Value )
  2744. ab_WriteValue =TRUE
  2745. END IF
  2746. ELSE
  2747. inv_Api.SetValue(pcell, ldb_Value )
  2748. ab_WriteValue =TRUE
  2749. END IF
  2750. ELSE
  2751. inv_Api.SetValue(pcell, ldb_Value)
  2752. ab_WriteValue =TRUE
  2753. END IF
  2754. END IF
  2755. END IF
  2756. IF anv_Object.IsSparse Then
  2757. anv_Object.PriorRowValue =ldb_Value
  2758. END IF
  2759. END IF
  2760. END IF
  2761. IF anv_Object.IsSparse AND ab_WriteValue Then
  2762. anv_Object.LastWriteValueRow = al_Row
  2763. END IF
  2764. end subroutine
  2765. public subroutine of_registcolumninfo_3 ();IF Not IsValid(inv_Requestor) Then
  2766. Return
  2767. END IF
  2768. IF Not IsValid(inv_Layout) Then
  2769. Return
  2770. END IF
  2771. Int li, lj
  2772. Int li_Vlines, li_HLines ,li_ObjCount
  2773. Int li_Find
  2774. Long li_x1, li_x2 ,li_Y1, li_Y2,li_Pre_x1 ,li_Next_X1
  2775. Long li_ColSpace, li_RowSpace
  2776. Boolean lb_HasLine ,lb_HasObject
  2777. n_dw2xls_Line lnv_Line
  2778. n_dw2xls_Object lnv_Object
  2779. OF_SortObject_X()
  2780. li_ObjCount = UpperBound(inv_Objects)
  2781. For li=1 To li_ObjCount
  2782. IF inv_Objects[li].ObjType="report" Then
  2783. inv_Layout.OF_RegistObject(inv_Objects[li].X2 ,FALSE)
  2784. Continue
  2785. END IF
  2786. IF inv_Objects[li].ObjType="tempobj" Then
  2787. Continue
  2788. END IF
  2789. lnv_Object = inv_Objects[li]
  2790. IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then
  2791. Continue
  2792. END IF
  2793. IF lnv_Object.BorderStyle='2' OR lnv_Object.BorderStyle='4' Then
  2794. Continue
  2795. END IF
  2796. IF ( inv_Requestor.OF_GetProcessing()="1" OR inv_Requestor.OF_GetProcessing()="4" ) AND lnv_Object.IsForeGround=False Then
  2797. Continue
  2798. END IF
  2799. IF is_Name="detail" OR lnv_Object.NoContaint=False Then
  2800. inv_Layout.OF_AddObject( lnv_Object) //加入需要三次处理的对象
  2801. END IF
  2802. //启用以下被屏蔽的代码,会产生比较多的列,但输出的位置更精确
  2803. //IF lnv_Object.Alignment='2' AND lnv_Object.Width>150 Then
  2804. // inv_Layout.OF_RegistObject(lnv_Object.X1)
  2805. // inv_Layout.OF_RegistObject(lnv_Object.X2 )
  2806. IF is_Name<>"detail" THEN
  2807. IF lnv_Object.Alignment='1' AND lnv_Object.NoContaint=False THEN
  2808. li_Next_X1=inv_Layout.OF_Get_Next_X1(lnv_Object.x2 -30 )
  2809. IF li_Next_X1<=lnv_Object.X1 AND (lnv_Object.x2 - li_Next_X1 )>100 Then
  2810. inv_Layout.OF_RegistObject(lnv_Object.X2 ,FALSE)
  2811. ELSEIF (li_Next_X1 - lnv_Object.x2)>100 Then //如果跟边线离得不是太远,则不登记了
  2812. inv_Layout.OF_RegistObject(lnv_Object.X2,FALSE )
  2813. END IF
  2814. END IF
  2815. END IF
  2816. Next
  2817. end subroutine
  2818. public function integer of_gety1 (long ai_row);
  2819. IF ai_Row>ids_Rows.RowCount() Then
  2820. ai_Row=ids_Rows.RowCount()
  2821. END IF
  2822. IF ai_Row<=0 Then
  2823. Return 0
  2824. END IF
  2825. RETURN ids_Rows.GetItemNumber(ai_Row,"y1")
  2826. end function
  2827. public function Long of_gety2 (integer ai_row);IF ai_Row>ids_Rows.RowCount() Then
  2828. ai_Row=ids_Rows.RowCount()
  2829. END IF
  2830. IF ai_Row<=0 Then
  2831. Return 0
  2832. END IF
  2833. RETURN ids_Rows.GetItemNumber(ai_Row,"y2")
  2834. end function
  2835. public subroutine of_updatebandheight (readonly long ai_height);IF ib_AutoHeight AND ai_Height> il_BandHeight Then
  2836. il_BandHeight = ai_Height
  2837. END IF
  2838. end subroutine
  2839. public function Long of_getrowheight (integer ai_row);IF ai_Row<0 OR ai_Row>ids_Rows.RowCount() Then
  2840. Return 0
  2841. END IF
  2842. Long li_Height
  2843. li_Height =ids_Rows.GetItemNumber(ai_Row,"y2") - ids_Rows.GetItemNumber(ai_Row,"y1")
  2844. li_Height = ( UnitsToPixels(li_Height,YUnitsToPixels!)+2) *1440 /inv_Layout.ii_LOGPIXELSY
  2845. Return li_Height
  2846. end function
  2847. public function Long of_getbandheight ();Return il_BandHeight
  2848. end function
  2849. public function integer of_getstartrow (long ai_y);Int li_Find
  2850. //IF ai_y=inv_Requestor.of_getheader_beginy() Then
  2851. // ids_Rows.Saveas("c:\11.txt",text!,false)
  2852. //end if
  2853. li_Find = ids_Rows.Find("y1= "+String(ai_y), 1, ids_Rows.RowCount() )
  2854. IF li_Find<=0 Then
  2855. li_Find = ids_Rows.Find("y1<= "+String(ai_y+ii_RowSpace)+" AND y1>= "+String(ai_y - ii_RowSpace),1,ids_Rows.RowCount())
  2856. IF li_Find<=0 Then
  2857. li_Find = ids_Rows.Find("y1> "+String(ai_y + ii_RowSpace),1 , ids_Rows.RowCount() )
  2858. IF li_Find<=0 Then
  2859. li_Find=ids_Rows.Find("y2<"+String(ai_y+ii_RowSpace),ids_Rows.RowCount() ,1)
  2860. IF li_Find<=0 Then
  2861. li_Find= ids_Rows.RowCount()
  2862. ELSE
  2863. li_Find = li_Find +1
  2864. END IF
  2865. ELSE
  2866. li_Find = li_Find -1
  2867. IF li_Find>0 AND li_Find<ids_Rows.RowCount() Then
  2868. IF ids_Rows.GetItemNumber(li_Find,"Y2") > ai_Y Then
  2869. li_Find = li_Find +1
  2870. END IF
  2871. END IF
  2872. END IF
  2873. END IF
  2874. END IF
  2875. IF li_Find<=0 Then
  2876. li_Find =1
  2877. ELSEIF li_Find> ids_Rows.RowCount() Then
  2878. li_Find = ids_Rows.RowCount()
  2879. END IF
  2880. Return li_Find
  2881. end function
  2882. public function integer of_getendrow (long ai_y);Int li_Find
  2883. li_Find = ids_Rows.Find("y2= "+String(ai_y), 1, ids_Rows.RowCount() )
  2884. IF li_Find<=0 Then
  2885. li_Find = ids_Rows.Find("y2<= "+String(ai_y+ii_RowSpace)+" AND y2>= "+String(ai_y - ii_RowSpace),1,ids_Rows.RowCount())
  2886. IF li_Find<=0 Then
  2887. li_Find = ids_Rows.Find("y1> "+String(ai_y +ii_RowSpace), 1, ids_Rows.RowCount() )
  2888. IF li_Find<=0 Then
  2889. li_Find=ids_Rows.Find("y2<"+String(ai_y+ii_RowSpace),ids_Rows.RowCount() ,1)
  2890. IF li_Find<=0 Then
  2891. li_Find= ids_Rows.RowCount()
  2892. ELSE
  2893. li_Find = li_Find +1
  2894. END IF
  2895. ELSE
  2896. li_Find = li_Find -1
  2897. END IF
  2898. END IF
  2899. END IF
  2900. IF li_Find<=0 Then
  2901. li_Find =1
  2902. ELSEIF li_Find> ids_Rows.RowCount() Then
  2903. li_Find = ids_Rows.RowCount()
  2904. END IF
  2905. Return li_Find
  2906. end function
  2907. public function Long getrowheight (integer ai_row);IF ai_Row<0 OR ai_Row>ids_Rows.RowCount() Then
  2908. Return 0
  2909. END IF
  2910. Return ( ids_Rows.GetItemNumber(ai_Row,"y2") - ids_Rows.GetItemNumber(ai_Row,"y1")) *20
  2911. end function
  2912. public function Long of_getbottomspaceheight ();Return il_BottomSpaceHeight
  2913. end function
  2914. protected subroutine of_writerowheight (readonly long al_row, readonly long al_xlsrow);Long li, li_Height
  2915. IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then
  2916. li_Height =Long( inv_Requestor.OF_Evaluate(al_Row -1 ,"RowHeight()"))
  2917. IF inv_Requestor.OF_GetUnits()='0' Then
  2918. li_Height = UnitsToPixels(li_Height, YUnitsToPixels!)
  2919. ELSEIF inv_Requestor.OF_GetUnits()='2' Then
  2920. li_Height =inv_Api.OF_InchToPixels(li_Height/1000)
  2921. ELSEIF inv_Requestor.OF_GetUnits()='3' Then
  2922. li_Height =inv_Api.OF_CMToPixels(li_Height /1000 )
  2923. END IF
  2924. li_Height =li_Height*1440 /inv_Layout.ii_LOGPIXELSY
  2925. IF li_Height>0 Then
  2926. inv_Api.SetRowHeight(il_hSheet, al_xlsRow+1, li_Height)
  2927. END IF
  2928. ELSE
  2929. For li=1 To ids_Rows.RowCount()
  2930. li_Height = ids_Rows.GetItemNumber(li,"y2") - ids_Rows.GetItemNumber(li,"y1")
  2931. li_Height = ( UnitsToPixels(li_Height,YUnitsToPixels!)+2) *1440 /inv_Layout.ii_LOGPIXELSY
  2932. IF li_Height>0 Then
  2933. inv_Api.SetRowHeight(il_hSheet, al_xlsRow+li, li_Height)
  2934. END IF
  2935. Next
  2936. END IF
  2937. end subroutine
  2938. on n_dw2xls_band.create
  2939. call super::create
  2940. TriggerEvent( this, "constructor" )
  2941. end on
  2942. on n_dw2xls_band.destroy
  2943. TriggerEvent( this, "destructor" )
  2944. call super::destroy
  2945. end on
  2946. event destructor;Int li
  2947. For li=1 To UpperBound(inv_Objects)
  2948. Destroy inv_Objects[li]
  2949. Next
  2950. For li=1 To UpperBound(inv_VLines)
  2951. Destroy inv_VLines[li]
  2952. Next
  2953. For li=1 To UpperBound(inv_HLines)
  2954. Destroy inv_HLines[li]
  2955. Next
  2956. Destroy ids_Rows
  2957. end event
  2958. event constructor;String ls_Syntax
  2959. ids_Rows = Create DataStore
  2960. ls_Syntax =" release 6 ; "+ &
  2961. " datawindow(units=0 processing=1 ) " + &
  2962. " header(height=0 ) " + &
  2963. " detail(height=0 ) "+ &
  2964. " summary(height=0 ) "+ &
  2965. " table( "+&
  2966. " column=(type=long updatewhereclause=no name=y1 dbname='y1' initial='0' ) " +&
  2967. " column=(type=long updatewhereclause=no name=y2 dbname='y2' initial='0' ) " +&
  2968. " column=(type=long updatewhereclause=no name=textrect_y1 dbname='textrect_y1' initial='0' ) " +&
  2969. " column=(type=long updatewhereclause=no name=textrect_y2 dbname='textrect_y2' initial='0' ) " +&
  2970. " column=(type=long updatewhereclause=no name=topspace dbname='topspace' initial='0' ) " +&
  2971. " column=(type=long updatewhereclause=no name=bottomspace dbname='bottomspace' initial='0' ) " +&
  2972. " column=(type=char(1) updatewhereclause=no name=TopLine dbname='TopLine' initial='0' ) " +&
  2973. " column=(type=char(1) updatewhereclause=no name=BottomLine dbname='BottomLine' initial='0' ) " +&
  2974. " column=(type=long updatewhereclause=no name=OldRowNum dbname='OldRowNum' initial='0' ) " +&
  2975. " column=(type=long updatewhereclause=no name=NewRowNum dbname='NewRowNum' initial='0' ) " +&
  2976. " sort='y1 A, y2 A ' ) "
  2977. ids_Rows.Create( ls_Syntax)
  2978. end event