n_cst_dw2excel.sru 168 KB

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