n_cst_dw2excel_import.sru 172 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310
  1. $PBExportHeader$n_cst_dw2excel_import.sru
  2. forward
  3. global type n_cst_dw2excel_import from nonvisualobject
  4. end type
  5. type os_size from structure within n_cst_dw2excel_import
  6. end type
  7. type os_fontlist from structure within n_cst_dw2excel_import
  8. end type
  9. end forward
  10. type os_size from structure
  11. long l_cx
  12. long l_cy
  13. end type
  14. type os_fontlist from structure
  15. string fontname
  16. integer fontsize
  17. integer fontweight
  18. integer fontheight
  19. end type
  20. global type n_cst_dw2excel_import from nonvisualobject autoinstantiate
  21. event of_test ( datawindow adw )
  22. end type
  23. type prototypes
  24. FUNCTION ulong GetSysColor(ulong nIndex) LIBRARY "user32.dll"
  25. Function ulong GetDC(ulong hWnd) Library "USER32.DLL"
  26. Function long ReleaseDC(ulong hWnd, ulong hdcr) Library "USER32.DLL"
  27. //Function boolean GetTextExtentPoint32A(ulong hdcr, string lpString, long nCount, ref os_size size) Library "GDI32.DLL" alias for "GetTextExtentPoint32A;Ansi"
  28. Function ulong SelectObject(ulong hdc, ulong hWnd) Library "GDI32.DLL"
  29. //FUNCTION ulong GetLocaleInfo(ulong Locale,ulong LCType,ref string lpLCData,ulong cchData) LIBRARY "kernel32.dll" ALIAS FOR "GetLocaleInfoA;Ansi"
  30. Function boolean GetTextExtentPoint32W(ulong hdcr, string lpString, long nCount, ref os_size size) Library "GDI32.DLL"
  31. FUNCTION ulong GetLocaleInfo(ulong Locale,ulong LCType,ref string lpLCData,ulong cchData) LIBRARY "kernel32.dll" ALIAS FOR "GetLocaleInfoW"
  32. end prototypes
  33. type variables
  34. Boolean ib_OpenExcel =false //在导出完成之后,是否提示用户打开Excel文件
  35. boolean ib_showmsg = true //在导出完成之后,是否提示导出成功的提示信息(taoqing增加)
  36. Private:
  37. Datastore ids_Column
  38. DataStore ids_Objects
  39. Datastore ids_dwcObjects
  40. DataStore ids_ReportObj
  41. DataStore ids_MergeCells
  42. Datastore ids_Bands
  43. DataStore ids_Line
  44. DataStore ids_RowHeight
  45. datawindow idw_Requestor //数据窗口对象
  46. String is_OldBand
  47. String is_dwcOldBand
  48. Boolean lb_NestedFlag=False //报表是否组合报表或嵌套报表
  49. Int ii_MaxCol
  50. LOng ii_BorderBeginRow, ii_BorderEndRow
  51. Long ii_DetailRow
  52. Boolean ib_GridBorder=True
  53. Boolean ib_MergeColumnHeader=False //列标题是否尝试自动合并单元
  54. Boolean ib_SparseFlag
  55. String is_TipsWindow="w_tips"
  56. String is_OpenParm
  57. Boolean ib_GroupNewPage[]
  58. String is_BeginRowObj
  59. Boolean ib_OutLine =False
  60. Boolean ib_GroupOutFlag =True // True 分组输出方式,每个分组都正常输出 False 组头和组尾只输出一次,如个人所得税明细表的声明,不需要每页都输出
  61. // 否则报表格式变得有点乱
  62. Boolean ib_FormFlag=False //如果是True,则程序会自动根据报表是否有线条来判断报表是否表格报表
  63. //如果为False, 则程序不会把报表作为表格报表进行处理
  64. Int ii_FirstColumn=2
  65. String is_BorderEndObj
  66. String is_BorderBeginObj
  67. Int ii_PrintHeader=2 //每页都打印 /2只打印表头区的对象 不打印分组表头区的对象 / 只在第一页打印,其它页不打印
  68. String is_Units
  69. Window iw_Parent
  70. StaticText iuo_Text
  71. //新增变量 2004-9-10
  72. long ii_RowSpace =30
  73. long ii_ColSpace =30
  74. String is_LineTag='0'
  75. n_xls_workbook invo_workbook
  76. n_xls_worksheet invo_worksheet
  77. n_xls_cell invo_cell
  78. n_dwr_colors invo_colors
  79. String is_Format_Currency //"¥#,#0.00"
  80. //新增变量 2004 -11 -11
  81. os_fontlist istr_FontList[]
  82. end variables
  83. forward prototypes
  84. public subroutine of_openexcelfile (boolean ab_flag)
  85. public subroutine of_settipswindow (string as_winname, string as_openparm)
  86. public subroutine of_setprintheader (integer ai_style)
  87. public subroutine of_setgridborder (boolean ab_flag, string as_beginobj, string as_endobj)
  88. public subroutine of_setgridborder (boolean ab_flag)
  89. public subroutine of_about ()
  90. public subroutine of_openexcelfile (boolean ab_flag)
  91. public subroutine of_settipswindow (string as_winname, string as_openparm)
  92. public subroutine of_setprintheader (integer ai_style)
  93. public subroutine of_setgridborder (boolean ab_flag, string as_beginobj, string as_endobj)
  94. public subroutine of_setgridborder (boolean ab_flag)
  95. public subroutine of_about ()
  96. public function integer of_dw2excel (datawindow adw, string as_filename)
  97. public subroutine of_setobjspace (integer ai_rowspace, integer ai_colspace)
  98. public subroutine of_setformflag (boolean ab_flag)
  99. public subroutine of_setlinetag (string as_tag)
  100. protected subroutine of_guage (unsignedlong al_step)
  101. protected function string of_get_currency_format ()
  102. protected subroutine of_get_format (ref string as_format, ref string as_exp, string as_type)
  103. protected function string of_evaluate (string as_express, long al_row)
  104. protected subroutine of_colrowinfo ()
  105. protected function long of_arraytostring (string as_source[], string as_delimiter, ref string as_ref_string)
  106. protected subroutine of_check_property (ref string as_str, ref string as_expression)
  107. protected subroutine of_closeuserobject ()
  108. protected function string of_evaluate (datastore a_ds, string as_express, long al_row)
  109. protected function integer of_get_penwidth (integer ai_width)
  110. protected subroutine of_getcolumninfo ()
  111. protected subroutine of_getobjects ()
  112. protected function integer of_getobjects (string as_objname)
  113. protected function string of_getobjspace (long al_width)
  114. protected subroutine of_getrowheight ()
  115. protected function unsignedlong of_getsyscolor (unsignedlong al_pbcolor)
  116. protected function integer of_outdata (datastore a_ds, string as_reportname, long ai_currow, string as_band, long ai_row)
  117. protected function integer of_groupcount ()
  118. protected subroutine of_gridinfo (string as_reportname, string as_bands[])
  119. public subroutine of_mergecolumnheader (boolean ab_flag, string as_objname)
  120. protected function boolean of_openuserobject ()
  121. protected function string of_replaceall (string as_string1, string as_string2, string as_string3)
  122. protected function integer of_outdata (long ai_currow, string as_band, long ai_row)
  123. protected function long of_parsetoarray (string as_source, string as_delimiter, ref string as_array[])
  124. public subroutine of_setgroupoutflag (boolean as_flag)
  125. protected function string of_getdata (readonly long ai_row, readonly string as_objectname, readonly string as_coltype, string as_format, string as_displayvalue, string as_columnflag, boolean ab_overlap)
  126. protected function string of_getdata (datastore a_ds, long ai_row, string as_objectname, string as_coltype, string as_format, string as_displayvalue, string as_columnflag, boolean ab_overlap)
  127. public function long of_lastpos (string as_source, string as_target)
  128. public function long of_lastpos (string as_source, string as_target, long al_start)
  129. public function integer of_iswraptext (string as_fontname, integer ai_fontsize, integer ai_fontweight, integer ai_height)
  130. end prototypes
  131. public subroutine of_openexcelfile (boolean ab_flag);ib_OpenExcel=ab_Flag
  132. end subroutine
  133. public subroutine of_settipswindow (string as_winname, string as_openparm);is_TipsWindow=as_WinName
  134. is_OpenParm=as_OpenParm
  135. end subroutine
  136. public subroutine of_setprintheader (integer ai_style);ii_PrintHeader=ai_Style
  137. end subroutine
  138. public subroutine of_setgridborder (boolean ab_flag, string as_beginobj, string as_endobj);
  139. //对于非Grid形式的数据窗口,需要在代码中指定是否需要设置报表单元的边框
  140. //如果是Grid形式的数据窗口,不需要指定
  141. ib_GridBorder=ab_Flag
  142. is_BorderBeginObj=as_BeginObj
  143. is_BorderEndObj=as_EndObj
  144. end subroutine
  145. public subroutine of_setgridborder (boolean ab_flag);ib_GridBorder=ab_Flag
  146. end subroutine
  147. public subroutine of_about ();MessageBox("关于DW2XLS","程序设计: HuangGuoChou ~r~n"+&
  148. "电子邮箱: HuangGuoChou@163.Net ~n~n~r~n" +&
  149. "如果对程序有任何意见或建议,请写信与我联系,谢谢!!")
  150. end subroutine
  151. public function integer of_dw2excel (datawindow adw, string as_filename);Long li,lj,lk, li_row, li_col
  152. Long li_Rows_Per_Detail
  153. Double ld_Width
  154. Long li_CurRow,li_Count
  155. Int li_GroupCount
  156. Boolean lb_TrailerFlag
  157. Window lw
  158. OleObject xlapp //用于连接Excel
  159. IF Not IsValid(adw) THEN
  160. MessageBox("提示","数据窗口未指定或数据窗口已被关闭!", Information!, OK! )
  161. Return -1
  162. END IF
  163. //如果文件已存在,则先删除它,不然,EXCEL会显示提示信息
  164. If FileExists (as_filename ) Then
  165. IF MessageBox("询问","文件 "+ as_filename+" 已经存在,是否继续?",Question!,YesNo!)=2 Then
  166. Return -1
  167. END IF
  168. FileDelete(as_filename)
  169. END IF
  170. //检查给定的文件路径是否可以写入
  171. li_row=FileOpen(as_filename,StreamMode!,Write!,LockWrite!,Replace!)
  172. FileClose(li_row)
  173. filedelete(as_filename)
  174. IF li_row=-1 OR IsNull(li_row) THEN
  175. MessageBox("提示","指定的文件路径不能写入数据,请检查!", Information!, OK! )
  176. Return -1
  177. END IF
  178. idw_Requestor=adw
  179. invo_workbook=create n_xls_workbook
  180. IF invo_workbook.of_create(as_filename)<0 Then
  181. Destroy invo_workbook
  182. Return -1
  183. END IF
  184. SetPointer(HourGlass! )
  185. IF Trim(is_TipsWindow)<>"" Then
  186. OpenWithParm(lw,is_OpenParm, is_TipsWindow)
  187. END IF
  188. invo_worksheet=invo_workbook.of_add_worksheet()
  189. invo_colors=Create n_dwr_colors
  190. invo_colors.invo_writer=invo_workbook
  191. //读取对象列表并计算分组数目
  192. idw_Requestor.AcceptText()
  193. li_GroupCount=OF_GroupCount()
  194. IF li_GroupCount>0 Then
  195. idw_Requestor.GroupCalc()
  196. END IF
  197. OF_GetObjects()
  198. IF ib_SparseFlag Then
  199. ids_MergeCells=Create DataStore
  200. ids_MergeCells.DataObject="d_dw2xls_mergecells"
  201. END IF
  202. //设置细节区各列的列宽及文本格式
  203. ids_Column.SetFilter("")
  204. ids_Column.SetSort("StartCol A")
  205. ids_Column.Filter()
  206. ids_Column.Sort()
  207. //要处理数据窗口的Sparse,一定要按列排序
  208. ids_Objects.SetSort(" X A, StartCol A , SartRow A ")
  209. ids_Objects.Sort()
  210. IF IsValid( ids_dwcObjects) Then
  211. ids_dwcObjects.SetSort("X A, StartCol A , SartRow A ")
  212. ids_dwcObjects.Sort()
  213. END IF
  214. For li=1 To ids_Column.RowCount()
  215. li_col=ids_Column.Object.StartCol[li]
  216. ld_Width =ids_Column.Object.Width[li]
  217. Choose Case is_units
  218. Case '1'
  219. ld_Width = PixelsToUnits(ld_Width,XPixelsToUnits!)
  220. Case '2'
  221. ld_Width = PixelsToUnits(ld_Width * 96 / 1000, XPixelsToUnits!)
  222. Case '3'
  223. ld_Width = PixelsToUnits(ld_Width * 37.8 /1000 ,XPixelsToUnits!)
  224. END CHOOSE
  225. // 2004-11-27 原来除以的值是30,会导致部份列的宽度不足以显示单元内容
  226. // 虽然会导致部分报表在一页内不能完全打印,但原来的设置也会有这个情况,所以不考虑打印的情况
  227. ld_Width=ld_Width / 28 //如果缺省字体大小12,则应除以40
  228. IF ld_Width>0 Then
  229. invo_worksheet.of_set_column_width(li_col -1, ld_Width )
  230. END IF
  231. NEXT
  232. //输出数据
  233. //输出表头区
  234. IF idw_Requestor.RowCount()>0 Then
  235. li_CurRow=Of_OutData(0,"header",1)
  236. ELSE
  237. li_CurRow=Of_OutData(0,"header",0)
  238. END IF
  239. li_Count=idw_Requestor.RowCount()
  240. li_Rows_Per_Detail=Long(idw_Requestor.Describe("datawindow.rows_per_detail"))
  241. FOR li_Row=1 To li_Count
  242. lb_TrailerFlag=False
  243. FOR lj=1 To li_GroupCount
  244. IF ib_GroupOutFlag Then
  245. IF idw_Requestor.FindGroupChange(li_Row,lj)=li_Row Then //分组的开始
  246. IF li_Row<>1 AND Not lb_TrailerFlag Then //第一次,不用输出组的尾区
  247. //组尾区的显示顺序,与组头区是倒过来的
  248. lb_TrailerFlag=True
  249. For lk=li_GroupCount TO lj Step -1
  250. IF Long(idw_Requestor.Describe("datawindow.trailer."+String(lk)+".height"))>0 Then
  251. li_CurRow+=Of_OutData(li_CurRow,"trailer."+string(lk),li_Row -1)
  252. END IF
  253. //是否按组分页打印
  254. IF lj<=UpperBound(ib_GroupNewPage) Then
  255. IF ib_GroupNewPage[lk] Then
  256. invo_WorkSheet.OF_Add_H_PageBreak(li_CurRow)
  257. //保存分页的行号
  258. END IF
  259. END IF
  260. Next
  261. END IF
  262. IF ii_PrintHeader<>1 OR li_Row=1 Then // ii_PrintHeader为1时,通过设置报表打印的标题行,来控制每页都打印标题
  263. IF Long(idw_Requestor.Describe("datawindow.header."+String(lj)+".height"))>0 Then
  264. li_CurRow+=Of_OutData(li_CurRow,"header."+string(lj),li_Row )
  265. END IF
  266. END IF
  267. END IF
  268. ELSEIF li_Row=1 Then
  269. IF Long(idw_Requestor.Describe("datawindow.header."+String(lj)+".height"))>0 Then
  270. li_CurRow+=Of_OutData(li_CurRow,"header."+string(lj),li_Row )
  271. END IF
  272. END IF
  273. NEXT
  274. //输出当前记录
  275. li_CurRow+=Of_OutData(li_CurRow,"detail",li_Row)
  276. li_Row=li_Row+li_Rows_Per_Detail -1
  277. NEXT
  278. //输出所有组的最后一组脚尾区
  279. //2005-1-15
  280. FOR lj=li_GroupCount To 1 Step -1
  281. li_CurRow+=Of_OutData(li_CurRow,"trailer."+string(lj),idw_Requestor.RowCount())
  282. NEXT
  283. //输出汇总区
  284. li_CurRow+=of_outdata(li_CurRow,"summary",idw_Requestor.rowcount())
  285. //设置边线
  286. IF ii_BorderBeginRow<=0 Then
  287. ii_BorderBeginRow=ii_DetailRow
  288. END IF
  289. IF ib_GridBOrder Then
  290. IF ii_BorderEndRow<=0 Then
  291. ii_BorderEndRow=li_CurRow
  292. END IF
  293. IF ii_MaxCol>0 AND ii_BorderBeginRow>0 AND ii_BorderEndRow>ii_BorderBeginRow Then
  294. For li=ii_BorderBeginRow TO ii_BorderEndRow
  295. For lj=ii_FirstColumn To ii_MaxCol
  296. invo_Cell=invo_WorkSheet.OF_GetCell(li,lj)
  297. invo_Cell.invo_Format.ii_Left=1
  298. invo_Cell.invo_Format.ii_Right=1
  299. invo_Cell.invo_Format.ii_Top=1
  300. invo_Cell.invo_Format.ii_Bottom=1
  301. Next
  302. Next
  303. END IF
  304. IF IsValid(ids_MergeCells) Then
  305. li_Count=ids_MergeCells.RowCount()
  306. For li=1 To li_Count
  307. IF (ids_MergeCells.Object.EndRow[li] - ids_MergeCells.Object.StartRow[li])>0 Then
  308. For li_Row=ids_MergeCells.Object.StartRow[li] To ids_MergeCells.Object.EndRow[li]
  309. For li_Col = ids_MergeCells.Object.StartCol[li] To ids_MergeCells.Object.EndCol[li]
  310. invo_Cell=invo_WorkSheet.OF_GetCell(li_Row,li_Col)
  311. If invo_Cell.ib_Empty Then
  312. Continue
  313. END IF
  314. IF li_Row=ids_MergeCells.Object.StartRow[li] Then
  315. invo_Cell.invo_Format.ii_Bottom = 0
  316. ELSEIF li_Row=ids_MergeCells.Object.EndRow[li] Then
  317. invo_Cell.invo_Format.ii_Top = 0
  318. ELSE
  319. invo_Cell.invo_Format.ii_Bottom = 0
  320. invo_Cell.invo_Format.ii_Top = 0
  321. END IF
  322. Next
  323. Next
  324. END IF
  325. Next
  326. END IF
  327. END IF
  328. li_CurRow+=of_outdata(li_CurRow,"footer",idw_Requestor.rowcount())
  329. //关闭打开的用户对象
  330. OF_CloseUserObject()
  331. IF ii_PrintHeader<>0 Then
  332. li_CurRow=0
  333. ids_Objects.SetFilter("band='header'")
  334. ids_Objects.Filter()
  335. li_CurRow=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',0)"))
  336. IF ii_PrintHeader=1 tHEN
  337. For li=1 To li_GroupCount
  338. ids_Objects.SetFilter("band='header."+String(li)+"'")
  339. ids_Objects.Filter()
  340. li_CurRow+=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',0)"))
  341. Next
  342. END IF
  343. IF li_CurRow>0 Then //设置标题行
  344. invo_worksheet.of_repeat_rows(0,li_CurRow -1 )
  345. invo_worksheet.of_freeze_panes (li_CurRow,0,li_CurRow ,0 )
  346. END IF
  347. END IF
  348. //输出打印设置
  349. invo_worksheet.of_Set_Paper(Long(idw_Requestor.Describe("datawindow.print.paper.size")))
  350. IF idw_Requestor.Describe("datawindow.print.Orientation")='1' Then
  351. invo_WorkSheet.of_set_orientation(0)
  352. ELSE
  353. invo_WorkSheet.of_set_orientation(1)
  354. END IF
  355. invo_worksheet.of_Set_print_scale(Long(idw_Requestor.Describe("datawindow.zoom ")))
  356. //是否单色打印 2004-11-11
  357. IF idw_Requestor.Describe("datawindow.print.color")<>"1" Then
  358. invo_worksheet.of_Set_print_NoColor(True)
  359. ELSE
  360. invo_worksheet.of_Set_print_NoColor(False)
  361. END IF
  362. ld_Width= Long(idw_Requestor.Describe("datawindow.print.margin.Left"))
  363. Choose Case is_Units
  364. Case '0'
  365. ld_Width = UnitsToPixels(ld_Width ,XUnitsToPixels!) * 0.0104
  366. Case '1'
  367. ld_Width = ld_Width * 0.0104
  368. Case '3'
  369. ld_Width =ld_Width / 1000 /2.54
  370. END CHOOSE
  371. invo_WorkSheet.of_set_margin_left(ld_Width)
  372. ld_Width= Long(idw_Requestor.Describe("datawindow.print.margin.right"))
  373. Choose Case is_Units
  374. Case '0'
  375. ld_Width = UnitsToPixels(ld_Width ,XUnitsToPixels!) * 0.0104
  376. Case '1'
  377. ld_Width = ld_Width * 0.0104
  378. Case '3'
  379. ld_Width =ld_Width / 1000 /2.54
  380. END CHOOSE
  381. invo_WorkSheet.of_set_margin_right(ld_Width)
  382. ld_Width= Long(idw_Requestor.Describe("datawindow.print.margin.top"))
  383. Choose Case is_Units
  384. Case '0'
  385. ld_Width = UnitsToPixels(ld_Width ,XUnitsToPixels!) * 0.0104
  386. Case '1'
  387. ld_Width = ld_Width * 0.0104
  388. Case '3'
  389. ld_Width =ld_Width / 1000 /2.54
  390. END CHOOSE
  391. invo_WorkSheet.of_set_margin_Top(ld_Width)
  392. ld_Width= Long(idw_Requestor.Describe("datawindow.print.margin.bottom"))
  393. Choose Case is_Units
  394. Case '0'
  395. ld_Width = UnitsToPixels(ld_Width ,XUnitsToPixels!) * 0.0104
  396. Case '1'
  397. ld_Width = ld_Width * 0.0104
  398. Case '3'
  399. ld_Width =ld_Width / 1000 /2.54
  400. END CHOOSE
  401. invo_WorkSheet.of_set_margin_bottom(ld_Width)
  402. //invo_WorkSheet.of_insert_bitmap(20,1,"c:\1.bmp")
  403. //保存文件
  404. invo_workbook.of_close()
  405. IF isvalid(lw) Then
  406. Close(lw)
  407. END IF
  408. IF ib_OpenExcel Then
  409. IF MessageBox("询问","~r~n报表已成功导出到< "+as_FIleNAME+" >!~r~n你是否需要现在就打开这个Excel文件?~r~n~r~n",Question!,YesNo!,2)=1 Then
  410. xlApp=Create OleObject
  411. li_row= xlApp.ConnectToNewObject( "Excel.Application" )
  412. IF li_row < 0 Then
  413. MessageBox("提示","不能运行Excel程序,请检查是否已安装Microsoft Excel软件!", Information!, OK! )
  414. ELSE
  415. XlApp.Workbooks.Open(as_FileName)
  416. xlApp.ActiveWindow.WindowState= -4137 //最大化窗口
  417. xlApp.Visible = True
  418. xlApp.DisConnectObject()
  419. END IF
  420. END IF
  421. ELSE
  422. MessageBox("提示","报表已成功导出!文件路径为:"+as_FIleNAME+"", Information!, OK! )
  423. END IF
  424. destroy invo_workbook
  425. destroy invo_worksheet
  426. IF IsValid(ids_Line) Then
  427. Destroy ids_Line
  428. END IF
  429. IF IsValid(ids_RowHeight) Then
  430. Destroy ids_RowHeight
  431. END IF
  432. Destroy ids_Column
  433. Destroy ids_Objects
  434. IF IsValid(ids_MergeCells) Then
  435. Destroy ids_MergeCells
  436. END IF
  437. IF IsValid(ids_reportobj) Then
  438. Destroy ids_reportobj
  439. END IF
  440. IF IsValid(ids_dwcObjects) Then
  441. Destroy ids_dwcObjects
  442. END IF
  443. IF IsValid(ids_Bands) Then
  444. Destroy ids_Bands
  445. END IF
  446. IF IsValid(xlApp) Then
  447. Destroy xlApp
  448. END IF
  449. SetPointer(Arrow!)
  450. Return 1
  451. end function
  452. public subroutine of_setobjspace (integer ai_rowspace, integer ai_colspace);IF ai_RowSpace>0 Then
  453. ii_RowSpace=ai_RowSpace
  454. END IF
  455. IF ai_ColSpace>0 Then
  456. ii_ColSpace=ai_ColSpace
  457. END IF
  458. end subroutine
  459. public subroutine of_setformflag (boolean ab_flag);ib_FormFlag=ab_Flag
  460. end subroutine
  461. public subroutine of_setlinetag (string as_tag);is_LineTag=as_Tag
  462. end subroutine
  463. protected subroutine of_guage (unsignedlong al_step);
  464. end subroutine
  465. protected function string of_get_currency_format ();INT LOCALE_USER_DEFAULT=1024
  466. INT LOCALE_SCURRENCY =20 //本位币货币符号
  467. INT LOCALE_SMONDECIMALSEP=22 //货币小数点分割符
  468. INT LOCALE_SMONTHOUSANDSEP =23 //千位分割符
  469. INT LOCALE_ICURRDIGITS = 25 //小数位数
  470. INT LOCALE_SINTLSYMBOL= 21
  471. INT LOCALE_SMONGROUPING=24 //货币国际符号
  472. Int li_Len = 100
  473. Int li_Digits
  474. String ls_Temp
  475. String ls_Format
  476. String ls_symbol
  477. String ls_SMONDECIMALSEP
  478. String ls_LOCALE_SMONTHOUSANDSEP
  479. ls_Temp = Space(li_Len)
  480. GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SCURRENCY, Ref ls_Temp, li_Len)
  481. ls_symbol=Trim(ls_Temp)
  482. GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_ICURRDIGITS, Ref ls_Temp, li_Len)
  483. li_digits=Long(Trim(ls_Temp))
  484. GetLocaleInfo ( LOCALE_USER_DEFAULT,LOCALE_SMONTHOUSANDSEP, Ref ls_Temp, li_Len)
  485. ls_LOCALE_SMONTHOUSANDSEP=Trim(ls_Temp)
  486. GetLocaleInfo ( LOCALE_USER_DEFAULT,LOCALE_SMONDECIMALSEP, Ref ls_Temp, li_Len)
  487. ls_SMONDECIMALSEP= Trim(ls_Temp)
  488. IF li_digits>0 Then
  489. ls_Format = ls_symbol+"#"+ls_LOCALE_SMONTHOUSANDSEP+"##0"+ls_SMONDECIMALSEP+Fill("0",li_digits)
  490. ELSE
  491. ls_Format = ls_symbol+"#,##0"
  492. END IF
  493. Return ls_Format
  494. end function
  495. protected subroutine of_get_format (ref string as_format, ref string as_exp, string as_type);long ll_pos
  496. long ll_cnt
  497. string ls_arr[]
  498. string ls_emp[]
  499. long ll_i
  500. as_exp=""
  501. ll_pos = pos(as_format, "@")
  502. if ll_pos > 0 then
  503. as_format = "[general]"
  504. end if
  505. ll_pos = pos(lower(as_format), "[general]")
  506. do while ll_pos > 0
  507. if as_Type = "D" then
  508. as_format = replace(as_format, ll_pos, 9, "dd.mm.yyyy")
  509. elseif as_Type = "DT" then
  510. as_format = replace(as_format, ll_pos, 9, "dd.mm.yyyy hh:mm")
  511. elseif as_Type = "T" then
  512. as_format = replace(as_format, ll_pos, 9, "hh:mm")
  513. else
  514. as_format = replace(as_format, ll_pos, 9, "@")
  515. end if
  516. ll_pos = pos(lower(as_format), "[general]")
  517. loop
  518. ll_pos = pos(lower(as_format), "[currency]")
  519. do while ll_pos > 0
  520. as_format = replace(as_format, ll_pos, 10, is_Format_Currency)
  521. ll_pos = pos(lower(as_format), "[currency]")
  522. loop
  523. ll_pos = pos(lower(as_format), "[shortdate]")
  524. do while ll_pos > 0
  525. as_format = replace(as_format, ll_pos, 11, "dd.mm.yyyy")
  526. ll_pos = pos(lower(as_format), "[shortdate]")
  527. loop
  528. ll_pos = pos(lower(as_format), "[date]")
  529. do while ll_pos > 0
  530. as_format = replace(as_format, ll_pos, 6, "dd.mm.yyyy")
  531. ll_pos = pos(lower(as_format), "[date]")
  532. loop
  533. ll_pos = pos(lower(as_format), "[time]")
  534. do while ll_pos > 0
  535. as_format = replace(as_format, ll_pos, 6, "hh:mm")
  536. ll_pos = pos(lower(as_format), "[time]")
  537. loop
  538. as_format = of_replaceAll(as_format, "'", "~"")
  539. as_format =of_replaceAll(as_format, "@", "General")
  540. if pos(as_format, ";") > 0 then
  541. ll_cnt = of_parsetoarray(as_format, ";", ls_arr)
  542. choose case as_type
  543. case "N"
  544. if ll_cnt > 3 then
  545. ll_cnt = 3
  546. end if
  547. end choose
  548. of_arraytostring(ls_emp, ";", as_format)
  549. end if
  550. ll_pos = pos(lower(as_format), "~t")
  551. if ll_pos > 0 then
  552. as_exp = right(as_format, len(as_format) - ll_pos)
  553. if right(as_exp, 1) = "~"" then
  554. as_exp =Trim(left(as_exp, len(as_exp) - 1))
  555. end if
  556. as_format = left(as_format, ll_pos - 1)
  557. if left(as_format, 1) = "~"" then
  558. as_format = right(as_format, len(as_format) - 1)
  559. end if
  560. end if
  561. end subroutine
  562. protected function string of_evaluate (string as_express, long al_row);/*----------------------------------------------------------------------------
  563. 求指定表达式的值
  564. 返回值是字符串类型
  565. 如果计算有错误,返回空值
  566. 应用示例:
  567. long l_sum
  568. int li_page,li_pagecount
  569. l_sum=long(of_getvalud("1+30+120",1))
  570. li_page=integer(of_getvale("page()",1))
  571. li_pagecount=integer(of_getvalue("pagecount()",1))
  572. ------------------------------------------------------------------------------*/
  573. String ls_ret
  574. Int li_Pos
  575. as_Express=Trim(as_Express)
  576. IF Left(as_Express,1)="'" AND Right(as_Express,1)="'" Then
  577. as_Express=Mid(as_Express,2,Len(as_Express) -2)
  578. ELSE
  579. IF Left(as_Express,1)='"' AND Right(as_Express,1)='"' Then
  580. as_Express=Mid(as_Express,2,Len(as_Express) -2)
  581. END IF
  582. END IF
  583. li_Pos=Pos(as_Express,"~t") //检查表达式是否数据窗口对象属性表达式的语法,如 font.color='200~tif(a=1,255,0)'
  584. IF li_Pos>0 Then
  585. as_Express=Mid(as_Express,li_POs+1)
  586. END IF
  587. as_Express=OF_ReplaceAll(as_Express,"'",'"' ) //把单引号换成双引号
  588. ls_ret=idw_Requestor.describe("Evaluate('"+as_express+"', " +string(al_row)+ ")")
  589. IF ls_ret="?" OR ls_ret="!" THEN
  590. ls_ret=""
  591. END IF
  592. Return ls_ret
  593. end function
  594. protected subroutine of_colrowinfo ();Long li,lj,li_Row
  595. Long li_Count
  596. Long li_StartCol,li_EndCol
  597. Long li_Y
  598. Long li_BeginRow
  599. Long li_ColCount
  600. String ls_Processing
  601. String ls_Band
  602. Boolean lb_ForeGroundFlag
  603. Boolean lb_Border
  604. DataStore lds_Temp
  605. Long ll_ObjSpace = 100 //用于判断两个对象的间隔
  606. Long ll_Space
  607. //对象上下是否有线条
  608. Long li_Line_Top
  609. Long li_Line_Bottom
  610. Long li_Line_Left
  611. Long li_Line_Right
  612. ls_Processing=idw_Requestor.Describe("datawindow.processing")
  613. ids_Column.SetSort("x A ")
  614. ids_Column.Sort()
  615. ii_MaxCol=Long(ids_Column.Describe("Evaluate('Max(EndCol)',1)"))
  616. ids_Objects.SetFilter("isReport<>'1' ") //2004-11-28
  617. ids_Objects.Filter()
  618. ids_Line.SetFilter("")
  619. ids_Line.Filter()
  620. IF ids_Line.RowCount()>0 Then
  621. lb_Border=True
  622. END IF
  623. IF lb_Border Then
  624. lds_Temp=Create DataStore
  625. lds_Temp.DataObject=ids_Line.DataObject
  626. ids_Line.SetFilter("lineType='v'")
  627. ids_Line.Filter()
  628. ids_Line.RowsCopy(1,ids_Line.RowCount(),Primary!,lds_Temp,1,Primary!)
  629. ids_Line.SetFilter("lineType='h'")
  630. ids_Line.SetSort("ReportName A, Band A, Y1 A ")
  631. ids_Line.Filter()
  632. ids_Line.Sort()
  633. lds_Temp.SetSort("ReportName A, Band A, X1 A ")
  634. lds_Temp.Sort()
  635. IF ids_Line.RowCount()>0 AND ib_FormFlag Then
  636. //先取得对象的四条边线
  637. For li=1 TO ids_Objects.RowCount()
  638. //找到对象的上一条横线
  639. li_Row=ids_Line.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND y1<= "+String(ids_Objects.Object.y[li]+ ii_RowSpace)+" and x1< "+string(ids_objects.object.x2[li])+" and x2> " +string(ids_objects.object.x[li]) ,ids_Line.rowcount(),1)
  640. IF li_Row>0 Then
  641. ids_Objects.Object.TopLine[li]=ids_Line.Object.y1[li_Row]
  642. END IF
  643. //找到对象的下边线
  644. li_Row=ids_Line.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND y1>= "+String(ids_Objects.Object.y2[li] - ii_RowSpace)+" and x1< "+string(ids_objects.object.x2[li])+" and x2> "+string(ids_objects.object.x[li]) ,1,ids_Line.rowcount())
  645. IF li_Row>0 Then
  646. ids_Objects.Object.BottomLine[li]=ids_Line.Object.y1[li_Row]
  647. END IF
  648. //左边线
  649. li_Row=lds_Temp.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' " +&
  650. " AND y1<= "+String(ids_Objects.Object.Y[li] +ii_RowSpace)+" AND Y2>= "+String(ids_Objects.Object.Y2[li] - ii_RowSpace)+" AND x1< "+String(ids_Objects.Object.x[li]+ii_ColSpace),lds_Temp.RowCount(),1)
  651. IF li_Row>0 Then
  652. ids_Objects.Object.LeftLine[li]=lds_Temp.Object.x1[li_Row]
  653. ids_Objects.Object.StartCol[li]=lds_Temp.Object.StartCol[li_Row]
  654. END IF
  655. //找到对象的右边线
  656. li_Row=lds_Temp.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' " +&
  657. " AND y1<= "+String(ids_Objects.Object.Y[li] + ii_RowSpace)+" AND Y2>= "+String(ids_Objects.Object.Y2[li] - ii_RowSpace)+" AND x1> "+String(ids_Objects.Object.x2[li] - ii_ColSpace),1,lds_Temp.RowCount())
  658. IF li_Row>0 then
  659. ids_Objects.Object.RightLine[li]=lds_Temp.Object.x1[li_Row]
  660. ids_Objects.Object.EndCol[li]=lds_Temp.Object.StartCol[li_Row] -1
  661. END IF
  662. Next
  663. Destroy lds_Temp
  664. END IF
  665. END IF
  666. ids_Objects.SetSort("reportName A , Band A, y A ")
  667. ids_Objects.Sort()
  668. //判断对象在第几行
  669. li_Count=ids_Objects.RowCount()
  670. For lj=1 To 2
  671. For li=1 To li_Count
  672. //找到对象的开始行
  673. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND y2< "+String(ids_Objects.Object.y[li])+" AND Band='"+ids_Objects.Object.Band[li]+"'",li -1 ,1 )
  674. IF li_Row>0 Then
  675. ids_Objects.Object.StartRow[li]=ids_Objects.Object.EndRow[li_Row] +1
  676. ids_Objects.Object.EndRow[li]=ids_Objects.Object.StartRow[li]
  677. END IF
  678. //找到对象的结束行
  679. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND y>"+String(ids_Objects.Object.y2[li] - ii_RowSpace )+" AND Band='"+ids_Objects.Object.Band[li]+"'",li+1 ,ids_Objects.RowCount())
  680. IF li_Row>0 Then
  681. IF ids_Objects.Object.StartRow[li_Row]>ids_Objects.Object.StartRow[li] Then
  682. ids_Objects.Object.EndRow[li]=ids_Objects.Object.StartRow[li_Row] -1
  683. END IF
  684. ELSE
  685. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND EndRow>"+String(ids_Objects.Object.EndRow[li])+" AND Band='"+ids_Objects.Object.Band[li]+"'",1,ids_Objects.RowCount())
  686. IF li_Row>0 Then
  687. ids_Objects.Object.EndRow[li]=ids_Objects.Object.EndRow[li_Row]
  688. END IF
  689. END IF
  690. Next
  691. Next
  692. //判断对象在第几列
  693. ids_Objects.SetSort(" x A ") //如果同一列有多个对象,则按上下位置排序
  694. ids_Objects.SetFilter("isreport<>'1' ") //name<>''
  695. ids_Objects.Filter()
  696. ids_Objects.Sort()
  697. li_Count=ids_Objects.RowCount()
  698. For li=1 To li_Count
  699. li_StartCol=0
  700. li_EndCol=0
  701. IF ids_Objects.Object.Name[li]="report_title" AND ids_Objects.Object.ReportName[li]="" Then //
  702. IF ids_Objects.Find("startrow="+string(ids_objects.object.startrow[li])+" AND Name<>'report_title'",1,ids_objects.RowCount())<=0 Then
  703. ids_Objects.Object.StartCol[li]=ii_FirstColumn
  704. ids_Objects.Object.EndCol[li]=ii_MaxCol
  705. Continue
  706. END IF
  707. END IF
  708. //找到对象的结束列
  709. li_Row=1
  710. IF ids_Objects.Object.LeftLine[li]>0 AND ids_Objects.Object.RightLine[li]>0 Then
  711. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' " +&
  712. " AND name<>'"+ids_Objects.Object.Name[li]+"' AND TopLine="+String(ids_Objects.Object.TopLine[li]) +&
  713. " AND BottomLine="+String(ids_Objects.Object.BottomLine[li] )+" AND LeftLine="+String(ids_Objects.Object.LeftLine[li])+ &
  714. " AND RightLine="+String(ids_Objects.Object.RightLine[li] ),1,ids_Objects.RowCount())
  715. IF li_Row>0 Then
  716. //先保存起来,以免下面再找一次
  717. ids_Objects.Object.CellFlag[li]='1'
  718. END IF
  719. END IF
  720. IF li_Row>0 Then //单元内有其它对象或非表格
  721. //找到对象的开始列
  722. li_Row=ids_Column.Find("x2<="+String(ids_Objects.Object.x[li] + ii_ColSpace),ids_Column.RowCount(),ii_FirstColumn)
  723. IF li_Row>0 Then
  724. li_StartCol=ids_Column.Object.EndCol[li_Row]+1
  725. ELSE
  726. li_StartCol=ii_FirstColumn
  727. END IF
  728. li_Row=ids_Column.Find("x>"+string(ids_Objects.Object.x2[li] -ii_ColSpace ) ,ii_FirstColumn,ids_Column.RowCount())
  729. if li_Row>0 then
  730. li_EndCol=ids_Column.Object.StartCol[li_Row] -1
  731. ELSE
  732. li_EndCol=ii_MaxCol
  733. End if
  734. ids_Objects.Object.StartCol[li]=li_StartCol
  735. ids_Objects.Object.EndCol[li]=li_EndCol
  736. END IF
  737. IF ids_Objects.Object.EndCol[li]<ids_Objects.Object.StartCol[li] Then
  738. ids_Objects.Object.EndCol[li]=ids_Objects.Object.StartCol[li]
  739. END IF
  740. Next
  741. //使单元格合并,报表格式比较好
  742. ids_Objects.SetFilter("LeftLine>0 AND RightLine>0 AND (TopLine>0 OR BottomLine>0) AND CellFlag<>'1' ")
  743. ids_Objects.SetSort("ReportName A ,Band A , y A, X A ") //如果同一列有多个对象,则按上下位置排序
  744. ids_Objects.Filter()
  745. ids_Objects.Sort()
  746. IF ids_Line.RowCount()>0 AND ids_Objects.RowCount()>0 Then
  747. // MessageBox('a',String(ids_Objects.RowCount()))
  748. For li=1 To ids_Objects.RowCount()
  749. IF ids_Objects.Object.TopLine[li]=0 AND ids_Objects.Object.Band[li]="header" Then
  750. Continue
  751. ELSEIF ids_Objects.Object.BottomLine[li]=0 AND ids_Objects.Object.Band[li]="summary" THEN
  752. Continue
  753. END IF
  754. li_Line_Top=0
  755. li_Line_Bottom=0
  756. //重新找到横线
  757. IF ids_Objects.Object.TopLine[li]>0 Then
  758. li_Line_Top=ids_Line.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND LineType='h' "+&
  759. " and x1< "+string(ids_objects.object.x2[li])+" and x2> " +string(ids_objects.object.x[li]) +" AND y1= "+String(ids_Objects.Object.TopLine[li]) ,ids_Line.rowcount(),1)
  760. END IF
  761. //取单元的起始行
  762. IF li_Line_Top>0 Then
  763. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' "+ &
  764. " AND name<>'' AND y>= "+string(ids_Line.Object.Y1[li_Line_Top] -ii_RowSpace )+" AND x< "+string(ids_Line.Object.x2[li_Line_Top] )+" AND x2> "+string(ids_Line.Object.x1[li_Line_Top] ),1,li -1 )
  765. IF li_Row>0 Then
  766. ids_Objects.Object.StartRow[li]=ids_Objects.Object.StartRow[li_Row]
  767. END IF
  768. ELSE
  769. IF ids_Objects.Object.Band[li]<>"summary" AND ids_Objects.Object.Band[li]<>"footer" Then
  770. ids_Objects.Object.StartRow[li]=1
  771. END IF
  772. END IF
  773. //取单元的结束行
  774. IF ids_Objects.Object.BottomLine[li]>0 Then
  775. li_Line_Bottom=ids_Line.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND LineType='h' "+&
  776. " and x1< "+string(ids_objects.object.x2[li])+" and x2> " +string(ids_objects.object.x[li]) +" AND y1= "+String(ids_Objects.Object.BottomLine[li]) ,ids_Line.rowcount(),1)
  777. END IF
  778. IF li_Line_Bottom>0 Then
  779. li_Row=ids_Objects.Find("reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' "+ &
  780. " AND name<>'' AND y< "+string(ids_Line.Object.Y1[li_Line_Bottom] )+" AND x< "+string(ids_Line.Object.x2[li_Line_Bottom] )+" AND x2> "+string(ids_Line.Object.x1[li_Line_Bottom] ),ids_Objects.RowCount(),li +1 )
  781. IF li_Row>0 Then
  782. IF ids_Objects.Object.EndRow[li_Row]>ids_Objects.Object.EndRow[li] Then
  783. ids_Objects.Object.EndRow[li]=ids_Objects.Object.EndRow[li_Row]
  784. END IF
  785. END IF
  786. ELSE
  787. //在表头区,可能没有在最后加一个横线
  788. IF ids_Objects.Object.Band[li]<>"summary" AND ids_Objects.Object.Band[li]<>"footer" Then
  789. li_Row=ids_Objects.Find(" reportname='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' "+ &
  790. " AND name<>'' AND EndRow>"+String(ids_Objects.Object.EndRow[li]),ids_Objects.RowCount(), li+1)
  791. IF li_Row>0 Then
  792. ids_Objects.Object.EndRow[li]=ids_Objects.Object.EndRow[li_Row]
  793. END IF
  794. END IF
  795. END IF
  796. IF ids_Objects.Object.EndRow[li]<ids_Objects.Object.StartRow[li] then
  797. ids_Objects.Object.EndRow[li]=ids_Objects.Object.StartRow[li]
  798. END IF
  799. Next
  800. Destroy lds_Temp
  801. END IF
  802. //如果是交叉报表,需要进一步进行处理
  803. IF ls_Processing="4" Then
  804. ids_Objects.SetFilter("reportName='' AND band='header[1]' And name<>'' ") //加Header是因为有些对象在 foreGround
  805. ids_Objects.Filter()
  806. For li_Row=1 TO ids_Objects.RowCount()
  807. ids_Objects.Object.Band[li_Row]="header"
  808. Next
  809. //计算出标题的行数
  810. li_BeginRow=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',1)"))
  811. IF lb_ForeGroundFlag Then
  812. ii_BorderBeginRow=li_BeginRow
  813. END IF
  814. ii_BorderBeginRow=ii_BorderBeginRow+1
  815. li_BeginRow=li_BeginRow+1
  816. li_Count=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',1)"))
  817. li_Y=Long(idw_Requestor.Describe("datawindow.header[1].height"))
  818. li=2
  819. ls_Band="header["+String(li)+"]"
  820. Do While idw_Requestor.Describe("datawindow."+ls_Band+".height")<>"!"
  821. ids_Objects.SetFilter("reportName='' AND band='"+ls_Band+"'")
  822. ids_Objects.Filter()
  823. ids_Objects.Sort()
  824. For li_Row=1 TO ids_Objects.RowCount()
  825. ids_Objects.Object.Band[li_Row]="header"
  826. ids_Objects.Object.Y[li_Row]= ids_Objects.Object.Y[li_Row]+li_Y
  827. ids_Objects.Object.StartRow[li_Row]=ids_Objects.Object.StartRow[li_Row]+li_Count
  828. ids_Objects.Object.EndRow[li_Row]=ids_Objects.Object.EndRow[li_Row]+li_Count
  829. Next
  830. li_Count=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',1)"))
  831. li_Y+=Long(idw_Requestor.Describe("datawindow."+ls_Band+".height"))
  832. li++
  833. ls_Band="header["+String(li)+"]"
  834. Loop
  835. END IF
  836. IF lb_Border Then
  837. //处理边框
  838. ids_Objects.SetFilter("isReport<>'1' ")
  839. ids_Objects.Filter()
  840. ids_Objects.SetSort("StartRow A, EndRow A ")
  841. ids_Objects.Sort()
  842. ids_Line.SetFilter("")
  843. ids_Line.Filter()
  844. ids_Line.SetSort(" Y1 A ")// reportname A, Band A ,
  845. ids_Line.Sort()
  846. For li=1 To ids_Line.RowCount()
  847. li_Row=0
  848. IF ids_Line.Object.LineType[li]='h' Then
  849. li_Row=ids_Objects.Find("reportname='"+ids_Line.object.ReportName[li]+"' AND Band='"+ids_Line.Object.Band[li]+"' AND y2<= "+string(ids_Line.Object.Y1[li] +ii_RowSpace ) , ids_Objects.RowCount(),1 ) //
  850. IF li_Row>0 Then
  851. ids_Line.Object.StartRow[li]=ids_Objects.Object.StartRow[li_Row]
  852. ELSE
  853. ids_Line.Object.StartRow[li]=1
  854. END IF
  855. ELSE
  856. li_Row=ids_Objects.Find("reportname='"+ids_Line.object.ReportName[li]+"' AND Band='"+ids_Line.Object.Band[li]+"' AND y>= "+string(ids_Line.Object.Y1[li] -ii_RowSpace ) ,1,ids_Objects.RowCount() )
  857. iF li_Row>0 Then
  858. ids_Line.Object.StartRow[li]=ids_Objects.Object.StartRow[li_Row]
  859. END IF
  860. END IF
  861. ids_Line.Object.EndRow[li]=ids_Line.Object.StartRow[li]
  862. IF ids_Line.Object.LineType[li]='v' Then
  863. li_Row=ids_Objects.Find("reportname='"+ids_Line.object.ReportName[li]+"' AND Band='"+ids_Line.Object.Band[li]+"' AND y2<= "+String(ids_Line.Object.Y2[li]+ii_RowSpace ),ids_Objects.RowCount(),1)
  864. IF li_Row>0 Then
  865. ids_Line.Object.EndRow[li]=ids_Objects.Object.EndRow[li_Row]
  866. END IF
  867. END IF
  868. Next
  869. ids_Line.SetFilter("")
  870. ids_Line.Filter()
  871. ids_Line.SetSort("x1 A ")
  872. ids_Line.Sort()
  873. li_ColCount=Long(ids_Column.Describe("Evaluate('Max(EndCol)',1)"))
  874. //取得需要输出边框的单元
  875. For li=1 To ids_Line.RowCount()
  876. LI_Row=ids_Column.Find("x<= "+String(ids_Line.Object.x1[li]+ii_ColSpace),ids_Column.RowCount(),ii_FirstColumn)
  877. IF li_Row>0 Then
  878. ids_Line.Object.StartCol[li]=ids_Column.Object.StartCol[li_Row]
  879. ELSE
  880. ids_Line.Object.StartCol[li]=ii_FirstColumn
  881. END IF
  882. ids_Line.Object.EndCol[li]=ids_Line.Object.StartCol[li]
  883. IF ids_Line.Object.LineType[li]='h' Then
  884. li_Row=ids_Column.Find("x>= "+String(ids_Line.object.x2[li] -ii_ColSpace), ii_FirstColumn, ids_Column.RowCount())
  885. IF li_Row>0 Then
  886. IF ids_Column.Object.StartCol[li_Row]> ids_Line.Object.StartCol[li] Then
  887. ids_Line.Object.EndCol[li]=ids_Column.Object.StartCol[li_Row] -1
  888. END IF
  889. ELSE
  890. ids_Line.Object.EndCol[li]=li_ColCount
  891. END IF
  892. END IF
  893. Next
  894. END IF
  895. //以下代码是避免不同的对象,同时写入Excel的同一单元
  896. ids_Column.SetFilter("")
  897. ids_Column.Filter()
  898. ids_Column.SetSort("StartCol A")
  899. ids_Column.Sort()
  900. ids_Objects.SetFilter("isreport<>'1' ")
  901. ids_Objects.Filter()
  902. ids_Objects.SetSort("ReportName A,Band A , X A ,StartRow A ,X2 A ")
  903. ids_Objects.Sort()
  904. li_Count=ids_Objects.RowCount()
  905. Choose Case is_units
  906. Case '1'
  907. ll_ObjSpace = UnitsToPixels(ll_ObjSpace,XUnitsToPixels!)
  908. Case '2'
  909. ll_ObjSpace = UnitsToPixels(ll_ObjSpace , XUnitsToPixels!) * 0.01041 * 1000
  910. Case '3'
  911. ll_ObjSpace =UnitsToPixels(ll_ObjSpace , XUnitsToPixels!) * 0.02646 * 1000
  912. END Choose
  913. For li=1 To li_Count
  914. //如果对象只是用于设置边框
  915. IF ids_Objects.Object.IsBorderOnly[li]='1' Then
  916. Continue
  917. END IF
  918. //如果对象是左对齐
  919. IF ids_Objects.Object.Alignment[li]=1 Then //Alignment已变为Excel的常量值
  920. IF ids_Objects.Object.StartCol[li]>=1 AND ids_Objects.Object.StartCol[li]<=ids_Column.RowCount() Then
  921. ll_Space= ids_Objects.Object.X[li] - ids_Column.Object.X[ids_Objects.Object.StartCol[li]]
  922. Choose Case is_Units
  923. Case '1'
  924. ll_Space=PixelsToUnits(ll_Space,XPixelsToUnits!)
  925. Case '2'
  926. ll_Space=PixelsToUnits(ll_Space * 96 /1000 ,XPixelsToUnits!)
  927. Case '3'
  928. ll_Space=PixelsToUnits(ll_Space * 37.8 /1000 ,XPixelsToUnits!)
  929. END CHOOSE
  930. IF ll_Space<= 50 Then
  931. ll_Space=0
  932. END IF
  933. ids_Objects.Object.ObjSpace[li]= ll_Space
  934. END IF
  935. END IF
  936. //与前面是否有对象重复输出相同的单元
  937. IF li>1 Then //ids_Objects.Object.EndCol[li]>ids_Objects.Object.StartCol[li] and
  938. li_Row=ids_Objects.Find("reportname='"+ids_ObjectS.Object.ReportName[li]+"' AND "+&
  939. "band='"+ids_objects.object.band[li]+"' and "+&
  940. "isborderonly<>'1' and "+&
  941. "startrow<="+String(ids_Objects.Object.EndRow[li])+ " and "+ &
  942. "endrow>="+String(ids_Objects.Object.StartRow[li])+" AND " + &
  943. "endcol>="+String(ids_Objects.Object.StartCol[li]),li -1 ,1 )
  944. IF li_Row>0 Then
  945. //如果对象离下一列的位置很近,则把它移到下一列输出
  946. IF ids_Objects.Object.EndCol[li]>ids_Objects.Object.EndCol[li_Row] Then
  947. IF (ids_Column.Object.X[ids_Objects.Object.StartCol[li]+1] - ids_Objects.Object.x[li] )<ll_ObjSpace Then
  948. ids_Objects.Object.StartCol[li]= ids_Objects.Object.StartCol[li]+1
  949. ids_Objects.Object.ObjSpace[li]=0
  950. Continue
  951. END IF
  952. END IF
  953. //如果上一对象离右边线很近,或者两个单元的字体不同
  954. IF ids_Objects.Object.StartCol[li]>0 AND ids_Objects.Object.StartCol[li]<= ids_Column.RowCount() Then
  955. IF ids_Objects.Object.x2[li_Row] - ids_Column.Object.X[ids_Objects.Object.StartCol[li]] <ll_ObjSpace Then
  956. IF ids_Objects.Object.EndCol[li_Row]>ids_Objects.Object.StartCol[li_Row] Then //AND ids_Objects.Object.FontSize[li_Row]<>ids_Objects.Object.FontSize[li] Then
  957. ids_Objects.Object.EndCol[li_Row]= ids_Objects.Object.StartCol[li] - 1
  958. ids_Objects.Object.ObjSpace[li]=0
  959. Continue
  960. ELSEIF ids_Objects.Object.EndCol[li]>ids_Objects.Object.StartCol[li] Then
  961. ids_Objects.Object.EndCol[li] = ids_Objects.Object.EndCol[li] -1
  962. Continue
  963. END IF
  964. END IF
  965. END IF
  966. ids_Objects.Object.StartCol[li]=ids_Objects.Object.StartCol[li_Row]
  967. IF ids_Objects.Object.x[li]> ids_Objects.Object.x2[li_Row] AND ids_Objects.Object.StartRow[li]= ids_Objects.Object.StartRow[li_Row] Then
  968. ll_Space=ids_Objects.Object.x[li] - ids_Objects.Object.x2[li_Row]
  969. Choose Case is_Units
  970. Case '1'
  971. ll_Space=PixelsToUnits(ll_Space,XPixelsToUnits!)
  972. Case '2'
  973. ll_Space=PixelsToUnits(ll_Space * 96 /1000 ,XPixelsToUnits!)
  974. Case '3'
  975. ll_Space=PixelsToUnits(ll_Space * 37.8 /1000 ,XPixelsToUnits!)
  976. END CHOOSE
  977. IF ll_Space<= 50 Then
  978. ll_Space=0
  979. END IF
  980. ids_Objects.Object.ObjSpace[li]=ll_Space
  981. //把对象Width 换算成pb units
  982. ids_Objects.Object.MergeFlag[li_Row]="1"
  983. ll_Space= ids_Objects.Object.Width[li_Row]
  984. Choose Case is_Units
  985. Case '1'
  986. ll_Space=PixelsToUnits(ll_Space,XPixelsToUnits!)
  987. Case '2'
  988. ll_Space=PixelsToUnits(ll_Space * 96 /1000 ,XPixelsToUnits!)
  989. Case '3'
  990. ll_Space=PixelsToUnits(ll_Space * 37.8 /1000 ,XPixelsToUnits!)
  991. END CHOOSE
  992. IF ll_Space<= 50 Then
  993. ll_Space=0
  994. END IF
  995. ids_Objects.Object.Width[li_Row]=ll_Space
  996. END IF
  997. //2004-11-15
  998. ELSE
  999. //当前单元范围内有没有对象只用于设置单元边框
  1000. li_Row=ids_Objects.Find("reportname='"+ids_ObjectS.Object.ReportName[li]+"' AND "+&
  1001. "band='"+ids_objects.object.band[li]+"' and "+&
  1002. "isborderonly='1' and "+&
  1003. "startrow<="+String(ids_Objects.Object.EndRow[li])+ " and "+ &
  1004. "endrow>="+String(ids_Objects.Object.StartRow[li])+" AND " + &
  1005. "startcol<="+String(ids_Objects.Object.EndCol[li])+" AND " +&
  1006. "endcol>="+String(ids_Objects.Object.StartCol[li]),1 ,ids_ObjectS.RowCount())
  1007. IF li_Row>0 Then
  1008. //单元内是否有其它对象
  1009. li_BeginRow=ids_Objects.Find("reportname='"+ids_ObjectS.Object.ReportName[li_Row]+"' AND "+&
  1010. "band='"+ids_objects.object.band[li_Row]+"' and "+&
  1011. "isborderonly<>'1' and "+&
  1012. "startrow<="+String(ids_Objects.Object.EndRow[li_Row])+ " and "+ &
  1013. "endrow>="+String(ids_Objects.Object.StartRow[li_Row])+" AND " + &
  1014. "startcol<="+String(ids_Objects.Object.EndCol[li_Row])+" AND " +&
  1015. "endcol>="+String(ids_Objects.Object.StartCol[li_Row])+" AND " + &
  1016. "getRow()<>"+String(li),1 ,ids_ObjectS.RowCount())
  1017. //没有,则取边框单元的行列
  1018. IF li_BeginRow<=0 Then
  1019. ids_Objects.Object.StartRow[li] = ids_Objects.Object.StartRow[li_Row]
  1020. ids_Objects.Object.EndRow[li] = ids_Objects.Object.EndRow[li_Row]
  1021. ids_Objects.Object.StartCol[li] = ids_Objects.Object.StartCol[li_Row]
  1022. ids_Objects.Object.EndCOL[li] = ids_Objects.Object.EndCOL[li_Row]
  1023. END IF
  1024. END IF
  1025. END IF
  1026. END IF
  1027. Next
  1028. IF IsValid(ids_ReportObj) Then
  1029. For li=1 To ids_ReportObj.RowCount()
  1030. li_Row = ids_Objects.Find("ReportName='"+ids_ReportObj.Object.Name[li]+"'",1,ids_Objects.RowCount())
  1031. IF li_Row>0 Then
  1032. ids_ReportObj.Object.StartCol[li]= ids_Objects.Object.StartCol[li_Row]
  1033. END IF
  1034. li_Row = ids_Objects.Find("ReportName='"+ids_ReportObj.Object.Name[li]+"'",ids_Objects.RowCount(),1)
  1035. IF li_Row>0 Then
  1036. ids_ReportObj.Object.EndCol[li]= ids_Objects.Object.EndCol[li_Row]
  1037. END IF
  1038. Next
  1039. END IF
  1040. Destroy lds_Temp
  1041. //OpenWithParm(w3,ids_objects)
  1042. end subroutine
  1043. protected function long of_arraytostring (string as_source[], string as_delimiter, ref string as_ref_string);long ll_dellen
  1044. long ll_pos
  1045. long ll_count
  1046. long ll_arrayupbound
  1047. string ls_holder
  1048. boolean lb_entryfound
  1049. ll_arrayupbound = upperbound(as_source)
  1050. if isnull(as_delimiter) or not ll_arrayupbound > 0 then
  1051. return -1
  1052. end if
  1053. as_ref_string = ""
  1054. for ll_count = 1 to ll_arrayupbound
  1055. if as_source[ll_count] <> "" then
  1056. if len(as_ref_string) = 0 then
  1057. as_ref_string = as_source[ll_count]
  1058. else
  1059. as_ref_string = as_ref_string + as_delimiter + as_source[ll_count]
  1060. end if
  1061. end if
  1062. next
  1063. return 1
  1064. end function
  1065. protected subroutine of_check_property (ref string as_str, ref string as_expression);string ls_str
  1066. long ll_pos
  1067. as_expression=""
  1068. if as_str <> "!" and as_str <> "?" and as_str <> "" then
  1069. ll_pos = pos(lower(as_str), "~t")
  1070. if ll_pos > 0 then
  1071. as_expression = right(as_str, len(as_str) - ll_pos)
  1072. if right(as_expression, 1) = "~"" then
  1073. as_expression = Trim(left(as_expression, len(as_expression) - 1))
  1074. end if
  1075. as_str = left(as_str, ll_pos - 1)
  1076. if left(as_str, 1) = "~"" then
  1077. as_str = right(as_str, len(as_str) - 1)
  1078. end if
  1079. end if
  1080. as_str = Trim(as_str)
  1081. else
  1082. as_str=""
  1083. as_expression=""
  1084. end if
  1085. end subroutine
  1086. protected subroutine of_closeuserobject ();IF IsValid(iw_Parent) AND IsValid(iuo_Text) Then
  1087. iw_Parent.CloseUserObject(iuo_Text)
  1088. END IF
  1089. end subroutine
  1090. protected function string of_evaluate (datastore a_ds, string as_express, long al_row);/*----------------------------------------------------------------------------
  1091. 求指定表达式的值
  1092. 返回值是字符串类型
  1093. 如果计算有错误,返回空值
  1094. 应用示例:
  1095. long l_sum
  1096. int li_page,li_pagecount
  1097. l_sum=long(of_getvalud("1+30+120",1))
  1098. li_page=integer(of_getvale("page()",1))
  1099. li_pagecount=integer(of_getvalue("pagecount()",1))
  1100. ------------------------------------------------------------------------------*/
  1101. String ls_ret
  1102. Int li_Pos
  1103. as_Express=Trim(as_Express)
  1104. IF Left(as_Express,1)="'" AND Right(as_Express,1)="'" Then
  1105. as_Express=Mid(as_Express,2,Len(as_Express) -2)
  1106. ELSE
  1107. IF Left(as_Express,1)='"' AND Right(as_Express,1)='"' Then
  1108. as_Express=Mid(as_Express,2,Len(as_Express) -2)
  1109. END IF
  1110. END IF
  1111. li_Pos=Pos(as_Express,"~t") //检查表达式是否数据窗口对象属性表达式的语法,如 font.color='200~tif(a=1,255,0)'
  1112. IF li_Pos>0 Then
  1113. as_Express=Mid(as_Express,li_POs+1)
  1114. END IF
  1115. as_Express=OF_ReplaceAll(as_Express,"'",'"' ) //把单引号换成双引号ls_ret=a_ds.describe("Evaluate('"+as_express+"', " +string(al_row)+ ")")
  1116. ls_ret=a_ds.describe("Evaluate('"+as_express+"', " +string(al_row)+ ")")
  1117. IF ls_ret="?" OR ls_ret="!" THEN
  1118. ls_ret=""
  1119. END IF
  1120. Return ls_ret
  1121. end function
  1122. protected function integer of_get_penwidth (integer ai_width);Choose Case is_Units
  1123. Case '1'
  1124. ai_Width= PixelsToUnits(ai_Width, YPixelsToUnits!)
  1125. Case '2'
  1126. ai_Width=PixelsToUnits(ai_Width * 0.096, YPixelsToUnits!)
  1127. Case '3'
  1128. ai_Width= PixelsToUnits(ai_Width * 0.0378, YPixelsToUnits!)
  1129. END CHOOSE
  1130. IF ai_Width>10 Then
  1131. ai_Width =5
  1132. ELSEIF ai_Width >5 Then
  1133. ai_Width =2
  1134. ELSE
  1135. ai_Width =1
  1136. END IF
  1137. Return ai_Width
  1138. end function
  1139. protected subroutine of_getcolumninfo ();Long li,lj, lk ,li_Row
  1140. Long li_ColCount
  1141. String ls_Processing
  1142. uint li_startcol
  1143. Long ll_MinWidth
  1144. Long ll_LineSpace
  1145. ls_Processing=idw_Requestor.Describe("datawindow.processing")
  1146. ll_LineSpace= 50
  1147. Choose Case is_Units
  1148. Case '1'
  1149. ll_LineSpace= UnitsToPixels(ll_LineSpace,XUnitsToPixels!)
  1150. Case "2"
  1151. ll_LineSpace= UnitsToPixels(ll_LineSpace,XUnitsToPixels!) * 0.1041
  1152. Case "3"
  1153. ll_LineSpace = UnitsToPixels(ll_LineSpace, XUnitsToPixels!) *2.646
  1154. END CHOOSE
  1155. //取得列
  1156. //ids_Column.InsertRow(0)
  1157. //ids_Column.Object.ReportName[1]=''
  1158. //ids_Column.Object.Band[1]=''
  1159. //ids_Column.Object.X[1]= -100
  1160. //ids_Column.Object.Width[1]=100
  1161. IF ii_FirstColumn<=1 Then
  1162. ii_FirstColumn=1
  1163. ELSE
  1164. ii_FirstColumn=2
  1165. END IF
  1166. li_startcol= ii_FirstColumn -1
  1167. IF ls_Processing="1" OR ls_Processing="4" Then
  1168. ids_Objects.SetFilter("band='detail' AND Stype<>'line' ")
  1169. ids_Objects.Filter()
  1170. ids_Objects.RowsCopy(1,ids_Objects.RowCount(),Primary!,ids_Column,ids_Column.RowCount()+1,Primary!)
  1171. ids_Column.SetSort("x a , y A " )
  1172. ids_Column.Sort()
  1173. For li=1 To ids_Column.RowCount()
  1174. li_startcol++
  1175. ids_Column.Object.StartCol[li]=li_startcol
  1176. ids_Column.Object.EndCol[li]=li_startcol
  1177. ids_Column.Object.StartRow[li]=1
  1178. ids_Column.Object.EndRow[li]=1
  1179. Next
  1180. ELSE
  1181. IF ib_FormFlag Then
  1182. ids_Line.SetFilter("linetype='v'")
  1183. ids_Line.Filter()
  1184. ids_Line.SetSort("x1 A ")
  1185. ids_Line.Sort()
  1186. ib_FormFlag=False
  1187. IF ids_Line.RowCount()>0 Then
  1188. //多于两条竖线
  1189. IF ids_Line.Find("x1> "+String(ids_Line.Object.X1[1]+ll_LineSpace)+" AND X2< "+String(ids_Line.Object.X2[ids_Line.RowCount()] - ll_LineSpace)+" AND Band='"+ids_Line.Object.Band[1]+"'" ,1,ids_Line.RowCount())>0 Then
  1190. ids_Objects.SetFilter("name<>'report_title' and band<>'footer' and stype<>'report' and x< "+String(ids_Line.Object.X1[1]))
  1191. ids_Objects.Filter()
  1192. ib_FormFlag=True
  1193. ib_GridBorder=False //2004-11-15
  1194. END IF
  1195. END IF
  1196. END IF
  1197. IF Not ib_FormFlag Then
  1198. ids_Objects.SetFilter("name<>'report_title' and band<>'footer' and stype<>'report' ")
  1199. ids_Objects.Filter()
  1200. END IF
  1201. ids_Objects.SetSort("x A ")
  1202. ids_Objects.Sort()
  1203. IF ids_Objects.RowCount()>0 Then
  1204. li_startcol++
  1205. li_Row=ids_Column.InsertRow(0)
  1206. ids_Column.Object.Name[li_Row]=ids_Objects.Object.Name[1]
  1207. ids_Column.Object.ReportName[li_Row]=ids_Objects.Object.ReportName[1]
  1208. ids_Column.Object.x[li_Row]=ids_Objects.Object.x[1]
  1209. ids_Column.Object.StartCol[li_Row]=li_startcol
  1210. ids_Column.Object.EndCol[li_Row]=li_startcol
  1211. For li=1 To ids_Objects.RowCount()
  1212. lj=ids_Column.RowCount()
  1213. IF (ids_Objects.Object.x[li] - ids_Column.Object.x[lj])>ii_ColSpace Then //如果列之前的间隔小于20,则忽略它,以免生成太多的列
  1214. ids_Column.Object.Width[lj]=ids_Objects.Object.x[li] - ids_Column.Object.x[lj]
  1215. li_startcol++
  1216. li_Row=ids_Column.InsertRow(0)
  1217. ids_Column.Object.x[li_Row]=ids_Objects.Object.x[li]
  1218. ids_Column.Object.Name[li_Row]=ids_Objects.Object.Name[li]
  1219. ids_Column.Object.ReportName[li_Row]=ids_Objects.Object.ReportName[li]
  1220. ids_Column.Object.StartCol[li_Row]=li_startcol
  1221. ids_Column.Object.EndCol[li_Row]= li_startcol
  1222. ids_Column.Object.Width[li_Row]=ids_Objects.Object.Width[li]
  1223. END IF
  1224. ids_Objects.Object.StartCol[li]=li_startcol
  1225. ids_Objects.Object.EndCol[li]=li_startcol
  1226. Next
  1227. END IF
  1228. IF ids_Column.RowCount()<=0 And ids_Line.RowCount()>0 Then
  1229. li_startcol++
  1230. li_Row=ids_Column.InsertRow(0)
  1231. ids_Column.Object.ReportName[li_Row]=ids_Line.Object.ReportName[1]
  1232. ids_Column.Object.Name[li_Row]=ids_Line.Object.Name[1]
  1233. ids_Column.Object.x[li_Row]=ids_Line.Object.x1[1]
  1234. ids_Column.Object.StartCol[li_Row]=li_startcol
  1235. ids_Column.Object.EndCol[li_Row]=li_startcol
  1236. ids_Line.Object.StartCol[1]=li_Row
  1237. END IF
  1238. For li=1 TO ids_Line.RowCount()
  1239. lj=ids_Column.RowCount()
  1240. IF (ids_Line.Object.x1[li] - ids_Column.Object.x[lj])>ii_ColSpace Then //如果列之前的间隔小于20,则忽略它,以免生成太多的列
  1241. ids_Column.Object.Width[lj]=ids_Line.Object.x1[li] - ids_Column.Object.x[lj]
  1242. li_startcol++
  1243. li_Row=ids_Column.InsertRow(0)
  1244. ids_Column.Object.ReportName[li_Row]=ids_Line.Object.ReportName[li]
  1245. ids_Column.Object.x[li_Row]=ids_Line.Object.x1[li]
  1246. ids_Column.Object.Name[li_Row]=ids_Line.Object.Name[li]
  1247. ids_Column.Object.StartCol[li_Row]=li_startcol
  1248. ids_Column.Object.EndCol[li_Row]= li_startcol
  1249. ids_Column.Object.Width[li_Row]=ids_Line.Object.x2[li] - ids_Line.Object.x1[li]
  1250. END IF
  1251. ids_Line.Object.StartCol[li]=li_startcol
  1252. ids_Line.Object.EndCol[li]=li_startcol
  1253. Next
  1254. IF ib_FormFlag Then
  1255. li=ids_Line.RowCount()
  1256. IF li>0 Then
  1257. ids_Objects.SetFilter("x> "+String(ids_Line.Object.X2[li]))
  1258. ids_Objects.Filter()
  1259. ids_Objects.SetSort("x A ")
  1260. ids_Objects.Sort()
  1261. IF ids_Objects.RowCount()>0 Then
  1262. IF ids_Column.RowCount()<=0 Then
  1263. li_startcol++
  1264. li_Row=ids_Column.InsertRow(0)
  1265. ids_Column.Object.ReportName[li_Row]=ids_Objects.Object.ReportName[1]
  1266. ids_Column.Object.Name[li_Row]=ids_Objects.Object.Name[1]
  1267. ids_Column.Object.x[li_Row]=ids_Objects.Object.x[1]
  1268. ids_Column.Object.StartCol[li_Row]=li_startcol
  1269. ids_Column.Object.EndCol[li_Row]=li_startcol
  1270. ids_Objects.Object.StartCol[1]=li_startcol
  1271. END IF
  1272. For li=1 To ids_Objects.RowCount()
  1273. lj=ids_Column.RowCount()
  1274. IF (ids_Objects.Object.x[li] - ids_Column.Object.x[lj])>ii_ColSpace Then //如果列之前的间隔小于20,则忽略它,以免生成太多的列
  1275. ids_Column.Object.Width[lj]=ids_Objects.Object.x[li] - ids_Column.Object.x[lj]
  1276. li_startcol++
  1277. li_Row=ids_Column.InsertRow(0)
  1278. ids_Column.Object.x[li_Row]=ids_Objects.Object.x[li]
  1279. ids_Column.Object.ReportName[li_Row]=ids_Objects.Object.ReportName[li]
  1280. ids_Column.Object.Name[li_Row]=ids_Objects.Object.Name[li]
  1281. ids_Column.Object.StartCol[li_Row]=li_startcol
  1282. ids_Column.Object.EndCol[li_Row]= li_startcol
  1283. ids_Column.Object.Width[li_Row]=ids_Objects.Object.Width[li]
  1284. END IF
  1285. ids_Objects.Object.StartCol[li]=li_startcol
  1286. ids_Objects.Object.EndCol[li]=li_startcol
  1287. Next
  1288. END IF
  1289. END IF
  1290. END IF
  1291. END IF
  1292. IF li_startcol>256 Then
  1293. MessageBox("提示","报表的列数不能大于256列,生成文件失败!", Information!, OK! )
  1294. ids_Objects.Reset()
  1295. ids_Column.Reset()
  1296. ids_Line.Reset()
  1297. Return
  1298. END IF
  1299. ll_MinWidth= 20
  1300. Choose Case is_Units
  1301. Case '1'
  1302. ll_MinWidth= UnitsToPixels(ll_MinWidth,XUnitsToPixels!)
  1303. Case "2"
  1304. ll_MinWidth= UnitsToPixels(ll_MinWidth,XUnitsToPixels!) * 0.1041
  1305. Case "3"
  1306. ll_MinWidth = UnitsToPixels(ll_MinWidth, XUnitsToPixels!) *2.646
  1307. END CHOOSE
  1308. IF ii_FirstColumn>1 AND ids_Column.RowCount()>0 Then
  1309. ids_Column.InsertRow(1)
  1310. ids_Column.Object.Width[1]=ids_Column.Object.X[2]
  1311. IF ids_Column.Object.Width[1]<ll_MinWidth Then
  1312. ids_Column.Object.Width[1]=ll_MinWidth
  1313. END IF
  1314. ids_Column.Object.StartCol[1]=1
  1315. ids_Column.Object.EndCol[1]=1
  1316. ids_Column.Object.X[1]= ids_Column.Object.Width[1] * -1
  1317. END IF
  1318. //openwithparm(w3,ids_column)
  1319. end subroutine
  1320. protected subroutine of_getobjects ();String ls_Type,ls_Band
  1321. String ls_OldBand ,ls_Expression
  1322. String ls_Name
  1323. String ls_Objects[]
  1324. String ls_Processing
  1325. String ls_Format,ls_ColType
  1326. int li,lj, lk,li_Row,li_Col, li_count
  1327. Long li_x,li_Y,li_x2, li_Height
  1328. Int li_BeginRow,li_EndRow
  1329. Boolean lb_ForeGroundFlag
  1330. String ls_Bands[]
  1331. String ls_Exp
  1332. String ls_Visible ,ls_VisibleExp
  1333. uLong li_Color
  1334. Datastore lds_Temp
  1335. IF Not IsValid(idw_Requestor) Then
  1336. Return
  1337. END IF
  1338. SetPointer(HourGlass!)
  1339. ls_Processing=idw_Requestor.Describe("datawindow.Processing")
  1340. IF ls_Processing="4" Then
  1341. idw_Requestor.Modify("DataWindow.Crosstab.StaticMode=Yes")
  1342. END IF
  1343. lds_Temp=Create DataStore
  1344. lds_Temp.DataObject=idw_Requestor.DataObject
  1345. ids_Column=Create Datastore
  1346. ids_Objects=Create DataStore
  1347. ids_Column.Dataobject="d_dw2xls_objects"
  1348. ids_objects.Dataobject="d_dw2xls_objects"
  1349. ids_Line=Create Datastore
  1350. ids_Line.DataObject="d_dw2xls_LineObjects"
  1351. ids_RowHeight=Create Datastore
  1352. ids_RowHeight.DataObject="d_dw2xls_RowHeight"
  1353. is_LineTag=Trim(is_LineTag) //不输出线型的标识
  1354. ids_Bands=Create Datastore
  1355. ids_Bands.DataObject="d_dw2xls_bands"
  1356. is_Format_Currency=OF_Get_Currency_Format()
  1357. is_units=idw_Requestor.Describe("datawindow.units")
  1358. IF ii_RowSpace<0 Then
  1359. ii_RowSpace=30
  1360. END IF
  1361. IF ii_ColSpace<0 Then
  1362. ii_ColSpace=30
  1363. END IF
  1364. Choose Case is_units
  1365. Case '1'
  1366. ii_RowSpace = UnitsToPixels(ii_RowSpace,XUnitsToPixels!)
  1367. ii_ColSpace = UnitsToPixels(ii_ColSpace,YUnitsToPixels!)
  1368. Case '2'
  1369. ii_RowSpace = UnitsToPixels(ii_RowSpace, XUnitsToPixels!) * 0.01041 * 1000
  1370. ii_ColSpace= UnitsToPixels(ii_ColSpace, YUnitsToPixels!) * 0.01041 * 1000
  1371. Case '3'
  1372. ii_RowSpace = UnitsToPixels(ii_RowSpace, XUnitsToPixels!) * 0.02646 * 1000
  1373. ii_ColSpace= UnitsToPixels(ii_ColSpace, YUnitsToPixels!) * 0.02646 * 1000
  1374. END Choose
  1375. //为了更方便的调用导出功能,如果报表不是一个表格时(或者输出线条影响报表的导出效果)
  1376. //可以把 FormFlag参数设置为 False
  1377. // 可以在制作报表的时候,增加 dw2xls_formflag 对象,然后设置 Tag为1或者 为0,来进行控制
  1378. ls_Exp=idw_Requestor.Describe("dw2xls_formflag.Tag")
  1379. idw_Requestor.Modify("dw2xls_formflag.visible='0'")
  1380. IF ls_Exp="0" Then
  1381. ib_Formflag=False
  1382. ELSEIF ls_Exp="1" Then
  1383. ib_FormFlag=True
  1384. END IF
  1385. //如果报表确实需要输出表格的边框,而表格的竖线很少,而导致报表的输出效果很差时
  1386. //可考虑用文本对象(设置border为2,文本内容为空) 来建立表格
  1387. //这时导出的效果会比较好,但可惜不能设置表格的边框类型和颜色
  1388. ////带区信息
  1389. li_Count=OF_ParseToArray(idw_Requestor.Describe("datawindow.bands"),"~t",ls_Bands)
  1390. For li=1 TO li_Count
  1391. li_Row = ids_Bands.InsertRow(0)
  1392. ids_Bands.Object.Reportname[li_Row]=''
  1393. ids_Bands.Object.Band[li_Row]= ls_bands[li]
  1394. ids_Bands.Object.Band[li_Row]= ls_bands[li]
  1395. ids_Bands.Object.OldBand[li_Row]= ls_bands[li]
  1396. lj=Pos(ls_bands[li],"[")
  1397. IF lj>0 Then
  1398. ids_Bands.Object.Band[li_Row]= Left(ls_bands[li],lj -1)
  1399. END IF
  1400. ls_format= idw_Requestor.Describe("datawindow."+ls_bands[li]+".color")
  1401. of_check_property(ls_format,ls_exp)
  1402. ids_Bands.Object.ColorExp[li_Row]=ls_Exp
  1403. if ls_exp="" then
  1404. li_Color=invo_colors.of_get_color(long(ls_format))
  1405. IF li_Color<>0 then
  1406. ids_Bands.Object.Color[li_row]=invo_colors.of_get_custom_color_index( li_Color )
  1407. else
  1408. ids_Bands.Object.Color[li_row]= 65
  1409. end if
  1410. END IF
  1411. //ids_Bands.Object.Height[li_Row]=Long(idw_Requestor.Describe("datawindow."+ls_Bands[li]+".height"))
  1412. //ids_Bands.Object.AutoHeight[li_Row]=idw_Requestor.Describe("datawindow."+ls_bands[li]+".height.autosize")
  1413. Next
  1414. ls_Type=idw_Requestor.Describe("datawindow.objects")
  1415. li_Count=OF_ParseToArray(ls_Type,"~t",ls_Objects)
  1416. ls_Type=""
  1417. For li=1 To li_Count
  1418. IF ids_Objects.Find("ReportName='' AND Name='"+ls_Objects[li]+"'",1,li_Count)>0 Then
  1419. Continue
  1420. END IF
  1421. ls_Band=idw_Requestor.Describe(ls_Objects[li]+".Band")
  1422. IF ls_Band="?" OR ls_Band="!" Then
  1423. Continue
  1424. END IF
  1425. ls_Type=idw_Requestor.Describe(ls_Objects[li]+".Type")
  1426. ls_OldBand=ls_Band
  1427. IF ls_Band="foreground" OR ls_Band="background" Then
  1428. IF ls_Type<>'line' Then
  1429. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Y")
  1430. ELSE
  1431. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Y1")
  1432. END IF
  1433. OF_Check_Property(ls_Format,ls_Exp)
  1434. IF ls_Exp<>"" Then
  1435. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1436. END IF
  1437. li_Y=Long(ls_Format)
  1438. IF ls_Processing="4" Then
  1439. IF li_Y<=Long(idw_Requestor.Describe("datawindow.header[1].height")) Then
  1440. ls_Band="header[1]"
  1441. lb_ForeGroundFlag=True
  1442. ELSE
  1443. //IF ls_Type<>"line" Then //不特别处理线条
  1444. // li_Row = UpperBound(istr_Foregroundobj)+1
  1445. // istr_Foregroundobj[li_Row].Name = ls_Objects[li]
  1446. // istr_Foregroundobj[li_Row].y = li_Y
  1447. // END IF
  1448. Continue
  1449. END IF
  1450. ELSE
  1451. IF li_Y<=Long(idw_Requestor.Describe("datawindow.header.height")) Then
  1452. ls_Band="header"
  1453. ELSE
  1454. //IF ls_Type<>"line" Then //不特别处理线条
  1455. // li_Row = UpperBound(istr_Foregroundobj)+1
  1456. // istr_Foregroundobj[li_Row].Name = ls_Objects[li]
  1457. // istr_Foregroundobj[li_Row].y = li_Y
  1458. //END IF
  1459. Continue
  1460. END IF
  1461. END IF
  1462. END IF
  1463. //如果带区的高度为0,不读入对象
  1464. li_Height=Long(idw_Requestor.Describe("datawindow."+ls_band+".height"))
  1465. IF li_Height<=10 Then
  1466. COntinue
  1467. END IF
  1468. //如果对象的Y值大于带区高度,也不读入
  1469. IF ls_Type="line" Then
  1470. IF Long(idw_Requestor.Describe(ls_Objects[li]+".Y1"))> li_Height Then
  1471. Continue
  1472. END IF
  1473. ELSE
  1474. IF Long(idw_Requestor.Describe(ls_Objects[li]+".Y"))> li_Height Then
  1475. Continue
  1476. END IF
  1477. END IF
  1478. ls_Visible=Trim(idw_Requestor.Describe(ls_Objects[li]+".Visible"))
  1479. OF_Check_Property(ls_Visible,ls_VisibleExp)
  1480. IF ls_Type="report" Then
  1481. IF ls_Visible='0' OR ls_VisibleExp='0' Then
  1482. Continue
  1483. END IF
  1484. IF Not IsValid(ids_ReportObj) Then
  1485. ids_reportobj=Create DataStore
  1486. ids_ReportObj.DataObject=ids_Objects.DataObject
  1487. END IF
  1488. li_Row=ids_ReportObj.InsertRow(0)
  1489. ids_ReportObj.Object.Name[li_Row]=ls_Objects[li]
  1490. ids_ReportObj.Object.Band[li_Row]=ls_Band
  1491. ids_ReportObj.Object.x[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".x"))
  1492. ids_ReportObj.Object.Width[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".Width"))
  1493. ids_ReportObj.Object.y[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".y"))
  1494. ids_ReportObj.Object.Height[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".Height"))
  1495. ids_ReportObj.Object.RowInDetail[li_Row]=1
  1496. //读取子数据窗口对象列表
  1497. OF_GetObjects(ls_Objects[li])
  1498. //2004-11-28 为了处理行高,可能在两个子数据窗口之间,有其它对象,如文本,计算字段等
  1499. li_Row=ids_Objects.InsertRow(0)
  1500. ids_Objects.Object.ReportName[li_Row]=""
  1501. ids_Objects.Object.Name[li_Row]=""
  1502. ids_Objects.Object.Band[li_Row]=ls_Band
  1503. ids_Objects.Object.x[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".x"))
  1504. ids_Objects.Object.Width[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".Width"))
  1505. ids_Objects.Object.y[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".y"))
  1506. ids_Objects.Object.Height[li_Row]=Long(idw_Requestor.Describe(ls_Objects[li]+".Height"))
  1507. ids_Objects.Object.IsReport[li_Row]='1'
  1508. Continue
  1509. END IF
  1510. IF ls_Type="line" Then
  1511. //如果设置报表不是表格,则不处理线条 2004-11-15
  1512. IF Not ib_FormFlag Then
  1513. Continue
  1514. END IF
  1515. IF ls_Visible='0' OR ls_VisibleExp='0' Then
  1516. Continue
  1517. END IF
  1518. IF idw_Requestor.Describe(ls_Objects[li]+".Tag")=is_LineTag Then
  1519. Continue
  1520. END IF
  1521. li_Row=ids_Line.InsertRow(0)
  1522. ids_Line.Object.ReportName[li_Row]=''
  1523. ids_Line.Object.Name[li_Row]=ls_Objects[li]
  1524. ids_Line.Object.Band[li_Row]=ls_Band
  1525. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".x1")
  1526. OF_Check_Property(ls_Format,ls_Exp)
  1527. IF ls_Exp<>"" Then
  1528. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1529. END IF
  1530. ids_Line.Object.x1[li_Row]=Long(ls_Format)
  1531. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".x2")
  1532. OF_Check_Property(ls_Format,ls_Exp)
  1533. IF ls_Exp<>"" Then
  1534. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1535. END IF
  1536. ids_Line.Object.x2[li_Row]=Long(ls_Format)
  1537. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Y1")
  1538. OF_Check_Property(ls_Format,ls_Exp)
  1539. IF ls_Exp<>"" Then
  1540. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1541. END IF
  1542. ids_Line.Object.Y1[li_Row]=Long(ls_Format)
  1543. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Y2")
  1544. OF_Check_Property(ls_Format,ls_Exp)
  1545. IF ls_Exp<>"" Then
  1546. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1547. END IF
  1548. ids_Line.Object.Y2[li_Row]=Long(ls_Format)
  1549. ls_Format= idw_Requestor.Describe(ls_Objects[li]+".Pen.Color")
  1550. OF_Check_Property(ls_Format,ls_Exp)
  1551. IF ls_Exp<>"" Then
  1552. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1553. END IF
  1554. ids_Line.Object.PenColor[li_Row]=invo_colors.of_get_custom_color_index( invo_colors.of_get_color(long(ls_format)) )
  1555. Choose Case idw_Requestor.Describe(ls_Objects[li]+".pen.style")
  1556. Case "1"
  1557. ids_Line.Object.PenWidth[li_Row]=3
  1558. Case "2"
  1559. ids_Line.Object.PenWidth[li_Row]=4
  1560. Case Else
  1561. ids_Line.object.PenWidth[li_Row]=OF_Get_PenWidth(Long(idw_Requestor.Describe(ls_Objects[li]+".Pen.Width")))
  1562. END Choose
  1563. Continue
  1564. END IF
  1565. //其它对象,如果有边框属性为2,也输出边框 2004-11-15
  1566. IF ls_Type<>"text" AND ls_Type<>"column" AND ls_Type<>"compute" AND idw_Requestor.Describe(ls_objects[li]+".border")<>"2" Then
  1567. Continue
  1568. END IF
  1569. //加入检查表达式是否有效
  1570. IF ls_Type="compute" Then
  1571. ls_Expression=idw_Requestor.Describe(ls_Objects[li]+".Expression")
  1572. IF ls_Expression="?" OR ls_Expression="!" Then
  1573. Continue
  1574. END IF
  1575. END IF
  1576. IF ls_Objects[li]="sys_back" AND ls_OldBand="foreground" Then //报表标题的背景文本框
  1577. Continue
  1578. END IF
  1579. IF ls_Objects[li]="sys_lastcol" AND ls_OldBand="detail" Then //用于标识Grid形式报表的最后一列
  1580. Continue
  1581. END IF
  1582. //如果对象的Visible属性为False,不输出
  1583. IF ls_Visible='0' OR ls_VisibleExp='0' Then
  1584. //如果数据窗口是否表格,而且对象在细节区,则需要把该列的其它对象给屏蔽掉
  1585. IF ls_Processing="1" AND ls_Band="detail" Then
  1586. li_x=Long( lds_Temp.Describe(ls_Objects[li]+".x"))
  1587. li_x2=li_x+Long( lds_Temp.Describe(ls_Objects[li]+".width"))
  1588. For lj=1 To li_Count
  1589. IF idw_Requestor.Describe(ls_Objects[lj]+".Band")<>"detail" Then
  1590. IF Long(lds_Temp.Describe(ls_Objects[lj]+".x"))>=li_x AND &
  1591. (Long(lds_Temp.Describe(ls_Objects[lj]+".x"))+Long(lds_Temp.Describe(ls_Objects[lj]+".Width")))<=li_x2 Then
  1592. idw_Requestor.Modify(ls_Objects[lj]+".visible='0' ")
  1593. li_Row=ids_Objects.Find("reportname='' AND name='"+ls_Objects[lj]+"'",1,ids_Objects.RowCount())
  1594. IF li_Row>0 Then
  1595. ids_Objects.DeleteRow(li_Row)
  1596. END IF
  1597. END IF
  1598. END IF
  1599. Next
  1600. END IF
  1601. Continue
  1602. END IF
  1603. ls_ColType=idw_Requestor.Describe(ls_Objects[li]+".ColType")
  1604. IF ls_ColType="?" OR ls_ColType="!" Then
  1605. ls_ColType="S" //当文本进行处理
  1606. ELSE
  1607. IF Left(ls_ColType,4)="char" Then
  1608. ls_ColType="S"
  1609. ELSEIF ls_ColType="datetime" Then
  1610. ls_ColType='DT'
  1611. ELSEIF ls_ColType='date' Then
  1612. ls_ColType='D'
  1613. ELSEIF ls_ColType='time' Then
  1614. ls_ColType='T'
  1615. ELSE
  1616. ls_ColType='N'
  1617. END IF
  1618. END IF
  1619. li_Row=ids_Objects.InsertRow(0)
  1620. ids_Objects.Object.ReportName[li_Row]=''
  1621. ids_Objects.Object.Name[li_Row]=ls_Objects[li]
  1622. ids_Objects.Object.Band[li_Row]=ls_Band
  1623. ids_Objects.Object.Stype[li_Row]=ls_Type
  1624. ids_Objects.Object.Coltype[li_Row]=ls_ColType
  1625. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".x")
  1626. OF_Check_Property(ls_Format,ls_Exp)
  1627. IF ls_Exp<>"" Then
  1628. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1629. END IF
  1630. ids_Objects.Object.X[li_Row]=Long(ls_Format)
  1631. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Y")
  1632. OF_Check_Property(ls_Format,ls_Exp)
  1633. IF ls_Exp<>"" Then
  1634. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1635. END IF
  1636. ids_Objects.Object.Y[li_Row]=Long(ls_Format)
  1637. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Width")
  1638. OF_Check_Property(ls_Format,ls_Exp)
  1639. IF ls_Exp<>"" Then
  1640. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1641. END IF
  1642. ids_Objects.Object.Width[li_Row]=Long(ls_Format)
  1643. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Height")
  1644. OF_Check_Property(ls_Format,ls_Exp)
  1645. IF ls_Exp<>"" Then
  1646. ls_Format=OF_Evaluate(ls_Exp,idw_Requestor.GetRow())
  1647. END IF
  1648. ids_Objects.Object.Height[li_Row]=Long(ls_Format)
  1649. //如果对象的位置在报表上是看不见的,则不处理该对象 2004-11-15
  1650. IF ids_Objects.Object.x2[li_Row]<=0 OR ids_Objects.Object.Y2[li_Row]<=0 Then
  1651. ids_Objects.DeleteRow(li_Row)
  1652. Continue
  1653. END IF
  1654. ids_Objects.Object.Visible[li_Row]=ls_Visible
  1655. ids_Objects.Object.VisibleExp[li_Row]=ls_VisibleExp
  1656. IF ls_Objects[li]<>"report_title" Then
  1657. IF Trim(idw_Requestor.Describe(ls_Objects[li]+".Tag"))<>"0" Then //2004-12-2 某些对象虽然有边框,但输出会影响表格的输出效果
  1658. ids_Objects.Object.Border[li_Row]=idw_Requestor.Describe(ls_Objects[li]+".Border")
  1659. END IF
  1660. END IF
  1661. //判断对象是否只是用于设置单元的边框,而没有任何内容 2004-11-15
  1662. IF ls_Type<>"text" AND ls_Type<>"column" AND ls_Type<>"compute" Then
  1663. ids_Objects.Object.isBorderOnly[li_Row]='1'
  1664. ids_Objects.Object.Border[li_Row]='2'
  1665. Continue
  1666. ELSE
  1667. IF ls_Type="text" Then
  1668. IF idw_Requestor.Describe(ls_objects[li]+".Text")="" Then
  1669. IF idw_Requestor.Describe(ls_objects[li]+".Border")="2" AND idw_Requestor.Describe(ls_objects[li]+".Tag")<>"0" Then //2004-12-2 如果Tag设置为0,则忽略该对象
  1670. ids_Objects.Object.isBorderOnly[li_Row]='1'
  1671. ids_Objects.Object.Border[li_Row]='2'
  1672. Continue
  1673. ELSE
  1674. //忽略该文本对象
  1675. ids_Objects.DeleteRow(li_Row)
  1676. Continue
  1677. END IF
  1678. END IF
  1679. END IF
  1680. END IF
  1681. //如果定义了EditMask 2004-10-29
  1682. ls_Format = Trim(idw_Requestor.Describe(ls_Objects[li]+".EditMask.Mask"))
  1683. ls_Exp=""
  1684. IF ls_Format="!" OR ls_Format="?" OR ls_Format="" Then
  1685. ls_Format=Trim(idw_Requestor.Describe(ls_Objects[li]+".Format"))
  1686. OF_Get_Format(ls_Format,ls_Exp,ls_ColType)
  1687. END IF
  1688. ids_Objects.Object.Format[li_Row]= ls_Format
  1689. ids_Objects.Object.FormatExp[li_Row]=ls_Exp
  1690. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Color")
  1691. //if ls_objects[li]='item_name' then
  1692. //messagebox('a',ls_format)
  1693. //end if
  1694. OF_Check_Property(ls_Format,ls_Exp)
  1695. //if ls_objects[li]='item_name' then
  1696. //messagebox('a',ls_format+" "+ls_exp)
  1697. //end if
  1698. ids_Objects.Object.FontColorExp[li_Row]= ls_Exp
  1699. IF ls_Exp="" Then
  1700. li_Color= invo_colors.of_get_Color(long(ls_Format))
  1701. ids_Objects.Object.FontColor[li_Row]=invo_colors.of_get_custom_color_index(li_color )
  1702. END IF
  1703. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".background.Color")
  1704. OF_Check_Property(ls_Format,ls_Exp)
  1705. ids_Objects.Object.bgColorExp[li_Row]= ls_Exp
  1706. IF ls_Exp="" Then
  1707. li_color=invo_Colors.OF_Get_Color(Long(ls_Format))
  1708. IF li_color = 0 Then
  1709. li_color = 65
  1710. ELSE
  1711. li_color = invo_colors.of_get_custom_color_index( li_color )
  1712. END IF
  1713. ids_Objects.Object.bgColor[li_Row]=li_color
  1714. END IF
  1715. ls_Format= idw_Requestor.Describe(ls_Objects[li]+".Font.Weight")
  1716. OF_Check_Property(ls_Format,ls_Exp)
  1717. ids_Objects.Object.FontWeight[li_Row]=Long(ls_Format)
  1718. ids_Objects.Object.FontWeightExp[li_Row]= ls_Exp
  1719. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".Font.Height")
  1720. OF_Check_Property(ls_Format,ls_Exp)
  1721. ids_Objects.Object.FontSize[li_Row]=ABS(Long(ls_Format))
  1722. ids_Objects.Object.FontSizeExp[li_Row]= ls_Exp
  1723. IF ids_Objects.Object.FontSize[li_Row]<=0 Then
  1724. ids_Objects.Object.FontSize[li_Row]=9
  1725. END IF
  1726. ls_Format=idw_Requestor.Describe(ls_Objects[li]+".font.italic")
  1727. OF_Check_Property(ls_Format,ls_Exp)
  1728. ids_Objects.Object.FontItalic[li_Row]=Long(ls_Format)
  1729. ids_Objects.Object.FontItalicExp[li_Row]=ls_Exp
  1730. ls_Format = idw_Requestor.Describe(ls_Objects[li]+".font.face")
  1731. OF_Check_Property(ls_Format,ls_Exp)
  1732. ids_Objects.Object.FontName[li_Row]=ls_Format
  1733. ids_Objects.Object.FontNameExp[li_Row]= ls_Exp
  1734. ls_Format= idw_Requestor.Describe(ls_Objects[li]+".Alignment")
  1735. OF_Check_Property(ls_Format,ls_Exp)
  1736. ids_Objects.Object.AlignmentExp[li_Row]=ls_Exp
  1737. Choose Case ls_Format //左对齐
  1738. Case "1" //右对齐
  1739. ids_Objects.Object.Alignment[li_Row]=3
  1740. Case "2" //中对齐
  1741. ids_Objects.Object.Alignment[li_Row]=2
  1742. Case Else //均匀对齐,调整为左对齐
  1743. ids_Objects.Object.Alignment[li_Row]=1
  1744. END CHOOSE
  1745. ls_format = idw_Requestor.Describe(ls_Objects[li]+".Edit.Style")
  1746. IF ls_Format="dddw" OR ls_Format="ddlb" OR idw_Requestor.Describe(ls_Objects[li]+".Edit.CodeTable")='yes' Then
  1747. ids_Objects.Object.Displayvalue[li_Row]='1'
  1748. //判断当然对象是数据窗口的原始列对象,还是列对象的一个拷贝,如果是列对象的拷贝,用LoopupDisplay函数时,会出错
  1749. //2004-10-29
  1750. //IF idw_Requestor.Describe("#"+idw_Requestor.Describe(ls_Objects[li]+".ID")+".Name")= ls_Objects[li] Then
  1751. //2005-1-2
  1752. IF Right(idw_Requestor.Describe(ls_Objects[li]+".dbname"),Len(ls_Objects[li]))=ls_Objects[li] Then
  1753. ids_Objects.Object.ColumnFlag[li_Row]='1'
  1754. ELSE
  1755. ids_Objects.Object.ColumnFlag[li_Row]='0'
  1756. END IF
  1757. ELSE
  1758. ids_Objects.Object.Displayvalue[li_Row]='0'
  1759. END IF
  1760. //设置缺省的RowInDetail的值
  1761. ids_Objects.Object.RowInDetail[li_Row]=1
  1762. //判断对象文本是否自动换行
  1763. IF ls_ColType='S' Then
  1764. ids_Objects.Object.WrapText[li_Row] = OF_IsWrapText( ids_Objects.Object.FontName [li_Row], &
  1765. ids_Objects.Object.FontSize [li_Row] , &
  1766. ids_Objects.Object.FontWeight[li_Row] , &
  1767. ids_Objects.Object.Height [li_Row])
  1768. END IF
  1769. //判断对象的各位属性是否有表达式,目的是提高导出的速度 2004-11-15
  1770. IF ls_Band="detail" OR Pos(ls_Band,".")>0 Then
  1771. IF ids_Objects.Object.VisibleExp[li_Row]="" AND ids_Objects.Object.FormatExp[li_Row]="" AND &
  1772. ids_Objects.Object.FontNameExp[li_Row]="" AND ids_Objects.Object.FontWeightExp[li_Row]="" AND &
  1773. ids_Objects.Object.FontColorExp[li_Row]="" AND ids_Objects.Object.FontItalicExp[li_Row]="" AND &
  1774. ids_Objects.Object.AlignmentExp[li_Row]="" AND ids_Objects.Object.bgColorExp[li_Row]="" Then
  1775. ids_Objects.Object.ExpFlag[li_Row]='0'
  1776. ELSE
  1777. ids_Objects.Object.ExpFlag[li_Row]='1'
  1778. END IF
  1779. ELSE
  1780. ids_Objects.Object.ExpFlag[li_Row]='1'
  1781. END IF
  1782. //2004-11-28 增加对象slipup属性的支持
  1783. IF idw_Requestor.Describe(ls_Objects[li]+".SlipUp")='no' Then
  1784. ids_Objects.Object.Slipup[li_Row]='0'
  1785. ELSE
  1786. ids_Objects.Object.Slipup[li_Row]='1'
  1787. END IF
  1788. ids_Objects.Object.AboveRows[li_Row]= 0
  1789. Next
  1790. //如果数据窗口是N-UP类型,需要作以下处理
  1791. IF Long(idw_Requestor.Describe("datawindow.rows_per_detail"))>1 Then
  1792. //虽然Column对象的Attributes属性里面包括为Row_In_Detail,但Describe无法读出来,所以需要通过分析语法或获得
  1793. ls_Type=idw_Requestor.Describe("datawindow.syntax")
  1794. li=Pos(ls_Type,"column(")
  1795. Do While li>0
  1796. lj=Pos(ls_Type,"column(",li+5)
  1797. IF lj=0 Then
  1798. li_Count=1024
  1799. ELSE
  1800. li_Count=lj - li -1
  1801. END IF
  1802. //读出该Column对象的语法
  1803. ls_Band=Mid(ls_Type,li,li_Count)
  1804. //取得对象名称
  1805. li=Pos(ls_Band,"name=")+Len("name=")
  1806. li_Count=Pos(ls_Band," ",li+1) -li
  1807. ls_Name=Mid(ls_Band,li,li_Count)
  1808. li_Row=ids_Objects.Find("reportname='' AND Name='"+ls_Name+"' ",1,ids_Objects.RowCount())
  1809. IF li_Row>0 Then
  1810. li=Pos(ls_Band,"row_in_detail=")+Len("row_in_detail=")
  1811. li_Count=Pos(ls_Band," ",li+1) -li
  1812. lk=Long(Mid(ls_Band,li,li_Count) ) //取得Row_In_Detail的值
  1813. IF lk>0 Then
  1814. ids_Objects.Object.RowInDetail[li_Row]=lk
  1815. END IF
  1816. else
  1817. END IF
  1818. li=lj
  1819. Loop
  1820. ls_Type=""
  1821. ls_Band=""
  1822. END IF
  1823. //如果报表是一个表格,检查表格的信息
  1824. OF_GridInfo("",ls_Bands)
  1825. //取得列信息
  1826. OF_GetColumnInfo()
  1827. //判断对象的那个单元输出
  1828. OF_ColRowInfo()
  1829. //取得行高
  1830. OF_GetRowHeight()
  1831. IF ib_MergeColumnHeader Then
  1832. IF Trim(is_BeginRowObj)<>"" Then
  1833. li=ids_Objects.Find("reportName='' AND name='"+Trim(Lower(is_BeginRowObj))+"'",1,ids_Objects.RowCount())
  1834. IF li>0 Then
  1835. li_BeginRow=ids_Objects.Object.StartRow[li]
  1836. END IF
  1837. END IF
  1838. IF li_BeginRow=0 Then
  1839. ids_Objects.SetFilter("reportName='' AND band='header' AND Right(name,2)='_t' ")
  1840. ids_Objects.Filter()
  1841. li_BeginRow=Long(ids_Objects.Describe("Evaluate('Min(StartRow)',1)"))
  1842. END IF
  1843. IF li_BeginRow>0 Then
  1844. ids_Objects.SetFilter("reportName='' AND band='header' AND StartRow>="+String(li_BeginRow))
  1845. ids_Objects.Filter()
  1846. ids_Objects.SetSort(" X A ,Y A ,X2 A ")
  1847. ids_Objects.Sort()
  1848. li_EndRow=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',1)"))
  1849. For li_Row=1 To ids_Objects.RowCount()
  1850. IF ids_Objects.Object.StartRow[li_Row]>li_BeginRow Then
  1851. IF li_Row=1 Then
  1852. ids_Objects.Object.StartRow[li_Row]=li_BeginRow
  1853. ELSE
  1854. lj=ids_Objects.Find("endrow<"+String(ids_Objects.Object.StartRow[li_Row])+" AND x<="+String(ids_Objects.Object.x2[li_Row])+" AND x2>="+String(ids_Objects.Object.x[li_Row]),ids_Objects.RowCount() ,1)
  1855. IF lj>1 Then
  1856. ids_Objects.Object.StartRow[li_Row]=ids_Objects.Object.EndRow[lj]+1
  1857. ELSE
  1858. ids_Objects.Object.StartRow[li_Row]=li_BeginRow
  1859. END IF
  1860. END IF
  1861. END IF
  1862. IF ids_Objects.Object.EndRow[li_Row]<li_EndRow Then
  1863. IF li_Row=ids_Objects.RowCount() Then
  1864. ids_Objects.Object.EndRow[li_Row]=li_EndRow
  1865. ELSE
  1866. lj=ids_Objects.Find("startrow>"+String(ids_Objects.Object.EndRow[li_Row])+" AND x<="+String(ids_Objects.Object.x2[li_Row])+" AND x2>="+String(ids_Objects.Object.x[li_Row]),1 ,ids_Objects.RowCount())
  1867. IF lj>1 Then
  1868. ids_Objects.Object.EndRow[li_Row]=ids_Objects.Object.StartRow[lj] -1
  1869. ELSE
  1870. ids_Objects.Object.EndRow[li_Row]=li_EndRow
  1871. END IF
  1872. END IF
  1873. END IF
  1874. IF ids_Objects.Object.EndRow[li_Row]<ids_Objects.Object.StartRow[li_Row] Then
  1875. ids_Objects.Object.EndRow[li_Row]=ids_Objects.Object.StartRow[li_Row]
  1876. END IF
  1877. Next
  1878. IF li_BeginRow>0 Then //ii_BorderBeginRow=0 AND
  1879. ii_BorderBeginRow=li_BeginRow
  1880. END IF
  1881. END IF
  1882. END IF
  1883. ls_Type=idw_Requestor.Describe("datawindow.sparse")
  1884. IF ls_Type<>"" Then
  1885. li_Count=OF_ParseToArray(ls_Type,"~t",ls_Objects)
  1886. For li=1 To li_Count
  1887. li_Row=ids_Column.Find("reportName='' AND name='"+ls_Objects[li]+"'",1,ids_Column.RowCount())
  1888. IF li_Row>0 Then
  1889. ids_Column.Object.Sparse[li_Row]="1"
  1890. END IF
  1891. Next
  1892. ib_SparseFlag=True
  1893. END IF
  1894. IF ii_BorderBeginRow>0 Then
  1895. li=ids_Objects.Find("reportName='' AND name='report_title'",1,ids_objects.rowcount())
  1896. if li>0 then
  1897. if ids_objects.object.endrow[li]>=ii_BorderBeginRow then
  1898. ii_BorderBeginRow=ids_objects.object.endrow[li]+1
  1899. end if
  1900. end if
  1901. end if
  1902. IF IsValid(ids_ReportObj) Then
  1903. ids_ReportObj.SetSort(" y A ,X A ")
  1904. ids_ReportObj.Sort()
  1905. For li=1 To ids_ReportObj.RowCount()
  1906. //2001-11-28
  1907. // IF li>1 Then
  1908. // IF ids_ReportObj.Object.Y[li]>=ids_ReportObj.Object.Y2[li -1] Then
  1909. // ids_ReportObj.Object.StartRow[li]= -1 //表示从上一报表开始
  1910. // Continue
  1911. // END IF
  1912. // END IF
  1913. ids_Objects.SetFilter("reportname='' AND y2<="+idw_Requestor.Describe(ids_Reportobj.Object.Name[li]+".y"))
  1914. ids_Objects.Filter()
  1915. li_Row=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',0)"))
  1916. ids_ReportObj.Object.StartRow[li]=li_Row+1
  1917. Next
  1918. END IF
  1919. ids_Objects.SetFilter("reportname<>''")
  1920. ids_Objects.Filter()
  1921. IF ids_Objects.RowCount()>0 Then
  1922. IF Not IsValid(ids_dwcObjects) Then
  1923. ids_dwcObjects=Create Datastore
  1924. ids_dwcObjects.DataObject=ids_Objects.DataObject
  1925. END IF
  1926. ids_Objects.RowsMove(1,ids_Objects.RowCount(),Primary!,ids_dwcObjects,1,Primary!)
  1927. END IF
  1928. //ids_Objects.SetFilter("")
  1929. //ids_Objects.Filter()
  1930. ids_Line.SetFilter("")
  1931. ids_Line.Filter()
  1932. IF ids_Line.RowCount()=0 Then
  1933. Destroy ids_Line
  1934. END IF
  1935. IF ls_Processing="4" OR ls_Processing="1" Then
  1936. ib_GridBorder=True
  1937. END IF
  1938. Destroy lds_Temp
  1939. //openwithparm(w3,ids_Objects)
  1940. end subroutine
  1941. protected function integer of_getobjects (string as_objname);String ls_Type,ls_Band
  1942. String ls_OldBand ,ls_Expression
  1943. String ls_Name
  1944. String ls_Objects[]
  1945. String ls_Processing
  1946. String ls_Format,ls_ColType
  1947. int li,lj, lk,li_Row,li_Col, li_count
  1948. Long li_x,li_Y,li_x2, li_Height
  1949. Long li_x1,li_Y1 ,li_Width1
  1950. Int li_ColCount
  1951. Boolean lb_ForeGroundFlag
  1952. String ls_Bands[]
  1953. String ls_Exp
  1954. String ls_Visible ,ls_VisibleExp
  1955. uLong li_Color
  1956. Datastore lds, lds_Temp
  1957. lds=Create DataStore
  1958. lds.DataObject=idw_Requestor.Describe(as_ObjName+".DataObject ")
  1959. IF lds.Describe("datawindow.units")<>is_units Then
  1960. MessageBox("提示","当前报表的子数据窗口或嵌套数据窗口的计量单位不一致!~r~n~r~n"+ &
  1961. "对象名称::"+as_objname+"~r~n"+ &
  1962. "报表的计量类型:"+is_Units+"~r~n"+ &
  1963. "对象的计量类型:"+lds.Describe("datawindow.units"), Information!, OK! )
  1964. Return -1
  1965. END IF
  1966. ls_Type=lds.Describe("datawindow.objects")
  1967. li_Count=OF_ParseToArray(ls_Type,"~t",ls_Objects)
  1968. lds_Temp=Create DataStore
  1969. lds_Temp.DataObject=lds.DataObject
  1970. ls_Processing=lds.Describe("datawindow.processing")
  1971. IF ls_Processing<>"1" and ls_Processing<>"0" and ls_Processing<>"4" Then
  1972. Return -1
  1973. END IF
  1974. li_x1=Long(idw_Requestor.Describe(as_ObjName+".x"))
  1975. li_y1=Long(idw_Requestor.Describe(as_ObjName+".Y"))
  1976. li_Width1=Long(idw_Requestor.Describe(as_ObjName+".Width"))
  1977. ////带区信息
  1978. li_Count=OF_ParseToArray(lds.Describe("datawindow.bands"),"~t",ls_Bands)
  1979. For li=1 TO li_Count
  1980. li_Row = ids_Bands.InsertRow(0)
  1981. ids_Bands.Object.Reportname[li_Row]=as_objname
  1982. ids_Bands.Object.Band[li_Row]= ls_bands[li]
  1983. ids_Bands.Object.Band[li_Row]= ls_bands[li]
  1984. ids_Bands.Object.OldBand[li_Row]= ls_bands[li]
  1985. lj=Pos(ls_bands[li],"[")
  1986. IF lj>0 Then
  1987. ids_Bands.Object.Band[li_Row]= Left(ls_bands[li],lj -1)
  1988. END IF
  1989. ls_format= lds.Describe("datawindow."+ls_bands[li]+".color")
  1990. of_check_property(ls_format,ls_exp)
  1991. ids_Bands.Object.ColorExp[li_Row]=ls_Exp
  1992. if ls_exp="" then
  1993. li_Color=invo_colors.of_get_color(long(ls_format))
  1994. IF li_Color<>0 then
  1995. ids_Bands.Object.Color[li_row]=invo_colors.of_get_custom_color_index( li_Color )
  1996. else
  1997. ids_Bands.Object.Color[li_row]= 65
  1998. end if
  1999. END IF
  2000. //ids_Bands.Object.Height[li_Row]=Long(idw_Requestor.Describe("datawindow."+ls_Bands[li]+".height"))
  2001. //ids_Bands.Object.AutoHeight[li_Row]=idw_Requestor.Describe("datawindow."+ls_bands[li]+".height.autosize")
  2002. Next
  2003. ls_Type=lds.Describe("datawindow.objects")
  2004. li_Count=OF_ParseToArray(ls_Type,"~t",ls_Objects)
  2005. ls_Type=""
  2006. For li=1 To li_Count
  2007. IF ids_Objects.Find("ReportName='"+as_objname+"' AND Name='"+ls_Objects[li]+"'",1,li_Count)>0 Then
  2008. Continue
  2009. END IF
  2010. ls_Band=lds.Describe(ls_Objects[li]+".Band")
  2011. IF ls_Band="?" OR ls_Band="!" Then
  2012. Continue
  2013. END IF
  2014. ls_Type=lds.Describe(ls_Objects[li]+".Type")
  2015. ls_OldBand=ls_Band
  2016. IF ls_Band="foreground" OR ls_Band="background" Then
  2017. IF ls_Type<>'line' Then
  2018. ls_Format=lds.Describe(ls_Objects[li]+".Y")
  2019. ELSE
  2020. ls_Format=lds.Describe(ls_Objects[li]+".Y1")
  2021. END IF
  2022. OF_Check_Property(ls_Format,ls_Exp)
  2023. IF ls_Exp<>"" Then
  2024. ls_Format=OF_Evaluate(lds,ls_Exp,lds.GetRow())
  2025. END IF
  2026. li_Y=Long(ls_Format)
  2027. IF li_Y<=Long(lds.Describe("datawindow.header.height")) Then
  2028. ls_Band="header"
  2029. ELSE
  2030. //IF ls_Type<>"line" Then //不特别处理线条
  2031. // li_Row = UpperBound(istr_Foregroundobj)+1
  2032. // istr_Foregroundobj[li_Row].Name = ls_Objects[li]
  2033. // istr_Foregroundobj[li_Row].y = li_Y
  2034. //END IF
  2035. Continue
  2036. END IF
  2037. END IF
  2038. //如果带区的高度为0,不读入对象
  2039. li_Height=Long(lds.Describe("datawindow."+ls_band+".height"))
  2040. IF li_Height<=10 Then
  2041. COntinue
  2042. END IF
  2043. //如果对象的Y值大于带区高度,也不读入
  2044. IF ls_Type="line" Then
  2045. IF Long(lds.Describe(ls_Objects[li]+".Y1"))> li_Height Then
  2046. Continue
  2047. END IF
  2048. ELSE
  2049. IF Long(lds.Describe(ls_Objects[li]+".Y"))> li_Height Then
  2050. Continue
  2051. END IF
  2052. END IF
  2053. ls_Visible=Trim(lds.Describe(ls_Objects[li]+".Visible"))
  2054. OF_Check_Property(ls_Visible,ls_VisibleExp)
  2055. IF ls_Type="line" Then
  2056. //如果设置报表不是表格,则不处理线条 2004-11-15
  2057. IF Not ib_FormFlag Then
  2058. Continue
  2059. END IF
  2060. IF ls_Visible='0' OR ls_VisibleExp="0" Then
  2061. Continue
  2062. END IF
  2063. IF lds.Describe(ls_Objects[li]+".Tag")=is_LineTag Then
  2064. Continue
  2065. END IF
  2066. li_Row=ids_Line.InsertRow(0)
  2067. ids_Line.Object.ReportName[li_Row]=as_objname
  2068. ids_Line.Object.Name[li_Row]=ls_Objects[li]
  2069. ids_Line.Object.Band[li_Row]=ls_Band
  2070. ls_Format=lds.Describe(ls_Objects[li]+".x1")
  2071. OF_Check_Property(ls_Format,ls_Exp)
  2072. IF ls_Exp<>"" Then
  2073. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2074. END IF
  2075. ids_Line.Object.x1[li_Row]=Long(ls_Format)+li_X1
  2076. ls_Format=lds.Describe(ls_Objects[li]+".x2")
  2077. OF_Check_Property(ls_Format,ls_Exp)
  2078. IF ls_Exp<>"" Then
  2079. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2080. END IF
  2081. ids_Line.Object.x2[li_Row]=Long(ls_Format)+li_X1
  2082. ls_Format=lds.Describe(ls_Objects[li]+".Y1")
  2083. OF_Check_Property(ls_Format,ls_Exp)
  2084. IF ls_Exp<>"" Then
  2085. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2086. END IF
  2087. ids_Line.Object.Y1[li_Row]=Long(ls_Format)+li_Y1
  2088. ls_Format=lds.Describe(ls_Objects[li]+".Y2")
  2089. OF_Check_Property(ls_Format,ls_Exp)
  2090. IF ls_Exp<>"" Then
  2091. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2092. END IF
  2093. ids_Line.Object.Y2[li_Row]=Long(ls_Format)+li_Y1
  2094. ls_Format= lds.Describe(ls_Objects[li]+".Pen.Color")
  2095. OF_Check_Property(ls_Format,ls_Exp)
  2096. IF ls_Exp<>"" Then
  2097. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2098. END IF
  2099. ids_Line.Object.PenColor[li_Row]=invo_colors.of_get_custom_color_index( invo_colors.of_get_color(long(ls_format)) )
  2100. Choose Case lds.Describe(ls_Objects[li]+".pen.style")
  2101. Case "1"
  2102. ids_Line.Object.PenWidth[li_Row]=3
  2103. Case "2"
  2104. ids_Line.Object.PenWidth[li_Row]=4
  2105. Case Else
  2106. ids_Line.object.PenWidth[li_Row]=OF_Get_PenWidth(Long(lds.Describe(ls_Objects[li]+".Pen.Width")))
  2107. END Choose
  2108. Continue
  2109. END IF
  2110. ls_Format=lds.Describe(ls_Objects[li]+".x")
  2111. OF_Check_Property(ls_Format,ls_Exp)
  2112. IF ls_Exp<>"" Then
  2113. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2114. END IF
  2115. IF Long(ls_Format)>li_Width1 Then //+Long(lds.Describe(ls_Objects[li]+".Width"))
  2116. Continue
  2117. END IF
  2118. IF ls_Type<>"text" AND ls_Type<>"column" AND ls_Type<>"compute" AND lds.Describe(ls_objects[li]+".Border")<>"2" Then
  2119. Continue
  2120. END IF
  2121. //加入检查表达式是否有效
  2122. IF ls_Type="compute" Then
  2123. ls_Expression=lds.Describe(ls_Objects[li]+".Expression")
  2124. IF ls_Expression="?" OR ls_Expression="!" Then
  2125. Continue
  2126. END IF
  2127. END IF
  2128. IF ls_Objects[li]="sys_back" AND ls_OldBand="foreground" Then //报表标题的背景文本框
  2129. Continue
  2130. END IF
  2131. IF ls_Objects[li]="sys_lastcol" AND ls_OldBand="detail" Then //用于标识Grid形式报表的最后一列
  2132. Continue
  2133. END IF
  2134. //如果对象的Visible属性为False,不输出
  2135. IF ls_Visible='0' OR ls_VisibleExp="0" Then
  2136. //如果数据窗口是否表格,而且对象在细节区,则需要把该列的其它对象给屏蔽掉
  2137. IF ls_Processing="1" AND ls_Band="detail" Then
  2138. li_x=Long( lds_Temp.Describe(ls_Objects[li]+".x"))
  2139. li_x2=li_x+Long( lds_Temp.Describe(ls_Objects[li]+".width"))
  2140. For lj=1 To li_Count
  2141. IF lds.Describe(ls_Objects[lj]+".Band")<>"detail" Then
  2142. IF Long(lds_Temp.Describe(ls_Objects[lj]+".x"))>=li_x AND &
  2143. (Long(lds_Temp.Describe(ls_Objects[lj]+".x"))+Long(lds_Temp.Describe(ls_Objects[lj]+".Width")))<=li_x2 Then
  2144. lds.Modify(ls_Objects[lj]+".visible='0' ")
  2145. li_Row=ids_Objects.Find("reportname='"+as_objname+"' AND name='"+ls_Objects[lj]+"'",1,ids_Objects.RowCount())
  2146. IF li_Row>0 Then
  2147. ids_Objects.DeleteRow(li_Row)
  2148. END IF
  2149. END IF
  2150. END IF
  2151. Next
  2152. END IF
  2153. Continue
  2154. END IF
  2155. ls_ColType=lds.Describe(ls_Objects[li]+".ColType")
  2156. IF ls_ColType="?" OR ls_ColType="!" Then
  2157. ls_ColType="S" //当文本进行处理
  2158. ELSE
  2159. IF Left(ls_ColType,4)="char" Then
  2160. ls_ColType="S"
  2161. ELSEIF ls_ColType="datetime" Then
  2162. ls_ColType='DT'
  2163. ELSEIF ls_ColType='date' Then
  2164. ls_ColType='D'
  2165. ELSEIF ls_ColType='time' Then
  2166. ls_ColType='T'
  2167. ELSE
  2168. ls_ColType='N'
  2169. END IF
  2170. END IF
  2171. li_Row=ids_Objects.InsertRow(0)
  2172. ids_Objects.Object.ReportName[li_Row]=as_objname
  2173. ids_Objects.Object.Name[li_Row]=ls_Objects[li]
  2174. ids_Objects.Object.Band[li_Row]=ls_Band
  2175. ids_Objects.Object.Stype[li_Row]=ls_Type
  2176. ids_Objects.Object.Coltype[li_Row]=ls_ColType
  2177. //超出宽度不读入
  2178. ls_Format=lds.Describe(ls_Objects[li]+".x")
  2179. OF_Check_Property(ls_Format,ls_Exp)
  2180. IF ls_Exp<>"" Then
  2181. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2182. END IF
  2183. ids_Objects.Object.X[li_Row]=Long(ls_Format)
  2184. ls_Format=lds.Describe(ls_Objects[li]+".Y")
  2185. OF_Check_Property(ls_Format,ls_Exp)
  2186. IF ls_Exp<>"" Then
  2187. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2188. END IF
  2189. ids_Objects.Object.Y[li_Row]=Long(ls_Format) //+li_Y1
  2190. ls_Format=lds.Describe(ls_Objects[li]+".Width")
  2191. OF_Check_Property(ls_Format,ls_Exp)
  2192. IF ls_Exp<>"" Then
  2193. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2194. END IF
  2195. ids_Objects.Object.Width[li_Row]=Long(ls_Format)
  2196. //如果对象的位置在报表上是看不见的,则不处理该对象 2004-11-15
  2197. IF ids_Objects.Object.x2[li_Row]<=0 OR ids_Objects.Object.Y2[li_Row]<=0 Then
  2198. ids_Objects.DeleteRow(li_Row)
  2199. Continue
  2200. END IF
  2201. ids_Objects.Object.X[li_Row]=ids_Objects.Object.X[li_Row]+li_X1
  2202. ids_Objects.Object.Y[li_Row]=ids_Objects.Object.Y[li_Row] +li_Y1
  2203. //2004-11-11
  2204. if ids_Objects.Object.x2[li_Row]>(li_Width1+li_x1) Then
  2205. ids_Objects.Object.Width[li_Row]=( li_Width1+li_x1 ) - ids_Objects.Object.x[li_Row]
  2206. END IF
  2207. ls_Format=lds.Describe(ls_Objects[li]+".Height")
  2208. OF_Check_Property(ls_Format,ls_Exp)
  2209. IF ls_Exp<>"" Then
  2210. ls_Format=OF_Evaluate(lds,ls_Exp,idw_Requestor.GetRow())
  2211. END IF
  2212. ids_Objects.Object.Height[li_Row]=Long(ls_Format)
  2213. ids_Objects.Object.Visible[li_Row]=ls_Visible
  2214. ids_Objects.Object.VisibleExp[li_Row]=ls_VisibleExp
  2215. IF ls_Objects[li]<>"report_title" Then
  2216. IF Trim(lds.Describe(ls_Objects[li]+".Tag"))<>"0" Then
  2217. ids_Objects.Object.Border[li_Row]=lds.Describe(ls_Objects[li]+".Border")
  2218. END IF
  2219. END IF
  2220. //判断对象是否只是用于设置单元的边框,而没有任何内容 2004-11-15
  2221. IF ls_Type<>"text" AND ls_Type<>"column" AND ls_Type<>"compute" Then
  2222. ids_Objects.Object.isBorderOnly[li_Row]='1'
  2223. ids_Objects.Object.Border[li_Row]='2'
  2224. Continue
  2225. ELSE
  2226. IF ls_Type="text" Then
  2227. IF lds.Describe(ls_objects[li]+".Text")="" Then
  2228. IF lds.Describe(ls_objects[li]+".Border")="2" AND Trim(lds.Describe(ls_objects[li]+".Tag"))<>"0" Then
  2229. ids_Objects.Object.isBorderOnly[li_Row]='1'
  2230. ids_Objects.Object.Border[li_Row]='2'
  2231. Continue
  2232. ELSE
  2233. //忽略该文本对象
  2234. ids_Objects.DeleteRow(li_Row)
  2235. Continue
  2236. END IF
  2237. END IF
  2238. END IF
  2239. END IF
  2240. ls_Format=Trim(lds.Describe(ls_Objects[li]+".Format"))
  2241. OF_Get_Format(ls_Format,ls_Exp,ls_ColType)
  2242. ids_Objects.Object.Format[li_Row]= ls_Format
  2243. ids_Objects.Object.FormatExp[li_Row]=ls_Exp
  2244. ls_Format=lds.Describe(ls_Objects[li]+".Color")
  2245. OF_Check_Property(ls_Format,ls_Exp)
  2246. ids_Objects.Object.FontColorExp[li_Row]= ls_Exp
  2247. IF ls_Exp="" Then
  2248. li_Color= invo_colors.of_get_Color(long(ls_Format))
  2249. ids_Objects.Object.FontColor[li_Row]=invo_colors.of_get_custom_color_index(li_color )
  2250. END IF
  2251. ls_Format=lds.Describe(ls_Objects[li]+".background.Color")
  2252. OF_Check_Property(ls_Format,ls_Exp)
  2253. ids_Objects.Object.bgColorExp[li_Row]= ls_Exp
  2254. IF ls_Exp="" Then
  2255. li_color=invo_Colors.OF_Get_Color(Long(ls_Format))
  2256. IF li_color = 0 Then
  2257. li_color = 65
  2258. ELSE
  2259. li_color = invo_colors.of_get_custom_color_index( li_color )
  2260. END IF
  2261. ids_Objects.Object.bgColor[li_Row]=li_color
  2262. END IF
  2263. ls_Format= lds.Describe(ls_Objects[li]+".Font.Weight")
  2264. OF_Check_Property(ls_Format,ls_Exp)
  2265. ids_Objects.Object.FontWeight[li_Row]=Long(ls_Format)
  2266. ids_Objects.Object.FontWeightExp[li_Row]= ls_Exp
  2267. ls_Format=lds.Describe(ls_Objects[li]+".Font.Height")
  2268. OF_Check_Property(ls_Format,ls_Exp)
  2269. ids_Objects.Object.FontSize[li_Row]=ABS(Long(ls_Format))
  2270. ids_Objects.Object.FontSizeExp[li_Row]= ls_Exp
  2271. IF ids_Objects.Object.FontSize[li_Row]<=0 Then
  2272. ids_Objects.Object.FontSize[li_Row]=9
  2273. END IF
  2274. ls_Format=lds.Describe(ls_Objects[li]+".font.italic")
  2275. OF_Check_Property(ls_Format,ls_Exp)
  2276. ids_Objects.Object.FontItalic[li_Row]=Long(ls_Format)
  2277. ids_Objects.Object.FontItalicExp[li_Row]=ls_Exp
  2278. ls_Format = lds.Describe(ls_Objects[li]+".font.face")
  2279. OF_Check_Property(ls_Format,ls_Exp)
  2280. ids_Objects.Object.FontName[li_Row]=ls_Format
  2281. ids_Objects.Object.FontNameExp[li_Row]= ls_Exp
  2282. ls_Format= lds.Describe(ls_Objects[li]+".Alignment")
  2283. OF_Check_Property(ls_Format,ls_Exp)
  2284. ids_Objects.Object.AlignmentExp[li_Row]=ls_Exp
  2285. Choose Case ls_Format //左对齐
  2286. Case "1" //右对齐
  2287. ids_Objects.Object.Alignment[li_Row]=3
  2288. Case "2" //中对齐
  2289. ids_Objects.Object.Alignment[li_Row]=2
  2290. Case Else //均匀对齐,调整为左对齐
  2291. ids_Objects.Object.Alignment[li_Row]=1
  2292. END CHOOSE
  2293. ls_format = lds.Describe(ls_Objects[li]+".Edit.Style")
  2294. IF ls_Format="dddw" OR ls_Format="ddlb" OR lds.Describe(ls_Objects[li]+".Edit.CodeTable")='yes' Then
  2295. ids_Objects.Object.Displayvalue[li_Row]='1'
  2296. //判断当然对象是数据窗口的原始列对象,还是列对象的一个拷贝,如果是列对象的拷贝,用LoopupDisplay函数时,会出错
  2297. //2004-10-29
  2298. //IF lds.Describe("#"+lds.Describe(ls_Objects[li]+".ID")+".Name")= ls_Objects[li] Then
  2299. //2005-1-2
  2300. IF Right(lds.Describe(ls_Objects[li]+".dbname"),Len(ls_Objects[li]))=ls_Objects[li] Then
  2301. ids_Objects.Object.ColumnFlag[li_Row]='1'
  2302. ELSE
  2303. ids_Objects.Object.ColumnFlag[li_Row]='0'
  2304. END IF
  2305. ELSE
  2306. ids_Objects.Object.Displayvalue[li_Row]='0'
  2307. END IF
  2308. //设置缺省的RowInDetail的值
  2309. ids_Objects.Object.RowInDetail[li_Row]=1
  2310. IF ls_ColType='S' Then
  2311. ids_Objects.Object.WrapText[li_Row] = OF_IsWrapText( ids_Objects.Object.FontName [li_Row], &
  2312. ids_Objects.Object.FontSize [li_Row] , &
  2313. ids_Objects.Object.FontWeight[li_Row] , &
  2314. ids_Objects.Object.Height [li_Row])
  2315. END IF
  2316. //判断对象的各位属性是否有表达式,目的是提高导出的速度 2004-11-15
  2317. IF ls_Band="detail" OR Pos(ls_Band,".")>0 Then
  2318. IF ids_Objects.Object.VisibleExp[li_Row]="" AND ids_Objects.Object.FormatExp[li_Row]="" AND &
  2319. ids_Objects.Object.FontNameExp[li_Row]="" AND ids_Objects.Object.FontWeightExp[li_Row]="" AND &
  2320. ids_Objects.Object.FontColorExp[li_Row]="" AND ids_Objects.Object.FontItalicExp[li_Row]="" AND &
  2321. ids_Objects.Object.AlignmentExp[li_Row]="" AND ids_Objects.Object.bgColorExp[li_Row]="" Then
  2322. ids_Objects.Object.ExpFlag[li_Row]='0'
  2323. ELSE
  2324. ids_Objects.Object.ExpFlag[li_Row]='1'
  2325. END IF
  2326. ELSE
  2327. ids_Objects.Object.ExpFlag[li_Row]='1'
  2328. END IF
  2329. //2004-11-28 增加对象slipup属性的支持
  2330. IF lds.Describe(ls_Objects[li]+".SlipUp")='no' Then
  2331. ids_Objects.Object.Slipup[li_Row]='0'
  2332. ELSE
  2333. ids_Objects.Object.Slipup[li_Row]='1'
  2334. END IF
  2335. ids_Objects.Object.AboveRows[li_Row]= 0
  2336. Next
  2337. //如果数据窗口是N-UP类型,需要作以下处理
  2338. IF Long(lds.Describe("datawindow.rows_per_detail"))>1 Then
  2339. //虽然Column对象的Attributes属性里面包括为Row_In_Detail,但Describe无法读出来,所以需要通过分析语法或获得
  2340. ls_Type=lds.Describe("datawindow.syntax")
  2341. li=Pos(ls_Type,"column(")
  2342. Do While li>0
  2343. lj=Pos(ls_Type,"column(",li+5)
  2344. IF lj=0 Then
  2345. li_Count=1024
  2346. ELSE
  2347. li_Count=lj - li -1
  2348. END IF
  2349. //读出该Column对象的语法
  2350. ls_Band=Mid(ls_Type,li,li_Count)
  2351. //取得对象名称
  2352. li=Pos(ls_Band,"name=")+Len("name=")
  2353. li_Count=Pos(ls_Band," ",li+1) -li
  2354. ls_Name=Mid(ls_Band,li,li_Count)
  2355. li_Row=ids_objects.Find("reportname='"+as_objname+"' AND Name='"+ls_Name+"' ",1,ids_Objects.RowCount())
  2356. IF li_Row>0 Then
  2357. li=Pos(ls_Band,"row_in_detail=")+Len("row_in_detail=")
  2358. li_Count=Pos(ls_Band," ",li+1) -li
  2359. lk=Long(Mid(ls_Band,li,li_Count) ) //取得Row_In_Detail的值
  2360. IF lk>0 Then
  2361. ids_objects.Object.RowInDetail[li_Row]=lk
  2362. END IF
  2363. else
  2364. END IF
  2365. li=lj
  2366. Loop
  2367. ls_Type=""
  2368. ls_Band=""
  2369. li_Row=ids_ReportObj.Find("name='"+as_objname+"'",1,ids_ReportObj.RowCount())
  2370. IF li_Row>0 Then
  2371. ids_ReportObj.Object.RowInDetail[li_Row]=Long(lds.Describe("datawindow.rows_per_detail"))
  2372. END IF
  2373. END IF
  2374. ls_Type=lds.Describe("datawindow.sparse")
  2375. IF ls_Type<>"" Then
  2376. li_Count=OF_ParseToArray(ls_Type,"~t",ls_Objects)
  2377. For li=1 To li_Count
  2378. li_Row=ids_Objects.Find("reportName='"+as_ObjName+"' AND name='"+ls_Objects[li]+"'",1,ids_Objects.RowCount())
  2379. IF li_Row>0 Then
  2380. ids_Objects.Object.Sparse[li_Row]="1"
  2381. END IF
  2382. Next
  2383. ib_SparseFlag=True
  2384. END IF
  2385. Return 1
  2386. end function
  2387. protected function string of_getobjspace (long al_width);
  2388. Integer li_Size, li_Len, li_Return, &
  2389. li_WM_GETFONT = 49 // hex 0x0031
  2390. ULong lul_Hdc, lul_Handle, lul_hFont
  2391. os_size lstr_Size
  2392. IF Not IsValid(invo_Cell ) Then Return ""
  2393. if IsNull(iw_Parent) Or Not IsValid (iw_Parent) then
  2394. OF_OpenUserObject()
  2395. end if
  2396. IF IsNull(iuo_Text) OR Not IsValid(iuo_Text) Then
  2397. OF_OpenUserObject()
  2398. END IF
  2399. iuo_Text.FaceName = invo_Cell.invo_format.is_font
  2400. iuo_Text.TextSize = invo_Cell.invo_format.ii_size
  2401. IF invo_Cell.invo_format.ii_bold=1 Then
  2402. iuo_Text.Weight =400
  2403. ELSE
  2404. iuo_Text.Weight = 700
  2405. END IF
  2406. lul_Handle = Handle(iuo_Text)
  2407. lul_Hdc = GetDC(lul_Handle)
  2408. // Get the font in use on the Static Text
  2409. lul_hFont = Send(lul_Handle, li_WM_GETFONT, 0, 0)
  2410. // Select it into the device context
  2411. SelectObject(lul_Hdc, lul_hFont)
  2412. // Get the size of the text.
  2413. IF GetTextExtentPoint32W(lul_Hdc, ' ', 1, lstr_Size ) Then
  2414. IF lstr_size.l_cx>0 Then
  2415. lstr_Size.l_cx=PixelsToUnits(lstr_Size.l_cx, XPixelsToUnits!)
  2416. li_Len=Truncate(al_width / lstr_Size.l_cx ,0 )
  2417. li_Len=li_Len - Ceiling(li_Len / 5 )
  2418. END IF
  2419. END IF
  2420. ReleaseDC(lul_Handle, lul_Hdc)
  2421. Return Space(li_Len)
  2422. return ""
  2423. end function
  2424. protected subroutine of_getrowheight ();Long li,lk
  2425. String ls_ReportName,ls_Band
  2426. String ls_Processing
  2427. String ls_Prior_Band
  2428. Long li_COunt
  2429. Int li_RowCount
  2430. Long li_Row,li_BeginRow,li_EndRow
  2431. Long li_BandRow
  2432. Long li_DetailRows
  2433. Long li_Row2
  2434. Long li_Height
  2435. Long li_Y,li_Y2
  2436. Datastore lds_Temp
  2437. Boolean lb_Border
  2438. IF Not IsValid(ids_RowHeight) THen
  2439. ids_RowHeight=Create DataStore
  2440. ids_RowHeight.DataObject="d_dw2xls_rowheight"
  2441. END IF
  2442. //取得行高
  2443. ids_Objects.SetFilter("")
  2444. ids_Objects.Filter()
  2445. ids_Objects.SetSort("ReportName A ,Band A, y A ")
  2446. ids_Objects.Sort()
  2447. ids_Line.SetFilter("")
  2448. ids_Line.Filter()
  2449. IF ids_Line.RowCount()>0 Then
  2450. lb_Border=True
  2451. ids_Line.SetSort("ReportName A ,Band A, Y1 A")
  2452. ids_Line.Sort()
  2453. END IF
  2454. lds_Temp=Create datastore
  2455. ls_Processing=idw_Requestor.Describe("datawindow.processing")
  2456. ids_RowHeight.SetSort("Row A")
  2457. li_Count=ids_Objects.RowCount()
  2458. //2004-11-27
  2459. IF isValid(ids_ReportObj) Then
  2460. ids_ReportObj.SetSort("Y A")
  2461. ids_ReportObj.Sort()
  2462. END IF
  2463. For li=1 TO li_Count
  2464. //2004-11-28
  2465. IF ids_Objects.Object.ReportName[li]<>ls_ReportName OR ids_Objects.Object.Band[li]<>ls_Band or ( ls_processing='4' and ls_band<>ls_prior_band) Then
  2466. IF ids_Objects.Object.ReportName[li]<>ls_ReportName OR ids_Objects.Object.Band[li]<>ls_Band Then
  2467. ls_ReportName=ids_Objects.Object.ReportName[li]
  2468. ls_Band=ids_Objects.Object.Band[li]
  2469. li_BandRow= 0
  2470. //2004-11-27
  2471. IF ids_Objects.Object.ReportName[li]="" Then
  2472. li_Y = 0
  2473. ELSE
  2474. li_Y=Long(idw_Requestor.Describe(ids_Objects.Object.ReportName[li]+".Y"))
  2475. END IF
  2476. END IF
  2477. IF ls_Processing='4'Then
  2478. li_Row2=ids_Bands.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND OldBand='"+idw_Requestor.Describe(ids_Objects.Object.name[li]+".band")+"' ",1,ids_Bands.RowCount())
  2479. ELSE
  2480. li_Row2=ids_Bands.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ls_Band +"' ",1,ids_Bands.RowCount())
  2481. END IF
  2482. IF li_Row2>0 Then
  2483. ids_Bands.Object.StartRow[li_Row2]= ids_Objects.Object.StartRow[li]
  2484. ids_Bands.Object.EndRow[li_Row2]= ids_Objects.Object.EndRow[li]
  2485. END IF
  2486. ELSE
  2487. IF li_Row2>0 Then
  2488. IF ids_Objects.Object.StartRow[li]< ids_Bands.Object.StartRow[li_Row2] Then
  2489. ids_Bands.Object.StartRow[li_Row2]= ids_Objects.Object.StartRow[li]
  2490. END IF
  2491. IF ids_Objects.Object.EndRow[li] > ids_Bands.Object.EndRow[li_Row2] Then
  2492. ids_Bands.Object.EndRow[li_Row2]= ids_Objects.Object.EndRow[li]
  2493. END IF
  2494. END IF
  2495. IF ids_Objects.Object.StartRow[li]=li_BandRow Then
  2496. Continue
  2497. END IF
  2498. END IF
  2499. IF ids_Objects.Object.IsReport[li]='1' THEN
  2500. li_Y = ids_Objects.Object.Y2[li]
  2501. //li_y2=ids_Objects.Object.Y2[li]
  2502. Continue
  2503. END IF
  2504. IF ids_Objects.Object.StartRow[li]=ids_Objects.Object.EndRow[li] Then
  2505. li_Row=ids_RowHeight.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND Row="+String(ids_Objects.Object.StartRow[li]),1,ids_RowHeight.RowCount())
  2506. IF li_Row<=0 Then
  2507. lk=ids_RowHeight.InsertRow(0)
  2508. ids_RowHeight.Object.ReportName[lk]=ids_Objects.Object.ReportName[li]
  2509. ids_RowHeight.Object.Band[lk]=ids_Objects.Object.Band[li]
  2510. ids_RowHeight.Object.Row[lk]=ids_Objects.Object.StartRow[li]
  2511. //2004-11-28
  2512. ids_RowHeight.Object.AboveRows[lk]=0
  2513. ids_RowHeight.Object.Y[lk] = ids_Objects.Object.Y[li]
  2514. //用于设置缺省行高 2004-11-11
  2515. IF ids_Objects.Object.Band[li]="detail" Then
  2516. IF ids_Objects.Object.StartRow[li]>li_DetailRows Then
  2517. li_DetailRows = Ids_Objects.Object.StartRow[li]
  2518. END IF
  2519. END IF
  2520. li_Row=ids_Objects.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND Y>"+String(ids_Objects.Object.Y2[li] - ii_RowSpace),li+1,ids_Objects.RowCount())
  2521. IF li_Row>0 Then
  2522. li_Y2= ids_Objects.Object.Y[li_Row] //- ( ids_Objects.Object.Y[li_Row] - ids_Objects.Object.Y2[li] )/2
  2523. ELSE
  2524. IF ls_Processing='4' AND ls_Band="header" Then
  2525. IF idw_Requestor.Describe(ids_Objects.Object.Name[li]+".band")<>ls_prior_band Then
  2526. li_Y=0
  2527. ls_prior_band= idw_Requestor.Describe(ids_Objects.Object.Name[li]+".band")
  2528. END IF
  2529. li_Y2= Long(idw_Requestor.Describe("datawindow."+ls_prior_band+".Height"))
  2530. ELSE
  2531. IF ids_Objects.Object.ReportName[li]="" Then
  2532. //下面有没子数据窗口象 2004-11-27
  2533. li_Row=0
  2534. IF IsValid(ids_ReportObj) Then
  2535. li_Row= ids_ReportObj.Find("Band='"+ls_Band+"' AND Y>"+String(ids_Objects.Object.Y[li]),1,ids_ReportObj.RowCount())
  2536. END IF
  2537. IF li_Row>0 Then
  2538. li_Y2= ids_ReportObj.Object.Y[li_Row]
  2539. ELSE
  2540. li_Y2= Long(idw_Requestor.Describe("datawindow."+ls_Band+".Height"))
  2541. END IF
  2542. ELSE
  2543. lds_Temp.DataObject=idw_Requestor.Describe(ids_Objects.Object.ReportName[li]+".dataobject")
  2544. li_Y2= Long(lds_Temp.Describe("datawindow."+ls_Band+".Height"))+Long(idw_Requestor.Describe(ids_Objects.Object.ReportName[li]+".Y")) // 2004-11-28
  2545. END IF
  2546. END IF
  2547. END IF
  2548. ids_RowHeight.Object.Height[lk]= li_Y2 - li_Y
  2549. li_Height=0
  2550. IF lb_Border Then
  2551. //上边线 ,如果没有上边线,而且是第一行,则认为从0开始
  2552. IF ids_Objects.Object.StartRow[li]>1 Then
  2553. li_BeginRow=ids_Line.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND linetype='h' and startrow="+String(ids_Objects.Object.StartRow[li] -1 ),ids_Line.RowCount(),1)
  2554. ELSE
  2555. li_BeginRow=ids_Line.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND linetype='h' and startrow="+String(ids_Objects.Object.StartRow[li] ),1,ids_Line.RowCount())
  2556. END IF
  2557. IF li_BeginRow>0 Then
  2558. li_Y= ids_Line.Object.Y1[li_BeginRow]
  2559. ELSE
  2560. IF ids_Objects.Object.StartRow[li]=1 Then
  2561. li_Y=0
  2562. ELSE
  2563. li_Y= ids_Objects.Object.Y[li]
  2564. END IF
  2565. END IF
  2566. IF ids_Objects.Object.StartRow[li]>1 Then
  2567. li_EndRow=ids_Line.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND linetype='h' and startrow="+String(ids_Objects.Object.StartRow[li] ),1,ids_Line.RowCount())
  2568. ELSE
  2569. li_EndRow=ids_Line.Find("ReportName='"+ids_Objects.Object.ReportName[li]+"' AND Band='"+ids_Objects.Object.Band[li]+"' AND linetype='h' and startrow="+String(ids_Objects.Object.StartRow[li] ),ids_Line.RowCount(), 1)
  2570. END IF
  2571. IF li_EndRow>0 Then
  2572. li_Height=ids_Line.Object.Y1[li_EndRow] - li_Y
  2573. END IF
  2574. END IF
  2575. IF li_Height> 0 Then //ids_RowHeight.Object.Height[lk]
  2576. ids_RowHeight.Object.Height[lk]=li_Height
  2577. END IF
  2578. li_BandRow=ids_Objects.Object.StartRow[li]
  2579. li_Y=li_Y2
  2580. END IF
  2581. END IF
  2582. Next
  2583. For li=ids_RowHeight.RowCount() TO 1 Step -1
  2584. Choose Case is_Units
  2585. Case '0'
  2586. li_Height=ids_RowHeight.Object.Height[li]
  2587. Case '1'
  2588. li_Height=PixelsToUnits(ids_RowHeight.Object.Height[li],YPixelsToUnits!)
  2589. Case '2'
  2590. li_Height=PixelsToUnits(ids_RowHeight.Object.Height[li] * 96 / 1000 ,YPixelsToUnits!)
  2591. Case '3'
  2592. li_Height=PixelsToUnits(ids_RowHeight.Object.Height[li] * 37.8 / 1000,YPixelsToUnits!)
  2593. END CHOOSE
  2594. IF li_Height<60 Then
  2595. li_Height=60
  2596. END IF
  2597. ids_RowHeight.Object.Height[li]= li_Height/ 4.9 //如果字体是12,则除以5
  2598. IF ids_RowHeight.Object.Band[li]='detail' Then
  2599. IF li_DetailRows=1 AND lb_NestedFlag=False AND IsValid(ids_ReportObj)=False Then
  2600. invo_worksheet.of_set_default_rowheight( ids_RowHeight.Object.Height[li])
  2601. ids_RowHeight.DeleteRow(li)
  2602. END IF
  2603. END IF
  2604. Next
  2605. Destroy lds_Temp
  2606. //openwithparm(w3,ids_line)
  2607. end subroutine
  2608. protected function unsignedlong of_getsyscolor (unsignedlong al_pbcolor);
  2609. ULong ll_Index
  2610. IF al_PBColor=67108864 Then
  2611. ll_Index=15
  2612. ELSEIF al_PBColor=268435456 Then
  2613. ll_Index=12
  2614. ELSE
  2615. ll_Index=al_PBColor - 134217728
  2616. END IF
  2617. Return GetSysColor(ll_Index )
  2618. end function
  2619. protected function integer of_outdata (datastore a_ds, string as_reportname, long ai_currow, string as_band, long ai_row);/*-------------------------------------------------
  2620. 在EXCEL表中写入数据
  2621. ai_CurRow 数据要写入到EXCEL中的行号
  2622. as_band 要转出那个带区的对象
  2623. aai_CurRow 要转出的数据窗口中那个行的记录
  2624. 返回值: 在EXCEL中写入多少行数据
  2625. ----------------------------------------------------------------------*/
  2626. Long li_outlines
  2627. Long li_Height
  2628. String ls_Value, ls_Name,ls_Type
  2629. Int li,lj, lk, li_Count
  2630. Int li_Row
  2631. String ls_Format
  2632. String ls_Visible
  2633. Int li_StartRow,li_StartCol,li_EndRow,li_EndCol
  2634. uLong li_Color
  2635. String ls_ColType
  2636. Int li_CurRow
  2637. n_xls_cell lnv_cell1, lnv_cell2
  2638. Boolean lb_overlap
  2639. Boolean lb_flag
  2640. IF Not IsValid(ids_dwcObjects) Then
  2641. is_dwcOldBand=as_Band
  2642. Return 0
  2643. END IF
  2644. IF is_dwcOldBand<>as_Band Then
  2645. ids_dwcObjects.SetFilter("band='"+as_Band+"' AND ReportName='"+as_ReportName+"' AND Name<>'' ")
  2646. ids_dwcObjects.Filter()
  2647. ids_dwcObjects.Sort()
  2648. IF ib_SparseFlag Then
  2649. IF ai_Row<a_ds.RowCount() AND ids_dwcObjects.RowCount()>0 AND ( Left(as_band,7)="header." OR Left(as_band,8)="trailer." ) Then
  2650. For li=1 TO ids_Column.RowCount()
  2651. IF ids_Column.Object.Sparse[li]="1" Then
  2652. IF ai_currow>ids_Column.Object.BeginRow[li] AND ids_Column.Object.BeginRow[li]>0 Then
  2653. li_Row=ids_MergeCells.InsertRow(0)
  2654. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[li]
  2655. ids_MergeCells.Object.StartCol[li_Row]=ids_Column.Object.StartCol[li]
  2656. ids_MergeCells.Object.EndRow[li_Row]=ai_currow
  2657. ids_MergeCells.Object.EndCol[li_Row]=ids_Column.Object.EndCol[li]
  2658. END IF
  2659. ids_Column.Object.PriorValue[li]=""
  2660. ids_Column.Object.BeginRow[li]=ai_CurRow+li_EndRow +1
  2661. END IF
  2662. Next
  2663. END IF
  2664. END IF
  2665. END IF
  2666. IF ids_dwcObjects.RowCount()=0 Then
  2667. is_dwcOldBand=as_Band
  2668. Return 0
  2669. END IF
  2670. //li_StartCol=Long(ids_dwcObjects.Describe("Evaluate('Min(StartCol)',0)"))
  2671. //li_EndCol=Long(ids_dwcObjects.Describe("Evaluate('Max(EndCol)',0)"))
  2672. IF is_dwcOldBand<>as_Band Then
  2673. ids_Bands.SetFilter("band='"+as_Band+"' AND ReportName='"+as_reportname+"'")
  2674. ids_Bands.Filter()
  2675. END IF
  2676. For li=1 To ids_Bands.RowCount()
  2677. li_color=0
  2678. IF ids_Bands.Object.ColorExp[li]<>"" Then
  2679. li_Color=Long(OF_Evaluate(a_ds, ids_Bands.Object.ColorExp[li],ai_Row))
  2680. li_Color=invo_Colors.of_get_color(li_color)
  2681. IF li_color<>0 then
  2682. li_color= invo_colors.of_get_custom_color_index(li_color)
  2683. END IF
  2684. ELSE
  2685. li_Color= ids_Bands.Object.Color[li]
  2686. END IF
  2687. IF li_color<>0 AND li_color <> 65 Then
  2688. li_Row=ids_ReportObj.Find("name='"+as_reportname+"'",1,ids_ReportObj.RowCount())
  2689. IF li_Row>0 Then
  2690. For lj=ids_Bands.Object.StartRow[li] To ids_Bands.Object.EndRow[li]
  2691. //For lk=ids_Bands.Object.StartCol[li] TO ids_Bands.Object.EndCol[li]
  2692. For lk = ids_ReportObj.Object.StartCol[li_Row] To ids_ReportObj.Object.EndCol[li_Row]
  2693. invo_cell=invo_worksheet.of_getcell(lj+ai_currow,lk)
  2694. invo_cell.invo_format.of_set_bg_color(li_color)
  2695. Next
  2696. Next
  2697. END IF
  2698. END IF
  2699. Next
  2700. //设置行高
  2701. IF is_dwcOldBand<>as_Band Then
  2702. ids_RowHeight.SetFilter("band='"+as_Band+"' AND ReportName='"+as_reportname+"'")
  2703. ids_RowHeight.Filter()
  2704. ids_RowHeight.Sort()
  2705. END IF
  2706. For li=1 To ids_RowHeight.RowCount()
  2707. IF ids_RowHeight.Object.Height[li]>0 Then
  2708. invo_worksheet.of_Set_Row_Height(ai_Currow+ids_RowHeight.Object.Row[li] + ids_RowHeight.Object.AboveRows[li] -1 ,double(ids_RowHeight.Object.Height[li]) )
  2709. END IF
  2710. Next
  2711. IF IsValid(ids_Line) Then
  2712. ids_Line.SetFilter("band='"+as_Band+"' AND ReportName='"+as_reportname+"' ")
  2713. ids_Line.Filter()
  2714. For li=1 To ids_Line.RowCount()
  2715. For lj=ids_Line.Object.StartCol[li] To ids_Line.Object.EndCol[li]
  2716. li_Count=ids_Line.Object.EndRow[li]
  2717. For lk=ids_Line.Object.StartRow[li] To li_Count //ids_Line.Object.EndRow[li]
  2718. IF lk>0 AND lj>0 Then
  2719. IF ids_Line.Object.LineType[li]='h' Then
  2720. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj)
  2721. IF lk=1 Then
  2722. //判断线是在对象下面,还是在对象上面
  2723. li_Row=ids_dwcObjects.Find("Y2<="+String(ids_Line.Object.Y1[li] +ii_RowSpace),1,ids_dwcObjects.RowCount())
  2724. IF li_Row>0 Then
  2725. invo_cell.invo_format.ii_bottom= ids_Line.Object.PenWidth[li]
  2726. invo_cell.invo_format.ii_bottom_color = ids_Line.Object.pencolor[li]
  2727. ELSE
  2728. invo_cell.invo_format.ii_top= ids_Line.Object.PenWidth[li]
  2729. invo_cell.invo_format.ii_top_color = ids_Line.Object.pencolor[li]
  2730. END IF
  2731. ELSE
  2732. invo_cell.invo_format.ii_bottom= ids_Line.Object.PenWidth[li]
  2733. invo_cell.invo_format.ii_bottom_color = ids_Line.Object.pencolor[li]
  2734. END IF
  2735. ELSE
  2736. IF lj= ii_MaxCol AND lj>1 Then
  2737. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj -1)
  2738. invo_cell.invo_format.ii_Right= ids_Line.Object.PenWidth[li]
  2739. invo_cell.invo_format.ii_Right_color = ids_Line.Object.pencolor[li]
  2740. ELSE
  2741. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj )
  2742. invo_cell.invo_format.ii_Left= ids_Line.Object.PenWidth[li]
  2743. invo_cell.invo_format.ii_Left_color = ids_Line.Object.pencolor[li]
  2744. END IF
  2745. END IF
  2746. END IF
  2747. Next
  2748. Next
  2749. Next
  2750. END IF
  2751. li_EndRow=0
  2752. li_Count=ids_dwcObjects.RowCount()
  2753. FOR li=1 To li_Count
  2754. IF (ids_dwcObjects.Object.RowInDetail[li]+ai_Row -1)>a_ds.RowCount() Then
  2755. Continue
  2756. END IF
  2757. ls_Name=ids_dwcObjects.Object.Name[li]
  2758. ls_Type=ids_dwcObjects.Object.Stype[li]
  2759. ls_ColType= ids_dwcObjects.Object.Coltype[li]
  2760. li_StartRow=ids_dwcObjects.Object.StartRow[li]
  2761. li_StartCol=ids_dwcObjects.Object.StartCol[li]
  2762. li_EndRow=ids_dwcObjects.Object.EndRow[li]
  2763. li_EndCol=ids_dwcObjects.Object.EndCol[li]
  2764. ls_Value=""
  2765. lb_overlap=False
  2766. IF li_StartRow<=0 OR li_StartCol<=0 OR li_StartCol>256 Then Continue //行列没定义不输出 ,如果列大于256,也不输出,因为F1最多只支持256列
  2767. IF ids_dwcObjects.Object.VisibleExp[li]<>"" Then
  2768. ls_Visible=OF_Evaluate(a_ds,ids_dwcObjects.Object.VisibleExp[li],ai_Row )
  2769. ELSE
  2770. ls_Visible = ids_dwcObjects.Object.Visible[li]
  2771. END IF
  2772. //输出多少行数据
  2773. IF li_EndRow >li_outlines THEN
  2774. li_outlines=li_EndRow
  2775. END IF
  2776. li_CurRow=li_StartRow+ai_CurRow
  2777. //如果对象前一单元有内容,则设置前一单元自动换行
  2778. //invo_worksheet.OF_PriorCell_wrapText(li_CurRow,li_StartCol) //2004-11-05
  2779. invo_cell=invo_worksheet.of_getcell(li_CurRow,li_StartCol) //,invo_pre_cell
  2780. IF ids_dwcObjects.Object.isBorderOnly[li]='1' Then
  2781. IF li_StartRow<>li_EndRow OR li_StartCol<>li_EndCol Then //合并单元
  2782. For lj=li_StartRow To li_EndRow
  2783. For lk = li_StartCol To li_EndCol
  2784. IF lj<>li_StartRow AND lj<>li_EndRow AND lk<>li_StartCol AND lk<>li_EndCol Then
  2785. Continue
  2786. END IF
  2787. invo_cell=invo_worksheet.of_getcell(lj+ai_CurRow,lk)
  2788. IF lj=li_StartRow Then
  2789. invo_cell.invo_format.ii_top=1
  2790. END IF
  2791. IF lj=li_EndRow Then
  2792. invo_cell.invo_format.ii_bottom=1
  2793. END IF
  2794. IF lk=li_StartCol Then
  2795. invo_cell.invo_format.ii_left=1
  2796. END IF
  2797. IF lk=li_EndCol Then
  2798. invo_cell.invo_format.ii_right=1
  2799. END IF
  2800. Next
  2801. Next
  2802. ELSE
  2803. invo_cell.invo_format.ii_left=1
  2804. invo_cell.invo_format.ii_right=1
  2805. invo_cell.invo_format.ii_top=1
  2806. invo_cell.invo_format.ii_bottom=1
  2807. END IF
  2808. Continue
  2809. END IF
  2810. //对象是否自动换行 2004-11-11
  2811. invo_cell.invo_format.ii_text_wrap=ids_dwcObjects.Object.WrapText[li]
  2812. //判断是否有多个对象重复输出到同一单元
  2813. IF invo_Cell.is_Value<>"" OR ids_dwcObjects.Object.MergeFlag[li]='1' Then
  2814. lb_overlap=True
  2815. END IF
  2816. IF ids_dwcObjects.Object.FormatExp[li]="" Then
  2817. invo_cell.invo_format.is_num_format = ids_dwcObjects.Object.Format[li]
  2818. ELSE
  2819. invo_cell.invo_format.is_num_format = OF_Evaluate(a_ds,ids_dwcObjects.Object.FormatExp[li],ai_Row)
  2820. END IF
  2821. IF ids_dwcObjects.object.border[li]='2' then
  2822. invo_cell.invo_format.ii_left=1
  2823. invo_cell.invo_format.ii_right=1
  2824. invo_cell.invo_format.ii_top=1
  2825. invo_cell.invo_format.ii_bottom=1
  2826. ELSEIF ids_dwcObjects.object.border[li]='4' then
  2827. invo_cell.invo_format.ii_bottom=1
  2828. END IF
  2829. IF ls_Type="compute" OR ls_Type="column" Then //{b}
  2830. //IF ids_dwcObjects.Object.RowInDetail[li]>0 Then
  2831. ls_value=Of_GetData(a_ds,ai_row+ids_dwcObjects.Object.RowInDetail[li] -1 ,ls_Name, ls_coltype,invo_cell.invo_format.is_num_format, ids_dwcObjects.Object.displayvalue[li] , ids_dwcObjects.Object.columnflag[li], lb_overlap)
  2832. // ELSE
  2833. // ls_value=Of_GetData(a_ds,ai_row,ls_Name, ls_coltype,invo_cell.invo_format.is_num_format, ids_dwcObjects.Object.displayvalue[li] , lb_overlap)
  2834. //END IF
  2835. IF ib_SparseFlag AND as_Band="detail" Then
  2836. lj=ids_Column.Find("reportname='"+as_reportname+"' AND name='"+ls_Name+"'",1,ids_Column.RowCount())
  2837. IF lj>0 Then
  2838. IF ids_Column.Object.Sparse[lj]="1" Then
  2839. IF ai_row=1 Then
  2840. ids_Column.Object.BeginRow[lj]=li_currow
  2841. ids_Column.Object.PriorValue[lj]=ls_Value
  2842. ELSE
  2843. IF ids_Column.Object.BeginRow[lj]>=li_CurRow AND ai_Row<a_ds.RowCount() Then
  2844. ids_Column.Object.PriorValue[lj]=ls_Value
  2845. ELSE
  2846. IF ls_Value= ids_Column.Object.PriorValue[lj] AND ai_Row<a_ds.RowCount() Then
  2847. Continue
  2848. ELSE
  2849. IF ai_Row=idw_Requestor.RowCount() AND ls_Value= ids_Column.Object.PriorValue[lj] Then
  2850. lk=li_currow+li_EndRow -1
  2851. ELSE
  2852. For lk=ids_Column.Object.BeginRow[lj]+1 To ai_Currow
  2853. lnv_cell1= invo_WorkSheet.OF_GetCell(lk,li_StartCol)
  2854. lnv_Cell2= invo_WorkSheet.OF_GetCell(ids_Column.Object.BeginRow[lj]+1,li_StartCol)
  2855. //IF xlApp.TextRC[lk,li_StartCol]<>xlApp.TextRC[ids_Column.Object.BeginRow[lj]+1,li_StartCol] Then
  2856. IF lnv_Cell1.is_Value<>lnv_Cell2.is_Value Then
  2857. Exit
  2858. END IF
  2859. Next
  2860. lk=lk -1
  2861. END IF
  2862. IF lk>ids_Column.Object.BeginRow[lj] Then
  2863. li_Row=ids_MergeCells.InsertRow(0)
  2864. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[lj]
  2865. ids_MergeCells.Object.StartCol[li_Row]=li_StartCol
  2866. ids_MergeCells.Object.EndRow[li_Row]=lk
  2867. ids_MergeCells.Object.EndCol[li_Row]=li_EndCol
  2868. END IF
  2869. IF ai_Row<idw_Requestor.RowCount() Then
  2870. ids_Column.Object.BeginRow[lj]=li_CurRow
  2871. ids_Column.Object.PriorValue[lj]=ls_Value
  2872. // 处理后面的列
  2873. For lj=1 To ids_Column.RowCount()
  2874. IF ids_Column.Object.StartCol[lj]>li_StartCol AND ids_Column.Object.Sparse[lj]="1" Then
  2875. IF lk>ids_Column.Object.BeginRow[lj] Then
  2876. li_Row=ids_MergeCells.InsertRow(0)
  2877. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[lj]
  2878. ids_MergeCells.Object.StartCol[li_Row]=ids_Column.Object.StartCol[lj]
  2879. ids_MergeCells.Object.EndRow[li_Row]=lk
  2880. ids_MergeCells.Object.EndCol[li_Row]=ids_Column.Object.EndCol[lj]
  2881. END IF
  2882. //由于排序方式一样
  2883. ids_Column.Object.BeginRow[lj]=lk+1
  2884. ids_Column.Object.PriorValue[lj]=ls_Value
  2885. END IF
  2886. Next
  2887. ELSE
  2888. //如果最后一行是被合并的,则不输出
  2889. IF lk>=li_CurRow Then
  2890. Continue
  2891. END IF
  2892. END IF
  2893. END IF
  2894. END IF
  2895. END IF
  2896. END IF
  2897. END IF
  2898. END IF
  2899. ELSE
  2900. IF ls_Visible="1" Then
  2901. ls_Value= a_ds.Describe(ls_Name+".text")
  2902. IF Left(ls_Value,1)='"' OR Left(ls_Value,1)="'" Then
  2903. ls_Value =Mid(ls_Value,2, Len(ls_Value) -2)
  2904. END IF
  2905. lj=Pos(ls_Value,"~t")
  2906. //PB新版本支持Text对象的Text是一个表达式 2004-10-29
  2907. IF lj>0 Then
  2908. ls_Value=OF_Evaluate(a_ds, Mid(ls_Value,lj+1),ai_Row)
  2909. END IF
  2910. END IF
  2911. END IF
  2912. IF li_StartRow<>li_EndRow OR li_StartCol<>li_EndCol Then //合并单元
  2913. invo_cell.EndRow= li_EndRow+ai_CurRow
  2914. invo_cell.EndCol= li_EndCol
  2915. IF li_StartRow<>li_EndRow Then
  2916. invo_cell.invo_format.ii_text_wrap=1
  2917. END IF
  2918. invo_worksheet.of_mergecells(li_CurRow,li_StartCol,li_EndRow+ai_CurRow,li_EndCol)
  2919. END IF
  2920. IF ls_Visible="1" Then
  2921. //如果单元在细节区,而且对象与前输出行与细节区第一行时输出的单元格式相同
  2922. //则直接取第一次输出时的单元格式,从而可以减少单元格式判断的次数
  2923. lb_flag=False
  2924. IF ib_GridBorder=False AND (as_Band="detail" OR Pos(as_Band,".")>0 ) AND ids_dwcObjects.Object.ExpFlag[li]='0' Then
  2925. IF ids_dwcObjects.Object.xfIndex[li]>0 Then
  2926. IF ids_dwcObjects.Object.BorderKey[li] = String(invo_cell.invo_Format.ii_top,"00")+ String(invo_cell.invo_Format.ii_bottom,"00")+String(invo_cell.invo_Format.ii_left,"00")+String(invo_cell.invo_Format.ii_right,"00") Then
  2927. invo_Cell.ii_xf= ids_dwcObjects.Object.xfIndex[li]
  2928. lb_flag=True
  2929. END IF
  2930. END IF
  2931. END IF
  2932. IF lb_flag=False AND ( invo_cell.is_value="" or Not lb_overlap ) Then //如果多个对象重复输出到同一单元,则以第一次取的格式为准
  2933. IF ids_dwcObjects.Object.FontSizeExp[li]="" Then
  2934. invo_cell.invo_format.ii_size = ids_dwcObjects.Object.FontSize[li]
  2935. ELSE
  2936. invo_cell.invo_format.ii_size =ABS(Long(OF_Evaluate(a_ds,ids_dwcObjects.Object.FontSizeExp[li],ai_Row)))
  2937. END IF
  2938. IF ids_dwcObjects.Object.FontNameExp[li]="" Then
  2939. invo_cell.invo_format.is_font = ids_dwcObjects.Object.FontName[li]
  2940. ELSE
  2941. invo_cell.invo_format.is_font = OF_Evaluate(a_ds,ids_dwcObjects.Object.FontNameExp[li],ai_Row)
  2942. END IF
  2943. IF ids_dwcObjects.Object.fontweightexp[li]="" Then
  2944. invo_cell.invo_format.ii_bold = ids_dwcObjects.Object.Fontweight[li]
  2945. ELSE
  2946. invo_cell.invo_format.ii_bold =Long(OF_Evaluate(a_ds,ids_dwcObjects.Object.fontweightexp[li],ai_Row))
  2947. END IF
  2948. IF ids_dwcObjects.Object.Fontitalicexp[li]="" Then
  2949. invo_cell.invo_format.ii_italic = Long(ids_dwcObjects.Object.Fontitalic[li])
  2950. ELSE
  2951. invo_cell.invo_format.ii_italic = Long(OF_Evaluate(a_ds,ids_dwcObjects.Object.Fontitalicexp[li],ai_Row))
  2952. END IF
  2953. IF ids_dwcObjects.Object.Alignmentexp[li]="" Then
  2954. invo_cell.invo_format.ii_text_h_align=ids_dwcObjects.Object.Alignment[li]
  2955. ELSE
  2956. Choose Case OF_Evaluate(a_ds,ids_dwcObjects.Object.Alignmentexp[li],ai_Row)
  2957. Case "1" //右对齐
  2958. invo_cell.invo_format.ii_text_h_align=3
  2959. Case "2" //中对齐
  2960. invo_cell.invo_format.ii_text_h_align=2
  2961. Case Else //均匀对齐,调整为左对齐
  2962. invo_cell.invo_format.ii_text_h_align=1
  2963. END CHOOSE
  2964. END IF
  2965. IF ids_dwcObjects.Object.FontColorexp[li]="" Then
  2966. invo_cell.invo_format.ii_color=ids_dwcObjects.Object.FontColor[li]
  2967. ELSE
  2968. li_color=long(OF_Evaluate(a_ds,ids_dwcObjects.Object.FontColorexp[li],ai_Row))
  2969. li_color = invo_colors.of_get_color(li_color )
  2970. invo_cell.invo_format.ii_color= invo_colors.of_get_custom_color_index(li_color)
  2971. END IF
  2972. IF ids_dwcObjects.Object.bgColorexp[li]="" Then
  2973. if ids_dwcObjects.Object.bgColor[li]<>65 and ids_dwcObjects.Object.bgColor[li]<>0 then //以免破坏按带区设置了颜色的情况
  2974. invo_cell.invo_format.of_set_bg_color(Long(ids_dwcObjects.Object.bgColor[li]))
  2975. end if
  2976. ELSE
  2977. li_color=long(OF_Evaluate(a_ds,ids_dwcObjects.Object.bgColorexp[li],ai_Row))
  2978. li_color = invo_colors.of_get_color(li_color )
  2979. if li_color<>0 then
  2980. li_color= invo_colors.of_get_custom_color_index(li_color)
  2981. end if
  2982. if li_color<>65 and li_color<>0 then
  2983. invo_cell.invo_format.of_set_bg_color(li_color)
  2984. end if
  2985. END IF
  2986. END IF
  2987. IF ls_Value="!" or ls_Value="?" Then
  2988. ls_Value=""
  2989. END IF
  2990. IF ls_Value<>"" or ids_dwcObjects.Object.ObjSpace[li]>0 OR ids_dwcObjects.Object.MergeFlag[li]="1" Then
  2991. IF ids_dwcObjects.Object.ObjSpace[li]>0 Then
  2992. ls_Value=OF_GetObjSpace(ids_dwcObjects.Object.ObjSpace[li])+ls_Value
  2993. ELSE
  2994. IF ids_dwcObjects.Object.MergeFlag[li]="1" Then
  2995. ls_Value=ls_Value+Mid(OF_GetObjSpace(ids_dwcObjects.Object.Width[li]),Len(ls_Value)+1)
  2996. END IF
  2997. END IF
  2998. END IF
  2999. IF lb_overlap Then
  3000. invo_Cell.is_CellType='S'
  3001. invo_Cell.invo_format.is_num_format="General" //设为常规
  3002. ELSE
  3003. IF ids_dwcObjects.Object.DisplayValue[li]='1' Then
  3004. invo_Cell.is_CellType='S'
  3005. ELSE
  3006. invo_Cell.is_CellType=ls_ColType
  3007. END IF
  3008. END IF
  3009. invo_cell.is_value+=ls_value
  3010. //同一列的同一对象,格式可能是一样的,避免重复注册单元格式,提高处理速度
  3011. IF ib_GridBorder=False AND (as_Band="detail" OR Pos(as_Band,".")>0 ) AND ids_dwcObjects.Object.ExpFlag[li]='0' Then
  3012. IF ids_dwcObjects.Object.xfIndex[li]=0 Then
  3013. invo_cell.ii_xf =invo_cell.invo_WorkSheet.invo_WorkBook.OF_Reg_Format(invo_cell.invo_Format) +14
  3014. ids_dwcObjects.Object.xfIndex[li] = invo_cell.ii_xf
  3015. ids_dwcObjects.Object.BorderKey[li] = String(invo_cell.invo_Format.ii_top,"00")+ String(invo_cell.invo_Format.ii_bottom,"00")+String(invo_cell.invo_Format.ii_left,"00")+String(invo_cell.invo_Format.ii_right,"00")
  3016. END IF
  3017. END IF
  3018. END IF
  3019. Next
  3020. is_dwcOldBand=as_Band
  3021. Return li_outlines
  3022. Return 0
  3023. end function
  3024. protected function integer of_groupcount ();/*
  3025. 计算数据窗口有多少个分组
  3026. */
  3027. string ls_Temp
  3028. int li,li_pos,li_Pos2,li_groupcount
  3029. ls_Temp=idw_Requestor.Describe("datawindow.bands")
  3030. li_pos=1
  3031. Do While li_pos>0
  3032. li_pos=Pos(ls_Temp,"header.",li_pos)
  3033. IF li_pos>0 Then
  3034. li_groupcount++
  3035. li_pos++
  3036. END IF
  3037. Loop
  3038. IF li_GroupCount >0 Then
  3039. ls_Temp=idw_Requestor.Describe("datawindow.syntax")
  3040. li_Pos=Pos(ls_Temp,"group(level=1 ")
  3041. ls_Temp=Mid(ls_Temp,li_Pos)
  3042. li=1
  3043. Do While li_Pos>0
  3044. li_Pos2=Pos(ls_Temp,"group(level="+String(li) )
  3045. IF li_Pos2>0 Then
  3046. li_Pos= pos(Mid(ls_Temp,li_Pos2 - li_Pos),"newpage=yes")
  3047. ELSE
  3048. li_Pos= pos(ls_Temp,"newpage=yes",li_Pos)
  3049. END IF
  3050. IF li_Pos>0 Then
  3051. ib_GroupNewPage[li]=True
  3052. ELSE
  3053. ib_GroupNewPage[li]=False
  3054. END IF
  3055. li_Pos=li_Pos2
  3056. li++
  3057. Loop
  3058. END IF
  3059. //如果报表只有一个分组,而且设置了分组分页打印,被设置不需要每个分组都输出
  3060. IF li_groupcount=1 Then
  3061. IF ib_GroupNewPage[1] Then
  3062. ib_GroupOutFlag=False
  3063. END IF
  3064. END IF
  3065. Return li_groupcount
  3066. end function
  3067. protected subroutine of_gridinfo (string as_reportname, string as_bands[]);Int li ,lj ,li_Row
  3068. Long li_x ,li_Y
  3069. Long li_Width= 20
  3070. Long li_Space = 50
  3071. IF Not IsValid(ids_Line) Then Return
  3072. IF ids_Line.RowCount()<=0 Then Return
  3073. Choose Case is_units
  3074. Case '1'
  3075. li_Width=UnitsToPixels(li_Width,xUnitsToPixels!)
  3076. li_Space=UnitsToPixels(li_Space,YUnitsToPixels!)
  3077. Case '2'
  3078. li_Width = UnitsToPixels(li_Width, XUnitsToPixels!)* 0.1041
  3079. li_Space= UnitsToPixels(li_Space, YUnitsToPixels!)* 0.1041
  3080. Case '3'
  3081. li_Width = UnitsToPixels(li_Width, XUnitsToPixels!) *2.646
  3082. li_Space= UnitsToPixels(li_Space, YUnitsToPixels!) *2.646
  3083. END CHOOSE
  3084. ids_Line.SetFilter("")
  3085. ids_Line.Filter()
  3086. For li=ids_Line.RowCount() To 1 Step -1
  3087. //处理线条 有客户提交的测试数据窗口,有些线条x和y值竟然都是为0 :)
  3088. IF ids_Line.Object.X2[li]=ids_Line.Object.x1[li] and ids_Line.Object.Y2[li]=ids_Line.Object.Y1[li] Then
  3089. ids_Line.DeleteRow(li)
  3090. Continue
  3091. END IF
  3092. IF (ids_Line.Object.X2[li]<0 AND ids_Line.Object.x1[li]<0) or (ids_Line.Object.Y2[li]<0 AND ids_Line.Object.Y1[li]<0 ) Then
  3093. ids_Line.DeleteRow(li)
  3094. Continue
  3095. END IF
  3096. IF ids_Line.Object.X2[li]<ids_Line.Object.x1[li] Then
  3097. li_x=ids_Line.Object.x1[li]
  3098. ids_Line.Object.x1[li]=ids_Line.Object.x2[li]
  3099. ids_Line.Object.x2[li]=li_x
  3100. END IF
  3101. IF ids_Line.Object.Y2[li]<ids_Line.Object.Y1[li] Then
  3102. li_Y=ids_Line.Object.Y1[li]
  3103. ids_Line.Object.Y1[li]=ids_Line.Object.Y2[li]
  3104. ids_Line.Object.Y2[li]=li_Y
  3105. END IF
  3106. //判断线型
  3107. IF (ids_Line.Object.X2[li] - ids_Line.Object.x1[li])>li_Width Then
  3108. ids_Line.Object.LineType[li]="h"
  3109. else
  3110. ids_Line.Object.LineType[li]="v"
  3111. END IF
  3112. Next
  3113. ids_Line.SetFilter("lineType='h'")
  3114. ids_Line.Filter()
  3115. ids_Line.SetSort("ReportName A, Band A ,Y1 A")
  3116. ids_Line.Sort()
  3117. ids_Objects.SetFilter("")
  3118. ids_Objects.SetSort(" Y A")
  3119. ids_Objects.Filter()
  3120. ids_Objects.Sort()
  3121. For li=ids_Line.RowCount() To 2 Step -1
  3122. IF ids_Line.Object.ReportName[li]<>ids_Line.Object.ReportName[li -1] OR ids_Line.Object.Band[li]<>ids_Line.Object.Band[li -1] Then
  3123. Continue
  3124. END IF
  3125. li_Row=ids_Objects.Find("ReportName='"+ids_Line.Object.ReportName[li]+"' AND Band='"+ids_Line.Object.Band[li]+"' AND y> "+String(ids_Line.Object.y1[li -1] - ii_RowSpace )+" AND Y2< "+String(ids_Line.Object.y1[li] +ii_RowSpace) ,1,ids_Objects.RowCount())
  3126. IF li_Row<=0 Then
  3127. IF ( ids_Line.Object.Y1[li] - ids_Line.Object.Y1[li -1] )>li_Space Then
  3128. li_Row=ids_Objects.InsertRow(0)
  3129. ids_Objects.Object.x[li_Row]=ids_Line.Object.x1[li -1]+ii_ColSpace
  3130. ids_Objects.Object.Y[li_Row]=ids_Line.Object.Y1[li -1]+ii_RowSpace
  3131. ids_Objects.Object.Width[li_Row]=li_Space
  3132. ids_Objects.Object.Height[li_Row]=li_Space
  3133. ids_Objects.Object.Band[li_Row]=ids_Line.Object.Band[li]
  3134. ids_Objects.Object.ReportName[li_Row]=as_ReportName
  3135. ids_Objects.Object.Name[li_Row]=''
  3136. END IF
  3137. END IF
  3138. Next
  3139. end subroutine
  3140. public subroutine of_mergecolumnheader (boolean ab_flag, string as_objname);ib_MergeColumnHeader=ab_Flag
  3141. is_BeginRowObj=as_ObjName
  3142. end subroutine
  3143. protected function boolean of_openuserobject ();powerobject lpo_parent
  3144. OF_CloseUserObject()
  3145. lpo_parent = idw_Requestor.GetParent()
  3146. do while IsValid (lpo_parent)
  3147. if lpo_parent.TypeOf() <> window! then
  3148. lpo_parent = lpo_parent.GetParent()
  3149. else
  3150. exit
  3151. end if
  3152. loop
  3153. if IsNull(lpo_parent) Or not IsValid (lpo_parent) then
  3154. setnull(iw_parent)
  3155. return False
  3156. end If
  3157. iw_parent = lpo_parent
  3158. IF iw_parent.OpenUserObject(iuo_Text)=1 Then
  3159. iuo_Text.Visible=False
  3160. iuo_Text.Text=' '
  3161. Return True
  3162. END IF
  3163. Return False
  3164. end function
  3165. protected function string of_replaceall (string as_string1, string as_string2, string as_string3);long ll_Pos,ll_F,ll_R
  3166. ll_F=Len(as_String2)
  3167. ll_R=Len(as_String3)
  3168. ll_Pos=Pos(as_String1,as_String2)
  3169. DO WHILE ll_Pos<>0
  3170. as_String1=Replace(as_String1,ll_Pos,ll_F,as_String3)
  3171. ll_Pos=Pos(as_String1,as_String2,ll_Pos+ll_R)
  3172. LOOP
  3173. RETURN as_String1
  3174. end function
  3175. protected function integer of_outdata (long ai_currow, string as_band, long ai_row);/*-------------------------------------------------
  3176. 在EXCEL表中写入数据
  3177. ai_CurRow 数据要写入到EXCEL中的行号
  3178. as_band 要转出那个带区的对象
  3179. aai_CurRow 要转出的数据窗口中那个行的记录
  3180. 返回值: 在EXCEL中写入多少行数据
  3181. ----------------------------------------------------------------------*/
  3182. Long li_outlines
  3183. Long li_Height
  3184. String ls_Value, ls_Name,ls_Type
  3185. Int li,lj, lk, li_Count
  3186. Int li_GroupCount
  3187. Int li_Row
  3188. String ls_Format
  3189. String ls_ColType
  3190. String ls_Visible
  3191. Int li_StartRow,li_StartCol,li_EndRow,li_EndCol
  3192. uLong li_Color
  3193. Int li_CurRow
  3194. Datastore lds
  3195. DataWindowChild dwc
  3196. n_xls_Cell lnv_cell1,lnv_Cell2
  3197. boolean lb_overlap
  3198. boolean lb_flag
  3199. Boolean lb_TrailerFlag
  3200. IF is_OldBand<>as_Band Then
  3201. ids_Objects.SetFilter("band='"+as_Band+"' AND Name<>'' ")
  3202. ids_Objects.Filter()
  3203. ids_Objects.Sort()
  3204. is_dwcOldBand=""
  3205. IF ib_SparseFlag Then
  3206. IF ai_Row<idw_Requestor.RowCount() AND ( Left(as_band,7)="header." OR Left(as_band,8)="trailer." ) Then
  3207. For li=1 TO ids_Column.RowCount()
  3208. IF ids_Column.Object.Sparse[li]="1" Then
  3209. IF ai_currow>=ids_Column.Object.BeginRow[li] AND ids_Column.Object.BeginRow[li]>0 Then
  3210. li_Row=ids_MergeCells.InsertRow(0)
  3211. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[li]
  3212. ids_MergeCells.Object.StartCol[li_Row]=ids_Column.Object.StartCol[li]
  3213. ids_MergeCells.Object.EndRow[li_Row]=ai_currow
  3214. ids_MergeCells.Object.EndCol[li_Row]=ids_Column.Object.EndCol[li]
  3215. END IF
  3216. ids_Column.Object.PriorValue[li]=""
  3217. ids_Column.Object.BeginRow[li]=ai_CurRow+li_EndRow +1
  3218. END IF
  3219. Next
  3220. END IF
  3221. END IF
  3222. END IF
  3223. IF IsValid(ids_ReportObj) Then
  3224. IF is_OldBand<>as_Band Then
  3225. ids_ReportObj.SetFilter("Band='"+as_Band+"'")
  3226. ids_ReportObj.Filter()
  3227. END IF
  3228. IF ids_ReportObj.RowCount()>0 Then
  3229. li_Currow=ai_Currow
  3230. lds=Create DataStore
  3231. For li=1 To ids_ReportObj.RowCount()
  3232. ls_Name=ids_ReportObj.Object.Name[li]
  3233. ids_Column.SetFilter("reportname='"+ls_Name+"'")
  3234. ids_Column.Filter()
  3235. ids_Column.Sort()
  3236. is_dwcOldBand=""
  3237. lds.DataObject=idw_Requestor.Describe(ls_Name+".DataObject")
  3238. IF idw_Requestor.Describe("DataWindow.Nested")="yes" AND ai_Row>0 Then
  3239. Choose Case ls_Name
  3240. Case "mxreport"
  3241. IF Len(String(idw_Requestor.Object.mxreport[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3242. lds.Object.Data=idw_Requestor.Object.mxreport[ai_Row].Object.Data //否则如果没有记录,会出错
  3243. END IF
  3244. Case "dw_1"
  3245. IF Len(String(idw_Requestor.Object.dw_1[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3246. lds.Object.Data=idw_Requestor.Object.dw_1[ai_Row].Object.Data //否则如果没有记录,会出错
  3247. END IF
  3248. Case "dw_2"
  3249. IF Len(String(idw_Requestor.Object.dw_2[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3250. lds.Object.Data=idw_Requestor.Object.dw_2[ai_Row].Object.Data //否则如果没有记录,会出错
  3251. END IF
  3252. CASE "dw_3"
  3253. IF Len(String(idw_Requestor.Object.dw_3[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3254. lds.Object.Data=idw_Requestor.Object.dw_3[ai_Row].Object.Data //否则如果没有记录,会出错
  3255. END IF
  3256. Case "dw_4"
  3257. IF Len(String(idw_Requestor.Object.dw_4[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3258. lds.Object.Data=idw_Requestor.Object.dw_4[ai_Row].Object.Data //否则如果没有记录,会出错
  3259. END IF
  3260. Case "dw_5"
  3261. IF Len(String(idw_Requestor.Object.dw_5[ai_Row].Object.DataWindow.Syntax.Data))>10 Then
  3262. lds.Object.Data=idw_Requestor.Object.dw_5[ai_Row].Object.Data //否则如果没有记录,会出错
  3263. END IF
  3264. END CHOOSE
  3265. ELSE
  3266. idw_Requestor.GetChild(ls_Name,dwc)
  3267. dwc.RowsCopy(1,dwc.RowCount(),Primary!,lds,1,Primary!)
  3268. END IF
  3269. //2004-11-28
  3270. //IF ids_ReportObj.Object.StartRow[li]>0 Then
  3271. li_Currow=ai_Currow+ids_ReportObj.Object.StartRow[li] +ids_ReportObj.Object.AboveRows[li] -1
  3272. //END IF
  3273. IF lds.RowCount()>0 Then
  3274. li_Currow+=OF_OutData(lds,ls_Name,li_Currow,"header",1)
  3275. ELSE
  3276. li_Currow+=OF_OutData(lds,ls_Name,li_Currow,"header",0)
  3277. END IF
  3278. //计算分组数
  3279. ls_Value=lds.Describe("datawindow.bands")
  3280. li_Row=1
  3281. Do While li_Row>0
  3282. li_Row=Pos(ls_Value,"header.",li_Row)
  3283. IF li_Row>0 Then
  3284. li_groupcount++
  3285. li_Row++
  3286. END IF
  3287. Loop
  3288. For li_Row=1 To lds.RowCount()
  3289. lb_TrailerFlag=False
  3290. FOR lj=1 To li_GroupCount
  3291. IF lds.FindGroupChange(li_Row,lj)=li_Row Then //分组的开始
  3292. IF li_Row<>1 AND Not lb_TrailerFlag Then //第一次,不用输出组的尾区
  3293. lb_TrailerFlag=True
  3294. For lk=li_GroupCount To lj Step -1
  3295. IF Long(lds.Describe("datawindow.trailer."+String(lk)+".height"))>0 Then
  3296. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"trailer."+string(lk),li_Row -1)
  3297. END IF
  3298. Next
  3299. END IF
  3300. IF Long(lds.Describe("datawindow.header."+String(lj)+".height"))>0 Then
  3301. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"header."+string(lj),li_Row )
  3302. END IF
  3303. END IF
  3304. NEXT
  3305. //输出当前记录
  3306. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"detail",li_Row)
  3307. li_Row=li_Row+ids_ReportObj.Object.RowInDetail[li] -1
  3308. NEXT
  3309. //输出所有组的最后一组脚尾区
  3310. //2005-1-15
  3311. FOR lj=li_GroupCount To 1 Step -1
  3312. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"trailer."+string(lj),lds.RowCount())
  3313. NEXT
  3314. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"summary",lds.RowCount())
  3315. //2005-1-18
  3316. li_CurRow+=Of_OutData(lds,ls_Name,li_CurRow,"footer",lds.RowCount())
  3317. li_Row=ids_ReportObj.Find("Y>"+string(ids_ReportObj.Object.Y2[li]),li+1,ids_ReportObj.RowCount())
  3318. Do While li_Row>0
  3319. ids_ReportObj.Object.AboveRows[li_Row]= li_Currow - ai_Currow - ids_ReportObj.Object.StartRow[li] +1
  3320. IF li_Row>=ids_ReportObj.RowCount() Then
  3321. Exit
  3322. END IF
  3323. li_Row=ids_ReportObj.Find("Y>"+string(ids_ReportObj.Object.Y2[li]),li_Row+1,ids_ReportObj.RowCount())
  3324. Loop
  3325. li_Row=ids_Objects.Find("Y>"+string(ids_ReportObj.Object.Y2[li])+" AND Slipup='1' ",1,ids_Objects.RowCount())
  3326. Do While li_Row>0
  3327. ids_Objects.Object.AboveRows[li_Row]= li_Currow - ai_Currow - ids_ReportObj.Object.StartRow[li]+1
  3328. IF li_Row>=ids_Objects.RowCount() Then
  3329. Exit
  3330. END IF
  3331. li_Row=ids_Objects.Find("Y>"+string(ids_ReportObj.Object.Y2[li]),li_Row+1,ids_Objects.RowCount())
  3332. Loop
  3333. //更新行高 2004-11-28
  3334. ids_RowHeight.SetFilter("band='"+as_Band+"' AND ReportName='' ")
  3335. ids_RowHeight.Filter()
  3336. ids_RowHeight.Sort()
  3337. li_Row=ids_RowHeight.Find("Y>"+string(ids_ReportObj.Object.Y2[li]),1,ids_RowHeight.RowCount())
  3338. Do While li_Row>0
  3339. ids_RowHeight.Object.AboveRows[li_Row]= li_Currow - ai_Currow - ids_ReportObj.Object.StartRow[li]+1
  3340. IF li_Row>=ids_RowHeight.RowCount() Then
  3341. Exit
  3342. END IF
  3343. li_Row=ids_RowHeight.Find("Y>"+string(ids_ReportObj.Object.Y2[li]),li_Row+1,ids_RowHeight.RowCount())
  3344. Loop
  3345. Next
  3346. END IF
  3347. li_outlines=li_Currow - ai_Currow
  3348. IF li_OutLines<0 Then
  3349. li_OutLines=0
  3350. END IF
  3351. ids_Column.SetFilter("reportname=''")
  3352. ids_Column.Filter()
  3353. ids_Column.Sort()
  3354. END IF
  3355. IF IsValid(lds) Then
  3356. Destroy lds
  3357. END IF
  3358. IF ids_Objects.RowCount()=0 Then
  3359. is_OldBand=as_Band
  3360. Return li_outlines
  3361. END IF
  3362. //用于设置行高和颜色
  3363. //li_StartRow=Long(ids_Objects.Describe("Evaluate('Min(StartRow)',0)"))
  3364. //li_EndRow=Long(ids_Objects.Describe("Evaluate('Max(EndRow)',0)"))
  3365. IF is_OldBand<>as_Band OR lb_NestedFlag Then
  3366. ids_Bands.SetFilter("band='"+as_Band+"' AND ReportName='' ")
  3367. ids_Bands.Filter()
  3368. END IF
  3369. For li=1 To ids_Bands.RowCount()
  3370. li_color=0
  3371. IF ids_Bands.Object.ColorExp[li]<>"" Then
  3372. li_Color=Long(OF_Evaluate(ids_Bands.Object.ColorExp[li],ai_Row))
  3373. li_Color=invo_Colors.of_get_color(li_color)
  3374. IF li_color<>0 then
  3375. li_color= invo_colors.of_get_custom_color_index(li_color)
  3376. END IF
  3377. ELSE
  3378. li_Color= ids_Bands.Object.Color[li]
  3379. END IF
  3380. IF li_color<>0 AND li_color <> 65 Then
  3381. For lj=ids_Bands.Object.StartRow[li] To ids_Bands.Object.EndRow[li]
  3382. //For lk=ids_Bands.Object.StartCol[li] TO ids_Bands.Object.EndCol[li]
  3383. FOR lk= ii_FirstColumn TO ii_MaxCol
  3384. invo_cell=invo_worksheet.of_getcell(lj+ai_currow,lk)
  3385. invo_cell.invo_format.of_set_bg_color(li_color)
  3386. Next
  3387. Next
  3388. END IF
  3389. Next
  3390. //设置行高
  3391. IF is_OldBand<>as_Band OR lb_NestedFlag Then
  3392. ids_RowHeight.SetFilter("band='"+as_Band+"' AND ReportName='' ")
  3393. ids_RowHeight.Filter()
  3394. ids_RowHeight.Sort()
  3395. END IF
  3396. For li=1 To ids_RowHeight.RowCount()
  3397. IF ids_RowHeight.Object.Height[li]>0 Then
  3398. invo_worksheet.of_Set_Row_Height(ai_Currow+ids_RowHeight.Object.Row[li] + ids_RowHeight.Object.AboveRows[li] -1 ,double(ids_RowHeight.Object.Height[li]) )
  3399. END IF
  3400. Next
  3401. //在输出单元数据之前,先输出表格线,目的是能够取得单元的完整的单元格式, 以提高报表的导出速度
  3402. IF IsValid(ids_Line) Then
  3403. IF is_OldBand<>as_Band OR lb_NestedFlag Then
  3404. ids_Line.SetFilter("band='"+as_Band+"' AND ReportName='' ")
  3405. ids_Line.Filter()
  3406. END IF
  3407. For li=1 To ids_Line.RowCount()
  3408. For lj=ids_Line.Object.StartCol[li] To ids_Line.Object.EndCol[li]
  3409. li_Count=ids_Line.Object.EndRow[li]
  3410. For lk=ids_Line.Object.StartRow[li] To li_Count //ids_Line.Object.EndRow[li]
  3411. IF lk>0 AND lj>0 Then
  3412. IF ids_Line.Object.LineType[li]='h' Then
  3413. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj)
  3414. IF lk=1 Then
  3415. //判断线是在对象下面,还是在对象上面
  3416. li_Row=ids_Objects.Find("Y2<="+String(ids_Line.Object.Y1[li] +ii_RowSpace),1,ids_Objects.RowCount())
  3417. IF li_Row>0 Then
  3418. invo_cell.invo_format.ii_bottom= ids_Line.Object.PenWidth[li]
  3419. invo_cell.invo_format.ii_bottom_color = ids_Line.Object.pencolor[li]
  3420. ELSE
  3421. invo_cell.invo_format.ii_top= ids_Line.Object.PenWidth[li]
  3422. invo_cell.invo_format.ii_top_color = ids_Line.Object.pencolor[li]
  3423. END IF
  3424. ELSE
  3425. invo_cell.invo_format.ii_bottom= ids_Line.Object.PenWidth[li]
  3426. invo_cell.invo_format.ii_bottom_color = ids_Line.Object.pencolor[li]
  3427. END IF
  3428. ELSE
  3429. IF lj= ii_MaxCol AND lj>1 Then
  3430. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj -1)
  3431. invo_cell.invo_format.ii_Right= ids_Line.Object.PenWidth[li]
  3432. invo_cell.invo_format.ii_Right_color = ids_Line.Object.pencolor[li]
  3433. //如果有边线,则设置对象自动换行
  3434. //invo_Cell.invo_Format.ii_Text_Wrap=1
  3435. ELSE
  3436. invo_cell=invo_worksheet.of_getcell(lk+ai_currow,lj )
  3437. invo_cell.invo_format.ii_Left= ids_Line.Object.PenWidth[li]
  3438. invo_cell.invo_format.ii_Left_color = ids_Line.Object.pencolor[li]
  3439. //如果有边线,则设置对象自动换行
  3440. //invo_WorkSheet.OF_PriorCell_WrapText(lk+ai_currow,lj)
  3441. END IF
  3442. END IF
  3443. END IF
  3444. Next
  3445. Next
  3446. Next
  3447. END IF
  3448. li_EndRow=0
  3449. li_Count=ids_Objects.RowCount()
  3450. FOR li=1 To li_Count //{a}
  3451. IF (ids_Objects.Object.RowInDetail[li]+ai_Row -1) >idw_Requestor.RowCount() Then
  3452. Continue
  3453. END IF
  3454. ls_Name=ids_Objects.Object.Name[li]
  3455. ls_Type=ids_Objects.Object.Stype[li]
  3456. ls_ColType= ids_Objects.Object.Coltype[li]
  3457. li_StartRow=ids_Objects.Object.StartRow[li]+ids_Objects.Object.AboveRows[li]
  3458. li_StartCol=ids_Objects.Object.StartCol[li]
  3459. li_EndRow=ids_Objects.Object.EndRow[li]+ids_Objects.Object.AboveRows[li]
  3460. li_EndCol=ids_Objects.Object.EndCol[li]
  3461. ls_Value=""
  3462. lb_overlap=False
  3463. IF ids_Objects.Object.VisibleExp[li]<>"" Then
  3464. ls_Visible=OF_Evaluate(ids_Objects.Object.VisibleExp[li],ai_Row )
  3465. ELSE
  3466. ls_Visible = ids_Objects.Object.Visible[li]
  3467. END IF
  3468. IF li_StartRow<=0 OR li_StartCol<=0 OR li_StartCol>256 Then Continue //行列没定义不输出 ,如果列大于256,也不输出,因为F1最多只支持256列
  3469. // 需要检查参数,避免超出F1的范围
  3470. li_CurRow=li_StartRow+ai_CurRow
  3471. //输出多少行数据
  3472. IF li_EndRow >li_outlines THEN
  3473. li_outlines=li_EndRow
  3474. END IF
  3475. IF ii_BorderBeginRow<=0 Then
  3476. IF as_Band="header" AND Right(ls_Name,2)="_t" Then
  3477. ii_BorderBeginRow=li_CurRow
  3478. END IF
  3479. END IF
  3480. IF as_Band="detail" AND ii_DetailRow<=0 Then
  3481. ii_DetailRow=li_CurRow
  3482. END IF
  3483. IF ls_Name=is_BorderBeginObj Then
  3484. ii_BorderBeginRow=li_CurRow
  3485. END IF
  3486. IF ls_Name=is_BorderEndObj Then
  3487. ii_BorderEndRow=li_CurRow
  3488. END IF
  3489. //如果对象前一单元有内容,则设置前一单元自动换行
  3490. //invo_worksheet.OF_PriorCell_wrapText(li_CurRow,li_StartCol) //2004-11-05
  3491. invo_cell=invo_worksheet.of_getcell(li_CurRow,li_StartCol) //,invo_pre_cell
  3492. IF ids_Objects.Object.isBorderOnly[li]='1' Then
  3493. IF li_StartRow<>li_EndRow OR li_StartCol<>li_EndCol Then //合并单元
  3494. For lj=li_StartRow To li_EndRow
  3495. For lk = li_StartCol To li_EndCol
  3496. IF lj<>li_StartRow AND lj<>li_EndRow AND lk<>li_StartCol AND lk<>li_EndCol Then
  3497. Continue
  3498. END IF
  3499. invo_cell=invo_worksheet.of_getcell(lj+ai_CurRow,lk)
  3500. IF lj=li_StartRow Then
  3501. invo_cell.invo_format.ii_top=1
  3502. END IF
  3503. IF lj=li_EndRow Then
  3504. invo_cell.invo_format.ii_bottom=1
  3505. END IF
  3506. IF lk=li_StartCol Then
  3507. invo_cell.invo_format.ii_left=1
  3508. END IF
  3509. IF lk=li_EndCol Then
  3510. invo_cell.invo_format.ii_right=1
  3511. END IF
  3512. Next
  3513. Next
  3514. ELSE
  3515. invo_cell.invo_format.ii_left=1
  3516. invo_cell.invo_format.ii_right=1
  3517. invo_cell.invo_format.ii_top=1
  3518. invo_cell.invo_format.ii_bottom=1
  3519. END IF
  3520. Continue
  3521. END IF
  3522. IF ids_objects.object.border[li]='2' then
  3523. invo_cell.invo_format.ii_left=1
  3524. invo_cell.invo_format.ii_right=1
  3525. invo_cell.invo_format.ii_top=1
  3526. invo_cell.invo_format.ii_bottom=1
  3527. ELSEIF ids_objects.object.border[li]='4' then
  3528. invo_cell.invo_format.ii_bottom=1
  3529. END IF
  3530. //对象是否自动换行 2004-11-11
  3531. invo_cell.invo_format.ii_text_wrap=ids_Objects.Object.WrapText[li]
  3532. //判断是否有多个对象重复输出到同一单元
  3533. IF invo_Cell.is_Value<>"" OR ids_Objects.Object.MergeFlag[li]='1'Then
  3534. lb_overlap=True
  3535. END IF
  3536. IF ids_Objects.Object.FormatExp[li]="" Then
  3537. invo_cell.invo_format.is_num_format = ids_Objects.Object.Format[li]
  3538. ELSE
  3539. invo_cell.invo_format.is_num_format = OF_Evaluate(ids_Objects.Object.FormatExp[li],ai_Row)
  3540. END IF
  3541. IF ls_Type="compute" OR ls_Type="column" Then
  3542. //IF ids_Objects.Object.RowInDetail[li]>0 Then
  3543. ls_value=Of_GetData(ai_row+ids_Objects.Object.RowInDetail[li] -1 ,ls_Name,ls_ColType,invo_cell.invo_format.is_num_format, ids_objects.object.displayvalue[li],ids_objects.object.ColumnFlag[li], lb_overlap)
  3544. //ELSE
  3545. // ls_value=Of_GetData(ai_row,ls_Name,ls_ColType,invo_cell.invo_format.is_num_format, ids_objects.object.displayvalue[li],lb_overlap)
  3546. //END IF
  3547. IF ib_SparseFlag AND as_Band="detail" Then
  3548. lj=ids_Column.Find("name='"+ls_Name+"'",1,ids_Column.RowCount())
  3549. IF lj>0 Then
  3550. IF ids_Column.Object.Sparse[lj]="1" Then
  3551. IF ai_row=1 Then
  3552. ids_Column.Object.BeginRow[lj]=li_currow
  3553. ids_Column.Object.PriorValue[lj]=ls_Value
  3554. ELSE
  3555. IF ids_Column.Object.BeginRow[lj]>=li_CurRow AND ai_Row<idw_Requestor.RowCount() Then
  3556. ids_Column.Object.PriorValue[lj]=ls_Value
  3557. ELSE
  3558. IF ls_Value= ids_Column.Object.PriorValue[lj] AND ai_Row<idw_Requestor.RowCount() Then
  3559. Continue
  3560. ELSE
  3561. IF ai_Row=idw_Requestor.RowCount() AND ls_Value= ids_Column.Object.PriorValue[lj] Then
  3562. lk=li_currow+li_EndRow -1
  3563. ELSE
  3564. For lk=ids_Column.Object.BeginRow[lj]+1 To ai_Currow
  3565. lnv_cell1= invo_WorkSheet.OF_GetCell(lk,li_StartCol)
  3566. lnv_Cell2= invo_WorkSheet.OF_GetCell(ids_Column.Object.BeginRow[lj]+1,li_StartCol)
  3567. //IF xlApp.TextRC[lk,li_StartCol]<>xlApp.TextRC[ids_Column.Object.BeginRow[lj]+1,li_StartCol] Then
  3568. IF lnv_Cell1.is_Value<>lnv_Cell2.is_Value Then
  3569. Exit
  3570. END IF
  3571. Next
  3572. lk=lk -1
  3573. END IF
  3574. IF lk>ids_Column.Object.BeginRow[lj] Then
  3575. li_Row=ids_MergeCells.InsertRow(0)
  3576. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[lj]
  3577. ids_MergeCells.Object.StartCol[li_Row]=li_StartCol
  3578. ids_MergeCells.Object.EndRow[li_Row]=lk
  3579. ids_MergeCells.Object.EndCol[li_Row]=li_EndCol
  3580. END IF
  3581. IF ai_Row<idw_Requestor.RowCount() Then
  3582. ids_Column.Object.BeginRow[lj]=li_CurRow
  3583. ids_Column.Object.PriorValue[lj]=ls_Value
  3584. // 处理后面的列
  3585. For lj=1 To ids_Column.RowCount()
  3586. IF ids_Column.Object.StartCol[lj]>li_StartCol AND ids_Column.Object.Sparse[lj]="1" Then
  3587. IF lk>ids_Column.Object.BeginRow[lj] Then
  3588. li_Row=ids_MergeCells.InsertRow(0)
  3589. ids_MergeCells.Object.StartRow[li_Row]=ids_Column.Object.BeginRow[lj]
  3590. ids_MergeCells.Object.StartCol[li_Row]=ids_Column.Object.StartCol[lj]
  3591. ids_MergeCells.Object.EndRow[li_Row]=lk
  3592. ids_MergeCells.Object.EndCol[li_Row]=ids_Column.Object.EndCol[lj]
  3593. END IF
  3594. //由于排序方式一样
  3595. ids_Column.Object.BeginRow[lj]=lk+1
  3596. ids_Column.Object.PriorValue[lj]=ls_Value
  3597. END IF
  3598. Next
  3599. ELSE
  3600. //如果最后一行是被合并的,则不输出
  3601. IF lk>=li_CurRow Then
  3602. Continue
  3603. END IF
  3604. END IF
  3605. END IF
  3606. END IF
  3607. END IF
  3608. END IF
  3609. END IF
  3610. END IF
  3611. ELSE
  3612. IF ls_Visible="1" Then
  3613. ls_Value= idw_Requestor.Describe(ls_Name+".text")
  3614. IF Left(ls_Value,1)='"' OR Left(ls_Value,1)="'" Then
  3615. ls_Value =Mid(ls_Value,2, Len(ls_Value) -2)
  3616. END IF
  3617. lj=Pos(ls_Value,"~t")
  3618. //PB新版本支持Text对象的Text是一个表达式 2004-10-29
  3619. IF lj>0 Then
  3620. ls_Value=OF_Evaluate(Mid(ls_Value,lj+1),ai_Row)
  3621. END IF
  3622. END IF
  3623. END IF //{b}
  3624. IF li_StartRow<>li_EndRow OR li_StartCol<>li_EndCol Then //合并单元
  3625. invo_cell.EndRow= li_EndRow+ai_CurRow
  3626. invo_cell.EndCol= li_EndCol
  3627. IF li_StartRow<>li_EndRow Then
  3628. invo_cell.invo_format.ii_text_wrap=1
  3629. END IF
  3630. invo_worksheet.of_mergecells(li_CurRow,li_StartCol,li_EndRow+ai_CurRow,li_EndCol)
  3631. END IF
  3632. IF ls_Visible="1" Then
  3633. //如果单元在细节区,而且对象与前输出行与细节区第一行时输出的单元格式相同
  3634. //则直接取第一次输出时的单元格式,从而可以减少单元格式判断的次数
  3635. lb_flag=False
  3636. IF ib_GridBorder=False AND (as_Band="detail" OR Pos(as_Band,".")>0 ) AND ids_Objects.Object.ExpFlag[li]='0' Then
  3637. IF ids_Objects.Object.xfIndex[li]>0 Then
  3638. IF ids_Objects.Object.BorderKey[li] = String(invo_cell.invo_Format.ii_top,"00")+ String(invo_cell.invo_Format.ii_bottom,"00")+String(invo_cell.invo_Format.ii_left,"00")+String(invo_cell.invo_Format.ii_right,"00") Then
  3639. invo_Cell.ii_xf= ids_objects.Object.xfIndex[li]
  3640. lb_flag=True
  3641. END IF
  3642. END IF
  3643. END IF
  3644. IF lb_flag=False AND ( invo_cell.is_value="" OR Not lb_overlap ) Then //如果多个对象重复输出到同一单元,则以第一次取的格式为准
  3645. IF ids_Objects.Object.FontSizeExp[li]="" Then
  3646. invo_cell.invo_format.ii_size = ids_Objects.Object.FontSize[li]
  3647. ELSE
  3648. invo_cell.invo_format.ii_size =ABS(Long(OF_Evaluate(ids_Objects.Object.FontSizeExp[li],ai_Row)))
  3649. END IF
  3650. IF ids_Objects.Object.FontNameExp[li]="" Then
  3651. invo_cell.invo_format.is_font = ids_Objects.Object.FontName[li]
  3652. ELSE
  3653. invo_cell.invo_format.is_font = OF_Evaluate(ids_Objects.Object.FontNameExp[li],ai_Row)
  3654. END IF
  3655. IF ids_Objects.Object.fontweightexp[li]="" Then
  3656. invo_cell.invo_format.ii_bold = ids_Objects.Object.Fontweight[li]
  3657. ELSE
  3658. invo_cell.invo_format.ii_bold =Long(OF_Evaluate(ids_Objects.Object.fontweightexp[li],ai_Row))
  3659. END IF
  3660. IF ids_Objects.Object.Fontitalicexp[li]="" Then
  3661. invo_cell.invo_format.ii_italic = Long(ids_Objects.Object.Fontitalic[li])
  3662. ELSE
  3663. invo_cell.invo_format.ii_italic = Long(OF_Evaluate(ids_Objects.Object.Fontitalicexp[li],ai_Row))
  3664. END IF
  3665. IF ids_Objects.Object.Alignmentexp[li]="" Then
  3666. invo_cell.invo_format.ii_text_h_align=ids_Objects.Object.Alignment[li]
  3667. ELSE
  3668. Choose Case OF_Evaluate(ids_Objects.Object.Alignmentexp[li],ai_Row)
  3669. Case "1" //右对齐
  3670. invo_cell.invo_format.ii_text_h_align=3
  3671. Case "2" //中对齐
  3672. invo_cell.invo_format.ii_text_h_align=2
  3673. Case Else //均匀对齐,调整为左对齐
  3674. invo_cell.invo_format.ii_text_h_align=1
  3675. END CHOOSE
  3676. END IF
  3677. IF ids_Objects.Object.FontColorexp[li]="" Then
  3678. invo_cell.invo_format.ii_color=ids_Objects.Object.FontColor[li]
  3679. ELSE
  3680. li_color=long(OF_Evaluate(ids_Objects.Object.FontColorexp[li],ai_Row))
  3681. li_color = invo_colors.of_get_color(li_color )
  3682. invo_cell.invo_format.ii_color= invo_colors.of_get_custom_color_index(li_color)
  3683. END IF
  3684. IF ids_Objects.Object.bgColorexp[li]="" Then
  3685. if ids_Objects.Object.bgColor[li]<>65 and ids_Objects.Object.bgColor[li]<>0 then //以免破坏按带区设置了颜色的情况
  3686. invo_cell.invo_format.of_set_bg_color(Long(ids_Objects.Object.bgColor[li]))
  3687. end if
  3688. ELSE
  3689. li_color=long(OF_Evaluate(ids_Objects.Object.bgColorexp[li],ai_Row))
  3690. li_color = invo_colors.of_get_color(li_color )
  3691. if li_color<>0 then
  3692. li_color= invo_colors.of_get_custom_color_index(li_color)
  3693. end if
  3694. if li_color<>65 and li_color<>0 then
  3695. invo_cell.invo_format.of_set_bg_color(li_color)
  3696. end if
  3697. END IF
  3698. END IF
  3699. IF ls_Value="!" or ls_Value="?" Then
  3700. ls_Value=""
  3701. END IF
  3702. IF ls_Value<>"" or ids_Objects.Object.ObjSpace[li]>0 OR ids_Objects.Object.MergeFlag[li]="1" Then
  3703. IF ids_Objects.Object.ObjSpace[li]>0 Then
  3704. ls_Value=OF_GetObjSpace(ids_Objects.Object.ObjSpace[li])+ls_Value
  3705. ELSE
  3706. IF ids_Objects.Object.MergeFlag[li]="1" Then
  3707. ls_Value=ls_Value+Mid(OF_GetObjSpace(ids_Objects.Object.Width[li]),Len(ls_Value)+1)
  3708. END IF
  3709. END IF
  3710. END IF
  3711. IF lb_overlap Then
  3712. invo_Cell.is_CellType='S'
  3713. invo_Cell.invo_format.is_num_format="General" //设为常规
  3714. ELSE
  3715. //如果列输出的是显示值,则设置为常规,否则可能会导出输出错误 2004 -11 -11
  3716. IF ids_Objects.Object.DisplayValue[li]='1' Then
  3717. invo_Cell.is_CellType='S'
  3718. ELSE
  3719. invo_Cell.is_CellType=ls_ColType
  3720. END IF
  3721. END IF
  3722. invo_cell.is_value+=ls_value
  3723. //同一列的同一对象,格式可能是一样的,避免重复注册单元格式,提高处理速度
  3724. IF ib_GridBorder=False AND (as_Band="detail" OR Pos(as_Band,".")>0 ) AND ids_Objects.Object.ExpFlag[li]='0' Then
  3725. IF ids_Objects.Object.xfIndex[li]=0 Then
  3726. invo_cell.ii_xf =invo_cell.invo_WorkSheet.invo_WorkBook.OF_Reg_Format(invo_cell.invo_Format) +14
  3727. ids_objects.Object.xfIndex[li] = invo_cell.ii_xf
  3728. ids_Objects.Object.BorderKey[li] = String(invo_cell.invo_Format.ii_top,"00")+ String(invo_cell.invo_Format.ii_bottom,"00")+String(invo_cell.invo_Format.ii_left,"00")+String(invo_cell.invo_Format.ii_right,"00")
  3729. END IF
  3730. END IF
  3731. END IF
  3732. Next
  3733. is_OldBand=as_Band
  3734. Return li_outlines
  3735. end function
  3736. protected function long of_parsetoarray (string as_source, string as_delimiter, ref string as_array[]);//////////////////////////////////////////////////////////////////////////////
  3737. //
  3738. // Function: of_ParseToArray
  3739. //
  3740. // Access: public
  3741. //
  3742. // Arguments:
  3743. // as_Source The string to parse.
  3744. // as_Delimiter The delimeter string.
  3745. // as_Array[] The array to be filled with the parsed strings, passed by reference.
  3746. //
  3747. // Returns: long
  3748. // The number of elements in the array.
  3749. // If as_Source or as_Delimeter is NULL, function returns NULL.
  3750. //
  3751. // Description: Parse a string into array elements using a delimeter string.
  3752. //
  3753. //////////////////////////////////////////////////////////////////////////////
  3754. //
  3755. // Revision History
  3756. //
  3757. // Version
  3758. // 5.0 Initial version
  3759. // 5.0.02 Fixed problem when delimiter is last character of string.
  3760. // Ref array and return code gave incorrect results.
  3761. //
  3762. //////////////////////////////////////////////////////////////////////////////
  3763. //
  3764. // Copyright ?1996-1997 Sybase, Inc. and its subsidiaries. All rights reserved.
  3765. // Any distribution of the PowerBuilder Foundation Classes (PFC)
  3766. // source code by other than Sybase, Inc. and its subsidiaries is prohibited.
  3767. //
  3768. //////////////////////////////////////////////////////////////////////////////
  3769. long ll_DelLen, ll_Pos, ll_Count, ll_Start, ll_Length
  3770. string ls_holder
  3771. //Check for NULL
  3772. IF IsNull(as_source) or IsNull(as_delimiter) Then
  3773. long ll_null
  3774. SetNull(ll_null)
  3775. Return ll_null
  3776. End If
  3777. //Check for at leat one entry
  3778. If Trim (as_source) = '' Then
  3779. Return 0
  3780. End If
  3781. //Get the length of the delimeter
  3782. ll_DelLen = Len(as_Delimiter)
  3783. ll_Pos = Pos(Upper(as_source), Upper(as_Delimiter))
  3784. //Only one entry was found
  3785. if ll_Pos = 0 then
  3786. as_Array[1] = as_source
  3787. return 1
  3788. end if
  3789. //More than one entry was found - loop to get all of them
  3790. ll_Count = 0
  3791. ll_Start = 1
  3792. Do While ll_Pos > 0
  3793. //Set current entry
  3794. ll_Length = ll_Pos - ll_Start
  3795. ls_holder = Mid (as_source, ll_start, ll_length)
  3796. // Update array and counter
  3797. ll_Count ++
  3798. as_Array[ll_Count] = ls_holder
  3799. //Set the new starting position
  3800. ll_Start = ll_Pos + ll_DelLen
  3801. ll_Pos = Pos(Upper(as_source), Upper(as_Delimiter), ll_Start)
  3802. Loop
  3803. //Set last entry
  3804. ls_holder = Mid (as_source, ll_start, Len (as_source))
  3805. // Update array and counter if necessary
  3806. if Len (ls_holder) > 0 then
  3807. ll_count++
  3808. as_Array[ll_Count] = ls_holder
  3809. end if
  3810. //Return the number of entries found
  3811. Return ll_Count
  3812. end function
  3813. public subroutine of_setgroupoutflag (boolean as_flag);ib_GroupOutFlag=as_Flag
  3814. end subroutine
  3815. protected function string of_getdata (readonly long ai_row, readonly string as_objectname, readonly string as_coltype, string as_format, string as_displayvalue, string as_columnflag, boolean ab_overlap);String ls_Ret
  3816. //如果同一单元没有多个对象输出
  3817. IF as_displayvalue="1" OR ab_overlap=False Then
  3818. as_Format=""
  3819. END IF
  3820. IF ai_Row<=0 Then
  3821. ls_ret=idw_Requestor.Describe("Evaluate('"+as_objectname+"',0)")
  3822. IF ls_ret="!" OR ls_Ret="?" Then
  3823. ls_ret =""
  3824. END IF
  3825. IF as_Format<>"" Then
  3826. IF as_colType="DT" Then
  3827. // ls_ret=String(DateTime(Blob(ls_ret)),as_format) //在PB6版本不能正常计算
  3828. Int li_Pos
  3829. Time lt_Time
  3830. li_Pos=Pos(ls_ret," ")
  3831. IF li_Pos>0 Then
  3832. lt_Time=Time(Mid(ls_ret ,li_Pos+1))
  3833. ls_ret = Left(ls_ret ,li_Pos -1)
  3834. ELSE
  3835. lt_Time=Time("00:00:00")
  3836. END IF
  3837. IF Not IsDate(ls_ret) Then
  3838. ls_ret="1900-01-01"
  3839. END IF
  3840. ls_Ret=String(DateTime(Date(ls_Ret),lt_Time),as_Format)
  3841. ELSEIF as_colType="D" Then
  3842. ls_ret=String(Date(ls_ret),as_format)
  3843. END IF
  3844. END IF
  3845. Return ls_Ret
  3846. END IF
  3847. IF as_displayvalue='1' AND as_ColumnFlag='1' Then
  3848. ls_ret= idw_Requestor.Describe("Evaluate('LookUpDisplay("+as_objectname+") ', " +string(ai_row)+ ")")
  3849. IF ls_ret<>"!" AND ls_Ret<>"?" Then
  3850. Return ls_ret
  3851. END IF
  3852. END IF
  3853. Choose Case as_colType
  3854. Case "S"
  3855. ls_ret=idw_Requestor.GetItemString(ai_row,as_objectname)
  3856. Case "N"
  3857. ls_ret=String(idw_Requestor.GetItemNumber(ai_row,as_objectname))
  3858. Case "DT"
  3859. ls_ret= String(idw_Requestor.GetItemDateTime(ai_row,as_objectname),as_format)
  3860. CASE "D"
  3861. ls_ret=String(idw_Requestor.GetItemDate(ai_row,as_objectname),as_format)
  3862. Case "T"
  3863. ls_ret=String(idw_Requestor.GetItemTime(ai_row,as_objectname),as_format)
  3864. END CHOOSE
  3865. IF IsNull(ls_ret) OR Trim(ls_ret)="" OR ls_Ret="!" OR ls_Ret="?" Then
  3866. ls_ret= ""
  3867. END IF
  3868. IF as_displayvalue='1' AND as_ColumnFlag='0' AND ls_Ret<>"" Then
  3869. String ls_Values
  3870. String ls_ColType
  3871. String ls_DataColumn
  3872. Long li ,lj
  3873. DataWindowChild dwc
  3874. IF idw_Requestor.Describe(as_objectname+".Edit.Style")="dddw" Then
  3875. idw_Requestor.GetChild(as_objectname,dwc)
  3876. IF isValid(dwc) Then
  3877. ls_DataColumn=idw_Requestor.Describe(as_objectname+".DDDW.DataColumn")
  3878. ls_ColType = dwc.Describe(ls_DataColumn+".ColType")
  3879. Choose Case Left(ls_ColType,4)
  3880. Case "char",'date'
  3881. li=dwc.Find(ls_DataColumn+"='"+ls_ret+"'",1,dwc.RowCount())
  3882. Case Else
  3883. li=dwc.Find(ls_DataColumn+"="+ls_ret,1,dwc.RowCount())
  3884. END CHOOSE
  3885. IF li>0 Then
  3886. ls_ret=dwc.Describe("Evaluate('"+idw_Requestor.Describe(as_objectname+".DDDW.DisplayColumn")+"',"+String(li)+" )")
  3887. END IF
  3888. END IF
  3889. ELSE
  3890. ls_Values = idw_Requestor.Describe(as_objectname+".Values")
  3891. li= Pos( ls_Values, "~t"+ls_Ret)
  3892. IF li>0 Then
  3893. lj = of_LastPos( Left(ls_Values ,li) ,"/")
  3894. ls_Ret = Mid ( ls_Values ,lj+1 , li - lj -1)
  3895. END IF
  3896. END IF
  3897. IF IsNull(ls_ret) OR Trim(ls_ret)="" OR ls_Ret="!" OR ls_Ret="?" Then
  3898. ls_ret= ""
  3899. END IF
  3900. END IF
  3901. Return ls_ret
  3902. end function
  3903. protected function string of_getdata (datastore a_ds, long ai_row, string as_objectname, string as_coltype, string as_format, string as_displayvalue, string as_columnflag, boolean ab_overlap);String ls_Ret
  3904. //如果同一单元没有多个对象输出
  3905. IF as_displayvalue="1" OR ab_overlap=False Then
  3906. as_Format=""
  3907. END IF
  3908. IF ai_Row<=0 Then
  3909. ls_ret=a_ds.Describe("Evaluate('"+as_objectname+"',0)")
  3910. IF ls_ret="!" OR ls_Ret="?" Then
  3911. ls_ret =""
  3912. END IF
  3913. IF as_Format<>"" Then
  3914. IF as_colType="DT" Then
  3915. // ls_ret=String(DateTime(Blob(ls_ret)),as_format) //在PB6版本不能正常计算
  3916. Int li_Pos
  3917. Time lt_Time
  3918. li_Pos=Pos(ls_ret," ")
  3919. IF li_Pos>0 Then
  3920. lt_Time=Time(Mid(ls_ret ,li_Pos+1))
  3921. ls_ret = Left(ls_ret ,li_Pos -1)
  3922. ELSE
  3923. lt_Time=Time("00:00:00")
  3924. END IF
  3925. IF Not IsDate(ls_ret) Then
  3926. ls_ret="1900-01-01"
  3927. END IF
  3928. ls_Ret=String(DateTime(Date(ls_Ret),lt_Time),as_Format)
  3929. ELSEIF as_colType="D" Then
  3930. ls_ret=String(Date(ls_ret),as_format)
  3931. END IF
  3932. END IF
  3933. Return ls_Ret
  3934. END IF
  3935. IF as_displayvalue='1' AND as_ColumnFlag='1' Then
  3936. ls_ret= a_ds.Describe("Evaluate('LookUpDisplay("+as_objectname+") ', " +string(ai_row)+ ")")
  3937. IF ls_ret<>"!" AND ls_Ret<>"?" Then
  3938. Return ls_ret
  3939. END IF
  3940. END IF
  3941. Choose Case as_colType
  3942. Case "S"
  3943. ls_ret=a_ds.GetItemString(ai_row,as_objectname)
  3944. Case "N"
  3945. ls_ret=String(a_ds.GetItemNumber(ai_row,as_objectname))
  3946. Case "DT"
  3947. ls_ret= String(a_ds.GetItemDateTime(ai_row,as_objectname),as_format)
  3948. CASE "D"
  3949. ls_ret=String(a_ds.GetItemDate(ai_row,as_objectname),as_format)
  3950. Case "T"
  3951. ls_ret=String(a_ds.GetItemTime(ai_row,as_objectname),as_format)
  3952. END CHOOSE
  3953. IF IsNull(ls_ret) OR Trim(ls_ret)="" OR ls_Ret="!" OR ls_Ret="?" Then
  3954. ls_ret= ""
  3955. END IF
  3956. IF as_displayvalue='1' AND as_ColumnFlag='0' AND ls_Ret<>"" Then
  3957. String ls_Values
  3958. String ls_ColType
  3959. String ls_DataColumn
  3960. Long li ,lj
  3961. DataWindowChild dwc
  3962. IF a_ds.Describe(as_objectname+".Edit.Style")="dddw" Then
  3963. a_ds.GetChild(as_objectname,dwc)
  3964. IF isValid(dwc) Then
  3965. ls_DataColumn=a_ds.Describe(as_objectname+".DDDW.DataColumn")
  3966. ls_ColType = dwc.Describe(ls_DataColumn+".ColType")
  3967. Choose Case Left(ls_ColType,4)
  3968. Case "char",'date'
  3969. li=dwc.Find(ls_DataColumn+"='"+ls_ret+"'",1,dwc.RowCount())
  3970. Case Else
  3971. li=dwc.Find(ls_DataColumn+"="+ls_ret,1,dwc.RowCount())
  3972. END CHOOSE
  3973. IF li>0 Then
  3974. ls_ret=dwc.Describe("Evaluate('"+a_ds.Describe(as_objectname+".DDDW.DisplayColumn")+"',"+String(li)+" )")
  3975. END IF
  3976. END IF
  3977. ELSE
  3978. ls_Values = a_ds.Describe(as_objectname+".Values")
  3979. li= Pos( ls_Values, "~t"+ls_Ret)
  3980. IF li>0 Then
  3981. lj = of_LastPos( Left(ls_Values ,li) ,"/")
  3982. ls_Ret = Mid ( ls_Values ,lj+1 , li - lj -1)
  3983. END IF
  3984. END IF
  3985. IF IsNull(ls_ret) OR Trim(ls_ret)="" OR ls_Ret="!" OR ls_Ret="?" Then
  3986. ls_ret= ""
  3987. END IF
  3988. END IF
  3989. Return ls_ret
  3990. end function
  3991. public function long of_lastpos (string as_source, string as_target);//不直接使用LastPos,是因为PB6.5版本不支持LastPos函数
  3992. Return of_LastPos (as_source, as_target, Len(as_Source))
  3993. end function
  3994. public function long of_lastpos (string as_source, string as_target, long al_start);//////////////////////////////////////////////////////////////////////////////
  3995. //
  3996. // Function: of_LastPos
  3997. //
  3998. // Access: public
  3999. //
  4000. // Arguments:
  4001. // as_Source The string being searched.
  4002. // as_Target The being searched for.
  4003. // al_start The starting position, 0 means start at the end.
  4004. //
  4005. // Returns: Long
  4006. // The position of as_Target.
  4007. // If as_Target is not found, function returns a 0.
  4008. // If any argument's value is NULL, function returns NULL.
  4009. //
  4010. // Description: Search backwards through a string to find the last occurrence
  4011. // of another string.
  4012. //
  4013. //////////////////////////////////////////////////////////////////////////////
  4014. //
  4015. // Revision History
  4016. //
  4017. // Version
  4018. // 5.0 Initial version
  4019. //
  4020. //////////////////////////////////////////////////////////////////////////////
  4021. //
  4022. // Copyright ?1996-1997 Sybase, Inc. and its subsidiaries. All rights reserved.
  4023. // Any distribution of the PowerBuilder Foundation Classes (PFC)
  4024. // source code by other than Sybase, Inc. and its subsidiaries is prohibited.
  4025. //
  4026. //////////////////////////////////////////////////////////////////////////////
  4027. Long ll_Cnt, ll_Pos
  4028. //Check for Null Parameters.
  4029. IF IsNull(as_source) or IsNull(as_target) or IsNull(al_start) Then
  4030. SetNull(ll_Cnt)
  4031. Return ll_Cnt
  4032. End If
  4033. //Check for an empty string
  4034. If Len(as_Source) = 0 Then
  4035. Return 0
  4036. End If
  4037. // Check for the starting position, 0 means start at the end.
  4038. If al_start=0 Then
  4039. al_start=Len(as_Source)
  4040. End If
  4041. //Perform find
  4042. For ll_Cnt = al_start to 1 Step -1
  4043. ll_Pos = Pos(as_Source, as_Target, ll_Cnt)
  4044. If ll_Pos = ll_Cnt Then
  4045. //String was found
  4046. Return ll_Cnt
  4047. End If
  4048. Next
  4049. //String was not found
  4050. Return 0
  4051. end function
  4052. public function integer of_iswraptext (string as_fontname, integer ai_fontsize, integer ai_fontweight, integer ai_height);
  4053. Integer li
  4054. Integer li_WM_GETFONT = 49 // hex 0x0031
  4055. ULong lul_Hdc, lul_Handle, lul_hFont
  4056. os_size lstr_Size
  4057. For li = 1 To UpperBound( istr_FontList)
  4058. IF istr_FontList[li].FontName= as_fontname AND istr_FontList[li].FontSize = ai_FontSize AND istr_FontList[li].FontWeight=ai_fontweight Then
  4059. IF (ai_Height / istr_FontList[li].FontHeight)>=2 Then
  4060. Return 1
  4061. ELSE
  4062. Return 0
  4063. END IF
  4064. END IF
  4065. Next
  4066. if IsNull(iw_Parent) Or Not IsValid (iw_Parent) then
  4067. OF_OpenUserObject()
  4068. end if
  4069. IF IsNull(iuo_Text) OR Not IsValid(iuo_Text) Then
  4070. OF_OpenUserObject()
  4071. END IF
  4072. iuo_Text.FaceName = as_FontName
  4073. iuo_Text.TextSize = ai_FontSize
  4074. iuo_Text.Weight = ai_fontweight
  4075. // Get the handle of the StaticText Object and create a Device Context
  4076. lul_Handle = Handle(iuo_Text)
  4077. lul_Hdc = GetDC(lul_Handle)
  4078. // Get the font in use on the Static Textd
  4079. lul_hFont = Send(lul_Handle, li_WM_GETFONT, 0, 0)
  4080. // Select it into the device context
  4081. SelectObject(lul_Hdc, lul_hFont)
  4082. // Get the size of the text.
  4083. GetTextExtentPoint32W(lul_Hdc, ' ', 1, lstr_Size )
  4084. ReleaseDC(lul_Handle, lul_Hdc)
  4085. IF lstr_size.l_cy >0 Then
  4086. li= UpperBound( istr_FontList) +1
  4087. istr_FontList[li].FontName= as_fontname
  4088. istr_FontList[li].FontSize = ai_FontSize
  4089. istr_FontList[li].FontWeight=ai_fontweight
  4090. istr_FontList[li].FontHeight = PixelsToUnits(lstr_size.l_cy,YPixelsToUnits!)
  4091. IF (ai_Height / istr_FontList[li].FontHeight)>=2 Then
  4092. Return 1
  4093. ELSE
  4094. Return 0
  4095. END IF
  4096. END IF
  4097. Return 0
  4098. end function
  4099. on n_cst_dw2excel_import.create
  4100. call super::create
  4101. TriggerEvent( this, "constructor" )
  4102. end on
  4103. on n_cst_dw2excel_import.destroy
  4104. TriggerEvent( this, "destructor" )
  4105. call super::destroy
  4106. end on