$PBExportHeader$n_dw2xls_band.sru forward global type n_dw2xls_band from nonvisualobject end type end forward global type n_dw2xls_band from nonvisualobject end type global n_dw2xls_band n_dw2xls_band type variables n_dw2xls_object inv_Objects[] n_dw2xls_Line inv_VLines[] //竖线 n_dw2xls_Line inv_HLines[] //横线 CONSTANT LONG COLOR_TRANSPARENT= 536870912 Private: uLong il_hSheet string is_Name Long il_BkColor String is_BKColorExp Long il_BandHeight Long il_BottomSpaceHeight //如果数据窗口是Nest类型,当带区是detail区时,最后对象的Y2与细节区Y2之间的空白,会显示空白,这样可以插入一行空记录来实行 Boolean ib_IsGroupBand =False Boolean ib_NewPage =False Boolean ib_FirstOut=TRUE Boolean ib_AutoHeight =False Boolean ib_HasNestReport =False Boolean ib_DynamicRowInfo =False //带区内的对象,如果动态调整了Y,HEIGHT的值,需要动态重新计算行列位置 int ii_rowSpace=20 Int ii_PictureObjCount=0 n_dw2xls_Requestor inv_Requestor n_dw2xls_Layout inv_Layout n_dw2xls_WinApi inv_Api Datastore ids_Rows end variables forward prototypes public subroutine of_addobject (n_dw2xls_object anv_object) public subroutine of_sortobject_x () public subroutine of_sortobject_y () public subroutine of_sortline () public function String of_getname () public subroutine of_addhline (n_dw2xls_line anv_line) public subroutine of_addvline (n_dw2xls_line anv_line) public subroutine of_adjustposition (n_dw2xls_band anv_detail) public function integer of_getvlinescount () public subroutine of_getlinecolrowinfo () public subroutine of_setrequestor (readonly n_dw2xls_requestor anv_requestor, readonly string as_name) public subroutine of_registcolumninfo_1 () public subroutine of_registcolumninfo_2 () public function integer of_rowcount () protected subroutine of_writepicture (readonly n_dw2xls_object anv_object, readonly long al_row, readonly long al_xlsrow) public subroutine of_calcpictureoffset () public function Long of_getbkcolor () public subroutine of_sortobject_row () public subroutine of_setbkcolor (readonly long al_bkcolor, readonly string as_bkcolorexp) public subroutine of_setcellborder () public subroutine of_sortobject_col () public subroutine of_adjustposition () public subroutine of_getobjectborderinfo () public function n_dw2xls_Requestor of_getrequestor () public function Boolean of_existsobject (readonly string as_name) public subroutine of_setdynamicrowinfo (readonly boolean ab_flag) public subroutine of_refreshrowinfo (long al_row) public subroutine of_getcolrowinfo2 () public subroutine of_getcolrowinfo () public subroutine of_updatecolumninfo () public subroutine of_setworksheet (readonly unsignedlong al_hsheet) public function long of_output (readonly long al_row, readonly long al_xlsrow) public subroutine of_writeborder (readonly n_dw2xls_line anv_line, readonly long al_xlsrow) protected subroutine of_writeformat (readonly n_dw2xls_object anv_object, readonly long al_xlsrow, readonly long pcell, readonly long al_row) protected subroutine of_writevalue (readonly n_dw2xls_object anv_object, readonly long pcell, readonly long al_row, ref boolean ab_writevalue, ref boolean ab_samevalue) public subroutine of_registcolumninfo_3 () public function integer of_gety1 (long ai_row) public function Long of_gety2 (integer ai_row) public subroutine of_updatebandheight (readonly long ai_height) public function Long of_getrowheight (integer ai_row) public function Long of_getbandheight () public function integer of_getstartrow (long ai_y) public function integer of_getendrow (long ai_y) public function Long getrowheight (integer ai_row) public function Long of_getbottomspaceheight () protected subroutine of_writerowheight (readonly long al_row, readonly long al_xlsrow) end prototypes public subroutine of_addobject (n_dw2xls_object anv_object);IF IsValid(anv_object) Then inv_objects[UpperBound(inv_objects)+1] = anv_object IF anv_Object.IsPicture OR anv_Object.IsGraph Then ii_PictureObjCount ++ END IF IF inv_Requestor.OF_GetProcessing()<>'1' AND inv_Requestor.OF_GetProcessing()<>'4' Then IF anv_object.X1inv_Layout.il_last_x2 Then inv_Layout.il_last_x2 = anv_object.OF_GetTextRect_X2() END IF END IF IF inv_Requestor.OF_IsNested() AND ib_HasNestReport=False Then IF IsValid(anv_object.Inv_Report) Then ib_HasNestReport=TRUE END IF END IF END IF end subroutine public subroutine of_sortobject_x ();Int li,lj,li_cnt Boolean lb_Stop n_dw2xls_Object lnv_Temp //先按X值按序,再按Y值排序 li_cnt = UpperBound(inv_Objects) lb_Stop=False Do While Not lb_Stop lb_Stop=TRUE For li=1 TO li_cnt -1 lj =li+1 IF inv_Objects[lj ].x1= anv_Line.Y1 Then IF lnv_Line.x2>=( anv_Line.x1 -20) AND lnv_Line.x1<=(anv_Line.x2 +20) AND & lnv_Line.PenColor = anv_Line.PenColor AND lnv_Line.PenWidth = anv_Line.PenWidth AND & lnv_Line.VisibleExp=anv_Line.VisibleExp Then IF lnv_Line.x1>anv_Line.x1 Then lnv_Line.x1 = anv_Line.x1 END IF IF lnv_Line.x2= anv_Line.x1 Then IF lnv_Line.y2>=( anv_Line.y1 -20) AND lnv_Line.y1<=(anv_Line.y2 +20) AND & lnv_Line.PenColor = anv_Line.PenColor AND lnv_Line.PenWidth = anv_Line.PenWidth AND & lnv_Line.VisibleExp=anv_Line.VisibleExp Then IF lnv_Line.y1>anv_Line.y1 Then lnv_Line.y1 = anv_Line.y1 END IF IF lnv_Line.y2inv_Layout.il_last_x2 Then inv_Layout.il_last_x2 =anv_Line.X2 END IF END IF end subroutine public subroutine of_adjustposition (n_dw2xls_band anv_detail);Int li, lj, lk ,li_cnt Long li_X1, li_X2 n_dw2xls_Object lnv_Object , lnv_Object2 ,lnv_Object3 IF is_Name="detail" Then Return END IF anv_Detail.OF_SortObject_X() li_cnt =UpperBound(anv_Detail.inv_Objects) For li=1 To UpperBound(inv_Objects) lnv_Object = inv_Objects[li] For lj=1 TO li_cnt lnv_Object2= anv_Detail.inv_Objects[lj] IF lnv_Object.Name=lnv_Object2.Name+"_t" AND & lnv_Object.X1lnv_Object2.X1 Then li_X1 = lnv_Object.X1 li_X2 = lnv_Object.X2 IF lnv_Object.X1>li_X1 Then //找到前面一列 For lk =lj -1 To 1 Step -1 lnv_Object3 = anv_Detail.inv_Objects[lk] IF lnv_Object3.X2 lnv_Object2.Y1 AND & lnv_Object3.Y1< lnv_Object2.Y2 Then IF lnv_Object3.X2>li_X1 Then li_X1= lnv_Object3.X2 END IF Exit END IF Next END IF IF lnv_Object2.X1 >li_X1 Then lnv_Object2.X1 =li_X1 END IF IF li_X2> lnv_Object2.X2 Then //找到后面一列 For lk =lj +1 To li_cnt lnv_Object3 = anv_Detail.inv_Objects[lk] IF lnv_Object3.X1>li_X2 Then Exit END IF IF ( lnv_Object3.X2>li_X2 OR lnv_Object3.X2>lnv_Object2.X2) AND & lnv_Object3.Y2> lnv_Object2.Y1 AND & lnv_Object3.Y1< lnv_Object2.Y2 Then IF lnv_Object3.X1 lnv_Object2.X2 Then lnv_Object2.X2 =li_X2 END IF lnv_Object.X1= lnv_Object2.X1 lnv_Object.X2= lnv_Object2.X2 Exit END IF Next Next end subroutine public function integer of_getvlinescount ();Return UpperBound(inv_VLines) end function public subroutine of_getlinecolrowinfo ();Int li,lj, li_Find Int li_StartRow, li_StartCol, li_EndRow, li_EndCol n_dw2xls_line lnv_line //带区只有横线,而且是作为上一带区的下边线或下一带区的上边线用的 IF UpperBound(inv_Objects)=0 AND UpperBound(inv_VLines)=0 AND & ids_Rows.RowCount()=1 AND il_BandHeight<=30 Then For li=1 TO UpperBound(inv_HLines) lnv_line = inv_HLines[li] lnv_Line.StartCol = inv_Layout.OF_GetStartColumn(lnv_Line.X1+5 ) lnv_Line.EndCol = inv_Layout.OF_GetEndColumn(lnv_Line.X2 -5 ) IF is_Name="header" OR is_Name="header[1]" Then lnv_Line.StartRow =1 lnv_Line.EndRow =1 lnv_Line.ii_TopBottom =1 ELSE lnv_Line.StartRow =0 lnv_Line.EndRow =0 lnv_Line.ii_TopBottom =2 END IF Next ids_Rows.Reset() Return END IF For li=1 To UpperBound(inv_VLines) lnv_Line = inv_VLines[li] IF lnv_Line.IsClone Then Continue END IF lnv_Line.StartRow = OF_GetStartRow(lnv_Line.Y1 ) lnv_Line.EndRow = OF_GetEndRow(lnv_Line.Y2 ) li_Find=inv_Layout.ids_Columns.Find("x2="+String(lnv_Line.x1),1,inv_Layout.ids_Columns.RowCount()) IF li_Find>0 Then lnv_Line.StartCol = li_Find lnv_Line.EndCol = li_Find lnv_Line.ii_LeftRight =2 Continue END IF li_Find=inv_Layout.ids_Columns.Find("x1="+String(lnv_Line.x1),1,inv_Layout.ids_Columns.RowCount()) IF li_Find>0 Then lnv_Line.StartCol = li_Find lnv_Line.EndCol = li_Find lnv_Line.ii_LeftRight =1 Continue END IF li_Find=inv_Layout.ids_Columns.Find("x2<"+String(lnv_Line.x1+inv_Layout.ii_ColSpace)+" AND x2> "+String(lnv_Line.x1 - inv_Layout.ii_ColSpace),1,inv_Layout.ids_Columns.RowCount()) IF li_Find>0 Then lnv_Line.StartCol = li_Find lnv_Line.EndCol = li_Find lnv_Line.ii_LeftRight =2 Continue END IF li_Find=inv_Layout.ids_Columns.Find("x1<"+String(lnv_Line.x1+inv_Layout.ii_ColSpace)+" AND X1> "+String(lnv_Line.x1 - inv_Layout.ii_ColSpace),1,inv_Layout.ids_Columns.RowCount()) IF li_Find>0 Then lnv_Line.StartCol = li_Find lnv_Line.EndCol = li_Find lnv_Line.ii_LeftRight =1 Continue END IF Next For li=1 To UpperBound(inv_HLines) lnv_Line = inv_HLines[li] IF lnv_Line.IsClone Then Continue END IF lnv_Line.StartCol = inv_Layout.OF_GetStartColumn(lnv_Line.X1+5 ) lnv_Line.EndCol = inv_Layout.OF_GetEndColumn(lnv_Line.X2 -5 ) li_Find=ids_Rows.Find("y2="+String(lnv_Line.y1),1,ids_Rows.RowCount()) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom=2 Continue END IF li_Find=ids_Rows.Find("y1="+String(lnv_Line.y1),1,ids_Rows.RowCount()) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom =1 Continue END IF li_Find=ids_Rows.Find("y2<"+String(lnv_Line.y1 + 30)+" AND Y2> "+String(lnv_Line.y1 - 30),1,ids_Rows.RowCount()) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom =2 Continue END IF li_Find=ids_Rows.Find("y1<"+String(lnv_Line.y1 + 30)+" AND Y1> "+String(lnv_Line.y1 -30),1,ids_Rows.RowCount()) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom =1 Continue END IF li_Find = ids_Rows.Find("Y1<"+String(lnv_Line.Y1)+" AND Y2>"+String(lnv_Line.Y1),1,ids_Rows.RowCount()) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find IF ( ids_Rows.GetItemNumber(li_Find,"Y2") - lnv_Line.Y1)> ( lnv_Line.Y1 - ids_Rows.GetItemNumber(li_Find,"Y1") +20 ) Then lnv_Line.ii_TopBottom =1 ELSE lnv_Line.ii_TopBottom =2 END IF Continue END IF li_Find=ids_Rows.Find(" Y1>"+String(lnv_Line.y1 ),1,ids_Rows.RowCount() ) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom =1 Continue END IF li_Find=ids_Rows.Find("y1<"+String(lnv_Line.y1 ),ids_Rows.RowCount(),1) IF li_Find>0 Then lnv_Line.StartRow = li_Find lnv_Line.EndRow = li_Find lnv_Line.ii_TopBottom =2 Continue END IF Next end subroutine public subroutine of_setrequestor (readonly n_dw2xls_requestor anv_requestor, readonly string as_name);String ls_Value, ls_Exp is_Name =as_Name inv_Requestor = anv_requestor inv_Layout= anv_requestor.OF_GetLayout() inv_Api = anv_Requestor.OF_GetWinApi() IF Not inv_Requestor.OF_IsWriteBKColor() Then il_BkColor = COLOR_TRANSPARENT ELSE inv_Requestor.OF_GetProperty("DataWindow."+is_Name+".Color", ls_Value, ls_Exp) IF IsNumber(ls_Value ) Then il_BkColor = inv_Api.OF_GetColor(Long(ls_Value) ) ELSE il_BkColor = COLOR_TRANSPARENT END IF is_BKColorExp=ls_Exp inv_Requestor.OF_AddExpression(is_BKColorExp) END IF il_BandHeight = inv_Requestor.OF_GetBandHeight(as_name) IF inv_Requestor.OF_Describe("DataWindow."+as_Name+".Height.AutoSize")="yes" Then ib_AutoHeight =TRUE END IF IF Pos(as_Name,"header.")>0 OR Pos(as_Name,"trailer.")>0 Then ib_IsGroupBand =TRUE END IF end subroutine public subroutine of_registcolumninfo_1 ();Int li , lj, li_ColSpace,li_ObjCount Long li_x1, li_Pre_X1, li_X2 n_dw2xls_Object lnv_Object, lnv_Object2 IF is_Name<>"detail" Then RETURN END IF //如果是Grid或 Crosstab类型的数据窗口,则按细节区的对象进行登记 //否则按细节区的竖线进行登记 IF inv_Requestor.OF_GetProcessing()='1' OR inv_Requestor.OF_GetProcessing()='4' Then For li=1 To UpperBound(inv_Objects) lnv_Object = inv_Objects[li] IF lnv_Object.ObjType="tempobj" Then Continue END IF IF inv_Requestor.OF_IsChild() Then inv_Layout.OF_RegistObject(lnv_Object.x1 ,TRUE ) ELSE inv_Layout.OF_RegistColumn(lnv_Object.x1 ) END IF IF lnv_Object.X2>li_X2 Then li_x2 = lnv_Object.X2 END IF Next IF inv_Requestor.OF_IsChild() Then inv_Layout.OF_RegistObject(li_x2,FALSE ) ELSE inv_Layout.OF_RegistColumn(li_x2) END IF ELSE li_Pre_X1 =0 li_ColSpace = inv_Layout.OF_GetColSpace() OF_SortLine() For li=1 To UpperBound(inv_VLines) li_x1 =inv_VLines[li].X1 //两个线条之间间隔很少,则处理为同一列 IF ( li_x1 - li_ColSpace )0 Then Continue END IF IF inv_Requestor.OF_IsChild() Then inv_Layout.OF_RegistObject(li_x1 ,TRUE) ELSE inv_Layout.OF_RegistColumn(li_x1 ) END IF li_Pre_x1 = li_x1 IF li_X1>li_x2 Then li_x2 = li_X1 END IF Next li_ObjCount = UpperBound(inv_Objects) For li=1 To li_ObjCount lnv_Object = inv_Objects[li] IF lnv_Object.ObjType="tempobj" Then Continue END IF IF IsValid(lnv_Object.inv_LeftLine)=False AND IsValid(lnv_Object.inv_RightLine)=False Then IF lnv_Object.alignment='1' Then inv_Layout.OF_RegistObject(lnv_Object.x2 ,FALSE) For lj=li -1 To 1 Step -1 lnv_Object2 = inv_Objects[lj] IF ( lnv_Object2.X2 +inv_Layout.ii_ColSpace)lnv_Object.Y1 AND & ( lnv_Object2.X2>=lnv_Object.X1 OR ( lnv_Object.X1 - lnv_Object2.X2)<=inv_Layout.ii_ColSpace ) Then IF lnv_Object2.X2 < lnv_Object.X1 Then inv_Layout.OF_RegistObject(lnv_Object2.x2,FALSE ) ELSE inv_Layout.OF_RegistObject(lnv_Object2.x1,TRUE ) END IF Exit END IF Next ELSEIF lnv_Object.alignment='2' Then inv_Layout.OF_RegistObject(lnv_Object.x1,TRUE ) inv_Layout.OF_RegistObject(lnv_Object.x2 ,FALSE ) ELSE inv_Layout.OF_RegistObject(lnv_Object.x1,TRUE ) END IF IF lnv_Object.X2>li_X2 Then li_x2 = lnv_Object.X2 END IF END IF Next IF inv_Requestor.OF_IsChild() Then inv_Layout.OF_RegistObject(li_x2,FALSE ) ELSE inv_Layout.OF_RegistColumn(li_x2) END IF END IF end subroutine public subroutine of_registcolumninfo_2 ();IF Not IsValid(inv_Requestor) Then Return END IF IF Not IsValid(inv_Layout) Then Return END IF Int li, lj Int li_Vlines, li_HLines ,li_ObjCount Int li_Find Long li_x1, li_x2 ,li_Y1, li_Y2,li_Pre_x1 ,li_Next_X1 Long li_ColSpace, li_RowSpace Boolean lb_HasLine ,lb_HasObject n_dw2xls_Line lnv_Line n_dw2xls_Object lnv_Object IF is_Name<>"detail" Then //如果是细节区, 已经在OF_RegistColumn_1登记过了 li_Pre_X1 =0 li_ColSpace = inv_Layout.OF_GetColSpace() For li=1 To UpperBound(inv_VLines) li_x1 =inv_VLines[li].X1 //两个线条之间间隔很少,则处理为同一列 IF ( li_x1 - li_ColSpace )0 Then Continue END IF inv_Layout.OF_RegistObject(li_x1,TRUE ) li_Pre_x1 = li_x1 Next END IF li_ObjCount = UpperBound(inv_Objects) For li=1 To li_ObjCount IF inv_Objects[li].ObjType="report" Then Continue END IF IF inv_Objects[li].ObjType="tempobj" Then Continue END IF lnv_Object = inv_Objects[li] IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then Continue END IF IF ( inv_Requestor.OF_GetProcessing()="1" OR inv_Requestor.OF_GetProcessing()="4" ) AND lnv_Object.IsForeGround=False Then IF Not inv_Requestor.OF_ContaintBand("detail") THEN inv_Layout.OF_RegistColumn(lnv_Object.X1 ) END IF Continue END IF IF lnv_Object.BorderStyle='2' OR lnv_Object.BorderStyle='4' Then IF lnv_Object.SkipBorder Then inv_Layout.OF_AddObject( lnv_Object) ELSE inv_Layout.OF_RegistObject(lnv_Object.X1,TRUE) inv_Layout.OF_RegistObject(lnv_Object.X2,FALSE ) END IF END IF Next For li=1 To UpperBound(inv_HLines) lnv_Line =inv_HLines[li] inv_Layout.OF_RegistObject(lnv_Line.X1,TRUE) inv_Layout.OF_RegistObject(lnv_Line.X2,FALSE ) Next end subroutine public function integer of_rowcount ();Return ids_Rows.RowCount() end function protected subroutine of_writepicture (readonly n_dw2xls_object anv_object, readonly long al_row, readonly long al_xlsrow);String ls_FileName IF anv_Object.IsGraph Then inv_Layout.OF_AddGraph(al_xlsRow + anv_Object.StartRow ,anv_Object.StartCol ,inv_Requestor , anv_Object.Name , anv_Object.Picture_OffsetX, anv_Object.Picture_OffsetY , anv_Object.Width , anv_Object.Height ) ELSE IF anv_Object.ObjType ="bitmap" Then ls_FileName = anv_Object.PictureName ELSEIF anv_Object.ObjType="column" Then ls_FileName = inv_Requestor.OF_GetItemString(al_Row, anv_Object.Name) ELSEIF anv_Object.ObjType="compute" Then ls_FileName = inv_Requestor.OF_Evaluate(al_Row , anv_Object.PictureExp ) //不能用OF_GetExpValue END IF IF Pos(ls_FileName,":")=0 Then IF Left(ls_FileName,1)="\" THen ls_FileName =Left(inv_Api.OF_GetAppPath(),2)+ls_FileName ELSE ls_FileName=inv_Api.OF_GetAppPath() +ls_FileName END IF END IF IF FileExists(ls_FileName) Then inv_Layout.OF_AddPicture(al_xlsRow + anv_Object.StartRow ,anv_Object.StartCol ,ls_FileName, anv_Object.Picture_OffsetX, anv_Object.Picture_OffsetY , anv_Object.Width , anv_Object.Height ) END IF END IF end subroutine public subroutine of_calcpictureoffset ();Int li n_dw2xls_Object lnv_Object IF ii_PictureObjCount<=0 Then Return END IF For li =1 To UpperBound(inv_Objects) lnv_Object = inv_Objects[li] IF lnv_Object.IsPicture OR lnv_Object.IsGraph THen lnv_Object.Picture_OffSetX=lnv_Object.X1 - inv_Layout.OF_GetColumn_X1( lnv_Object.StartCol ) lnv_Object.Picture_OffSetY=lnv_Object.Y1 - OF_GetY1( lnv_Object.StartRow ) END IF Next end subroutine public function Long of_getbkcolor ();Return il_BKColor end function public subroutine of_sortobject_row ();Int li,lj,li_cnt Boolean lb_Stop n_dw2xls_Object lnv_Temp //先按行按序,再按列排序 li_cnt = UpperBound(inv_Objects) lb_Stop=False Do While Not lb_Stop lb_Stop=TRUE For li=1 TO li_cnt -1 lj =li+1 IF inv_Objects[lj ].StartRow"1" AND inv_Requestor.OF_GetProcessing()<>'4' Then Return END IF //Footer区不需要处理 IF is_Name="footer" Then Return END IF IF (inv_Requestor.OF_GetProcessing()='1' OR inv_Requestor.OF_GetProcessing()='4') Then IF is_Name='detail' Then For li=1 TO UpperBound(inv_Objects) inv_Objects[li].BorderStyle='2' Next Return END IF IF is_Name=inv_Requestor.OF_GetHeader_BeginBand() Then li_BorderBegin_Y = inv_Requestor.OF_GetHeader_BeginY() li_BorderBegin_Row =OF_GetStartRow(li_BorderBegin_Y) ELSE IF inv_Requestor.OF_GetProcessing()='4' AND Pos(is_name,"header")>0 Then IF is_Name= li_StartCol Then IF inv_Objects[lj].StartRow>=li_BorderBegin_Row Then //And inv_Objects[lj].EndRow>=li_Row Then inv_Objects[lj].BorderStyle='2' lb_Flag=TRUE END IF ELSEIF inv_Objects[lj].StartCol>li_StartCol Then EXIT END IF Next IF Not lb_Flag Then lnv_Object = Create n_dw2xls_Object lnv_Object.ObjType="tempobj" lnv_Object.StartRow =li_BorderBegin_Row lnv_Object.EndRow =li_MaxRow lnv_Object.StartCol = li_StartCol lnv_Object.EndCol =li_EndCol lnv_Object.BorderStyle='2' inv_Objects[ UpperBound(inv_Objects)+1] = lnv_Object END IF Next ELSE For li=1 To inv_Layout.OF_ColumnCount() li_StartCol =li li_EndCol =li lb_Flag =False For lj=1 To UpperBound(inv_Objects) IF inv_Objects[lj].StartCol <= li_StartCol AND inv_Objects[lj].EndCol >= li_StartCol Then IF inv_Objects[lj].StartRow>=li_BorderBegin_Row Then inv_Objects[lj].BorderStyle='2' lb_Flag=TRUE END IF ELSEIF inv_Objects[lj].StartCol > li_StartCol Then EXIT END IF Next IF Not lb_Flag Then lnv_Object = Create n_dw2xls_Object lnv_Object.ObjType="tempobj" lnv_Object.StartRow =li_BorderBegin_Row lnv_Object.EndRow =li_MaxRow lnv_Object.StartCol = li_StartCol lnv_Object.EndCol =li_EndCol lnv_Object.BorderStyle='2' inv_Objects[ UpperBound(inv_Objects)+1] = lnv_Object END IF Next END IF END IF end subroutine public subroutine of_sortobject_col ();Int li,lj,li_cnt Boolean lb_Stop n_dw2xls_Object lnv_Temp //先按列按序,再按行排序 li_cnt = UpperBound(inv_Objects) lb_Stop=False Do While Not lb_Stop lb_Stop=TRUE For li=1 TO li_cnt -1 lj =li+1 IF inv_Objects[lj ].StartColinv_Objects[li].x1 AND (inv_Objects[lj].x2 -10)inv_Objects[li].y1 Then // lb_DownObj =TRUE // END IF // END IF // Next // // IF Not lb_UpObj Then // inv_Objects[li].Y1 = li_Begin_Y // END IF // // IF Not lb_DownObj Then // inv_Objects[li].Y2=il_BandHeight // END IF //Next end subroutine public subroutine of_getobjectborderinfo ();IF Not IsValid(inv_Requestor) Then Return END IF IF Not IsValid(inv_Layout) Then Return END IF Int li, lj Int li_Vlines, li_HLines ,li_ObjCount Int li_Find Long li_x1, li_x2 ,li_Y1, li_Y2,li_Pre_x1 ,li_Next_X1 Long li_ColSpace, li_RowSpace Boolean lb_HasLine ,lb_HasObject n_dw2xls_Line lnv_Line n_dw2xls_Object lnv_Object, lnv_Object2 li_Vlines = UpperBound(inv_VLines) li_HLines = UpperBound(inv_HLines) IF li_Vlines = 0 AND li_HLines=0 Then Return END IF //对线条进行排序 OF_SortLine() //两条横线之间,没有任何对象,则插入一个空对象,以便生成行记录 For li=li_HLines To 2 Step -1 lb_HasObject =False IF (inv_HLines[li].Y1 - inv_HLines[ li -1].Y1)<50 Then Continue END IF For lj=1 To UpperBound(inv_Objects) lnv_Object = inv_Objects[lj] IF lnv_Object.Y1>= (inv_HLines[ li -1].Y1 -30 ) AND lnv_Object.Y2<=(inv_HLines[ li ].Y1 +30 ) Then lb_HasObject=TRUE Exit END IF NEXT IF Not lb_HasObject Then lnv_object = Create n_dw2xls_object lnv_object.objType="tempobj" lnv_object.inv_TopLine = inv_HLines[ li -1] lnv_object.inv_BottomLine = inv_HLines[ li ] lnv_Object.OF_SetPosition(inv_HLines[li].X1+30, inv_HLines[ li -1].Y1+20, inv_HLines[li].X1+50 ,inv_HLines[ li].Y1 -20 ,"" ,"" ,"" ,"" ) OF_AddObject(lnv_object) END IF Next li_ObjCount = UpperBound(inv_Objects) //先查找对象的左、右边线 IF li_Vlines>0 Then OF_SortObject_X() For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" OR & lnv_Object.IsBorderOnly OR lnv_Object.IsPicture Then Continue END IF li_x1= lnv_Object.x1 li_y1 = lnv_Object.y1 li_x2= lnv_Object.x2 li_y2 = lnv_Object.y2 //查找左边线 lb_HasLine=False lb_HasObject=False For lj=li_Vlines To 1 Step -1 lnv_Line = inv_VLines[lj] IF lnv_Line.Y1<=(li_y1 +30) AND lnv_Line.Y2>=( li_y2 -30 ) AND lnv_Line.X1<( li_x1 +30 ) Then //对象可能超过边线一点,所以加上30 lb_HasLine=TRUE Exit END IF Next IF lb_HasLine THEN For lj=li -1 TO 1 Step -1 //与左线条之间,有没其它对象 IF (inv_Objects[lj].x2 -30 )< lnv_Line.x1 Then Exit END IF IF inv_Objects[lj].ObjType="report" Or inv_Objects[lj].ObjType="tempobj" OR & inv_Objects[lj].IsBorderOnly OR inv_Objects[lj].IsPicture Then Continue END IF IF ( inv_Objects[lj].Y1+30)li_y1 Then lnv_Object.Inv_LeftObject = inv_Objects[lj] inv_Objects[lj].inv_RightObject= lnv_Object SetNull(inv_Objects[lj].inv_LeftLine) lb_HasObject=TRUE Exit END IF Next IF Not lb_HasObject THEN lnv_Object.inv_LeftLine = lnv_Line END IF END IF //如果没有左边线,则没必要查找是否有右边线了,因为不是一个完整的单元格了 IF Not IsValid(lnv_Object.inv_LeftLine) Then Continue END IF //查找右边线 lb_HasLine=False lb_HasObject=False For lj=1 To li_Vlines lnv_Line = inv_VLines[lj] IF lnv_Line.Y1<=( li_y1+30) AND lnv_Line.Y2>=( li_y2 - 30)AND lnv_Line.X1>(li_x2 -30) Then //对象可以超过边线一点,所以减去30 lb_HasLine=TRUE Exit END IF Next IF lb_HasLine Then For lj=li +1 TO li_ObjCount ////与右边线之间,有没其它对象 IF ( inv_Objects[lj].x1+30)> lnv_Line.x1 Then Exit END IF IF inv_Objects[lj].ObjType="tempobj" OR inv_Objects[lj].IsBorderOnly Then Continue END IF IF ( inv_Objects[lj].Y1+30)li_y1 Then lnv_Object.Inv_RightObject = inv_Objects[lj] inv_Objects[lj].inv_LeftObject= lnv_Object SetNull(inv_Objects[lj].inv_RightLine) lb_HasObject=TRUE Exit END IF Next IF Not lb_HasObject THEN lnv_Object.inv_RightLine = lnv_Line END IF END IF Next END IF IF li_HLines>0 Then OF_SortObject_Y() For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" OR & lnv_Object.IsPicture Or lnv_Object.IsBorderOnly Then Continue END IF li_x1= lnv_Object.x1 li_y1 = lnv_Object.y1 li_x2= lnv_Object.x2 li_y2 = lnv_Object.y2 //查找上边线 lb_HasLine=False lb_HasObject=False For lj=li_HLines To 1 Step -1 lnv_Line = inv_HLines[lj] IF lnv_Line.X1li_x1 AND lnv_Line.Y1<( li_y1 +30 ) Then lb_HasLine=TRUE Exit END IF Next IF lb_HasLine THEN IF IsValid(lnv_Object.inv_LeftLine) Then li_x1 = lnv_Object.inv_LeftLine.X1 ELSE li_X1 = Min(lnv_Line.X1, lnv_Object.X1) END IF IF IsValid(lnv_Object.inv_RightLine) Then li_x2 = lnv_Object.inv_RightLine.X1 ELSE li_X2 = Max(lnv_Line.X2, lnv_Object.X2) END IF For lj=li -1 TO 1 Step -1 //与上线条之间,有没其它对象 lnv_Object2 =inv_Objects[lj] IF (inv_Objects[lj].Y2 -30) < lnv_Line.Y1 Then Exit END IF IF inv_Objects[lj].ObjType="report" Or inv_Objects[lj].ObjType="tempobj" OR & inv_Objects[lj].IsBorderOnly OR inv_Objects[lj].IsPicture Then Continue END IF IF ( lnv_Object2.X1+30)li_x1 Then //AND ( lnv_Object2.OF_GetTextRect_Y2() -15)li_x1 AND lnv_Line.Y1>=(li_Y2 -30) Then lb_HasLine=TRUE Exit END IF Next IF lb_HasLine THEN IF IsValid(lnv_Object.inv_LeftLine) Then li_x1 = lnv_Object.inv_LeftLine.X1 ELSE li_X1 = Min(lnv_Line.X1, lnv_Object.X1) END IF IF IsValid(lnv_Object.inv_RightLine) Then li_x2 = lnv_Object.inv_RightLine.X1 ELSE li_X2 = Max(lnv_Line.X2, lnv_Object.X2) END IF For lj=li+1 TO li_ObjCount lnv_Object2=inv_Objects[lj] IF (lnv_Object2.Y1+30)> lnv_Line.Y1 Then Exit END IF IF inv_Objects[lj].ObjType="tempobj" OR inv_Objects[lj].IsBorderOnly Then Continue END IF IF (lnv_Object2.X1+30)li_X1 Then // AND ( lnv_Object2.Y1+15)>lnv_Object.OF_GetTextRect_Y2() lnv_Object.Inv_DownObject =lnv_Object2 lnv_Object2.inv_UpObject= lnv_Object SetNull(lnv_Object2.inv_BottomLine) lb_HasObject=TRUE Exit END IF Next IF Not lb_HasObject THEN lnv_Object.inv_BottomLine = lnv_Line END IF END IF Next END IF end subroutine public function n_dw2xls_Requestor of_getrequestor ();Return inv_Requestor end function public function Boolean of_existsobject (readonly string as_name);Int li,li_cnt li_cnt =UpperBound(inv_Objects) For li=1 TO li_cnt IF inv_Objects[li].Name = as_Name Then Return TRUE END IF Next Return False end function public subroutine of_setdynamicrowinfo (readonly boolean ab_flag);ib_DynamicRowInfo = ab_Flag end subroutine public subroutine of_refreshrowinfo (long al_row);Long li,li_cnt Boolean lb_RowInfoChange li_cnt = UpperBound(inv_Objects) For li=1 To li_cnt IF inv_Objects[li].OF_UpdatePosition(al_Row) Then lb_RowInfoChange =TRUE END IF Next IF Not lb_RowInfoChange Then Return END IF //li_cnt = UpperBound(inv_VLines) li_cnt = UpperBound(inv_Objects) For li=1 To li_cnt inv_Objects[li].StartRow =1 inv_Objects[li].EndRow =1 Next OF_GetColRowInfo2() OF_SortObject_Row() end subroutine public subroutine of_getcolrowinfo2 ();Long li, lj,lk,li_Loop,li_ObjCount Long li_Row, li_Find Long li_x1, li_x2 ,li_Y1, li_Y2 Long li_Pre_x1, li_Pre_y1 Long li_TopSpace, li_BottomSpace Long li_VLines, li_HLines , li_MaxRow ,li_RowCount , li_MaxY2 String ls_Processing Boolean lb_HasObject,lb_HasLine,lb_InsertRows n_dw2xls_Line lnv_Line n_dw2xls_Object lnv_Object ,lnv_Object2 ls_Processing = inv_Requestor.OF_GetProcessing() IF (ls_Processing="1" or ls_Processing="4" ) AND is_Name="detail" AND ib_HasNestReport=False Then ids_Rows.Reset() ids_Rows.InsertRow(0) ids_Rows.SetItem(1,"y1",0) ids_Rows.SetItem(1,"y2",il_BandHeight) IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then For li=1 To UpperBound(inv_Objects) inv_Objects[li].VAlignment=inv_Api.VAlign_TOP Next END IF Return END IF OF_SortObject_Y() li_ObjCount = UpperBound(inv_Objects) ids_Rows.Reset() //判断行数 li_MaxRow =1 For li_Loop=1 To 2 //需要循环执行两次 For li=1 To li_ObjCount lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF IF IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) AND & IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then li_Y1 = lnv_Object.inv_TopLine.Y1 li_Y2 = lnv_Object.inv_BottomLine.Y1 ELSE li_Y1= lnv_Object.Y1 IF lnv_Object.BorderStyle<>'0' Then li_Y2 = lnv_Object.Y2 ELSE li_Y2 = lnv_Object.OF_GetTextRect_Y2() END IF END IF IF li_Y1>=li_Y2 Then Continue END IF IF li_Y2>li_MaxY2 Then li_MaxY2 =li_Y2 END IF //找到对象的开始行 For lj=li -1 To 1 Step -1 IF IsValid( inv_Objects[lj].inv_BottomLine) Then IF inv_Objects[lj].inv_BottomLine.Y1<= li_Y1 THen lnv_Object.StartRow = inv_Objects[lj].EndRow +1 lnv_Object.EndRow= lnv_Object.StartRow Exit END IF ELSEIF (inv_Objects[lj].Y1lnv_Object.StartRow Then lnv_Object.EndRow = inv_Objects[lj].StartRow -1 END IF lb_HasObject=TRUE Exit ELSEIF (inv_Objects[lj].Y1+20)>li_Y2 Then IF inv_Objects[lj].StartRow>lnv_Object.StartRow Then lnv_Object.EndRow = inv_Objects[lj].StartRow -1 END IF lb_HasObject=TRUE Exit END IF NEXT IF lnv_Object.EndRow>li_MaxROW Then li_MaxROW = lnv_Object.EndRow END IF IF Not lb_HasObject Then lnv_Object.EndRow = li_MaxROW END IF IF lnv_Object.StartRow>lnv_Object.EndRow Then lnv_Object.StartRow = lnv_Object.EndRow END IF IF li_Loop <2 Then Continue END IF For lj=ids_Rows.RowCount()+1 To li_MaxROW ids_Rows.InsertRow(0) ids_Rows.SetItem(ids_Rows.RowCount(),"Y1",90000 ) ids_Rows.SetItem(ids_Rows.RowCount(),"TextRect_y1",90000) Next IF IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) Then ids_Rows.SetItem(lnv_Object.StartRow,"TopLine","1") IF lnv_Object.inv_TopLine.Y1ids_Rows.GetItemNumber(lnv_Object.EndRow,"Y2") Then ids_Rows.SetItem(lnv_Object.EndRow ,"Y2",lnv_Object.inv_BottomLine.Y2) END IF ELSEIF li_Y2>ids_Rows.GetItemNumber(lnv_Object.EndRow,"Y2") Then ids_Rows.SetItem(lnv_Object.EndRow ,"Y2",li_Y2) END IF IF lnv_Object.Y1ids_Rows.GetItemNumber(lnv_Object.EndRow,"TextRect_y2") Then ids_Rows.SetItem(lnv_Object.EndRow ,"TextRect_y2",lnv_Object.OF_GetTextRect_Y2() ) END IF Next Next IF ids_Rows.RowCount()=0 Then ids_Rows.InsertRow(0) ids_Rows.SetItem(1,"Y1",0) ids_Rows.SetItem(1,"Y2",il_BandHeight) END IF IF ls_Processing='3' Then ids_Rows.SetItem(1,"Y1",0) IF inv_Requestor.OF_GetControlHeight()>0 Then ids_Rows.SetItem(ids_Rows.RowCount() ,"Y2",inv_Requestor.OF_GetControlHeight()) END IF For li=1 To ids_Rows.RowCount() -1 IF ids_Rows.GetItemNumber(li,"Y2")> ids_Rows.GetItemNumber(li+1,"Y1") Then ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1")) END IF Next Return END IF For li=1 To ids_Rows.RowCount() ids_Rows.SetItem(li,"OldRowNum",li) //先保存原来的行号码,为下一步更新对象的行记录提供对应依据 Next IF is_Name="detail" AND inv_Requestor.OF_IsNested() Then il_BottomSpaceHeight = il_BandHeight - li_MaxY2 IF il_BottomSpaceHeight<=20 Then il_BottomSpaceHeight =0 END IF END IF IF ib_AutoHeight Then il_BandHeight = li_MaxY2 END IF //if is_name="detail" then // ids_rows.saveas("c:\rows1.txt",text!,true) //END IF IF (ls_Processing="1" or ls_Processing="4" ) Then ids_Rows.SetItem(ids_Rows.RowCount(),"Y2",il_BandHeight) IF ids_Rows.RowCount()=1 Then Goto label1 END IF IF Pos(is_Name,"header")<=0 Then ids_Rows.SetItem(0,"Y1",0) Goto label1 ELSE IF is_Name>inv_Requestor.Of_GetHeader_BeginBand () Then goto label1 ELSEIF is_Name=inv_Requestor.Of_GetHeader_BeginBand () Then li_Row =ids_Rows.Find("Y1>="+String(inv_Requestor.Of_GetHeader_BeginY () ),1,ids_Rows.RowCount()) IF li_Row>0 Then For li= li_Row To ids_Rows.RowCount() ids_Rows.SetItem(li,"TopLine","1") ids_Rows.SetItem(li,"BottomLine","1") Next END IF END IF END IF END IF For li=1 TO UpperBound(inv_HLines) lnv_Line = inv_HLines[li] lb_HasLine=False li_Row = ids_Rows.Find("Y1="+String(lnv_Line.y1),1,ids_Rows.RowCount()) IF li_Row>0 Then ids_Rows.SetItem(li_Row,"TopLine","1") li_Row = ids_Rows.Find("Y2="+String(lnv_Line.y1),1,ids_Rows.RowCount()) IF li_Row>0 Then ids_Rows.SetItem(li_Row,"BottomLine","1") END IF Continue END IF li_Row = ids_Rows.Find("Y2="+String(lnv_Line.y1),1,ids_Rows.RowCount()) IF li_Row>0 Then ids_Rows.SetItem(li_Row,"BottomLine","1") Continue END IF IF li_MaxROW>1 Then For lj=li_MaxROW To 2 Step -1 IF ( ids_Rows.GetItemNumber(lj -1,"Y2") -30)lnv_Line.y1 AND & ( ids_Rows.GetItemString(lj,"TopLine")<>"1" AND ids_Rows.GetItemString(lj -1,"BottomLine")<>"1" ) AND & (( ids_Rows.GetItemNumber(lj ,"Y1") - ids_Rows.GetItemNumber(lj -1,"Y2"))<60) Then ids_Rows.SetItem(lj,"Y1",lnv_Line.Y1) ids_Rows.SetItem(lj,"TopLine",'1' ) ids_Rows.SetItem(lj -1,"Y2",lnv_Line.Y1) ids_Rows.SetItem(lj -1,"BottomLine",'1' ) lb_HasLine=TRUE Exit END IF Next END IF IF lb_HasLine Then Continue END IF IF lnv_Line.Y1< ids_Rows.GetItemNumber(1,"Y1") Then IF ids_Rows.GetItemNumber(1,"Y1") - lnv_Line.Y1>=50 Then lb_InsertRows =TRUE li_Y2 = ids_Rows.GetItemNumber(1,"Y1") li_Row=ids_Rows.InsertRow(1) ids_Rows.SetItem(li_Row,"Y1",lnv_Line.Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y2) ids_Rows.SetItem(li_Row,"TopLine","1") ids_Rows.SetItem(li_Row,"textRect_Y1",lnv_Line.Y1) ids_Rows.SetItem(li_Row,"textRect_Y2",li_Y2) li_MaxROW++ END IF ELSEIF lnv_LIne.Y1> ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") Then IF lnv_Line.Y1 - ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") >=50 Then lb_InsertRows =TRUE li_Y1 = ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") li_Row=ids_Rows.InsertRow(0) ids_Rows.SetItem(li_Row,"BottomLine","1") ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",lnv_Line.Y1 ) ids_Rows.SetItem(li_Row,"textRect_Y1",li_Y1) ids_Rows.SetItem(li_Row,"textRect_Y2",lnv_Line.Y1) li_MaxROW++ END IF ELSE li_Row = ids_Rows.Find("Y1>"+String(lnv_Line.Y1),1,ids_Rows.RowCount()) IF li_Row >0 Then IF ids_Rows.GetItemString(li_Row,'TopLine')='1' THen li_Y2 = ids_Rows.GetItemNumber(li_Row,"Y1") ELSE li_Y2 = ids_Rows.GetItemNumber(li_Row,"TextRect_Y1") END IF //跟下边距的距离比较多,则插入空行 //如果跟上边距离较多 IF (( li_Y2 - lnv_Line.Y1 )>=50 AND ids_Rows.GetItemString(li_Row,'TopLine')<>'1' ) OR & (( li_Y2 -lnv_Line.Y1 )>=30 AND ids_Rows.GetItemString(li_Row,'TopLine')='1' ) Then lb_HasObject=False For lj=1 To li_ObjCount lnv_Object = inv_Objects[lj] IF lnv_Object.NoContaint Then Continue END IF IF lnv_Object.Y2>(lnv_Line.Y1+ii_RowSpace) AND lnv_Object.Y1<( li_Y2 - ii_RowSpace)Then lb_HasObject =TRUE Exit END IF Next IF Not lb_HasObject Then lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li_Row ) ids_Rows.SetItem(li_Row -1,"BottomLine","1") ids_Rows.SetItem(li_Row -1, "Y2",lnv_Line.Y1) ids_Rows.SetItem(li_Row,"TopLine","1") ids_Rows.SetItem(li_Row,"Y1",lnv_Line.Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y2 ) ids_Rows.SetItem(li_Row,"textRect_Y1",lnv_Line.Y1) ids_Rows.SetItem(li_Row,"textRect_Y2",li_Y2) li_MaxROW++ END IF Continue END IF END IF li_Row = ids_Rows.Find("Y2<"+String(lnv_Line.Y1),ids_Rows.RowCount(),1) IF li_Row >0 Then IF ids_Rows.GetItemString(li_Row,'BottomLine')='1' THen li_Y1 = ids_Rows.GetItemNumber(li_Row,"Y2") ELSE li_Y1 = ids_Rows.GetItemNumber(li_Row,"TextRect_Y2") END IF IF li_Row=50 AND ids_Rows.GetItemString(li_Row,'BottomLine')<>'1' ) OR & (( lnv_Line.Y1 -li_Y1 )>=30 AND ids_Rows.GetItemString(li_Row,'BottomLine')='1' ) Then lb_HasObject=False For lj=1 To li_ObjCount lnv_Object = inv_Objects[lj] IF lnv_Object.NoContaint Then Continue END IF IF lnv_Object.Y2>(li_Y1+ii_RowSpace) AND lnv_Object.Y1<( lnv_Line.Y1 -ii_RowSpace) Then lb_HasObject =TRUE Exit END IF Next IF Not lb_HasObject Then lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li_Row+1 ) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2", lnv_Line.Y1) ids_Rows.SetItem(li_Row,"BottomLine","1") ids_Rows.SetItem(li_Row,"textRect_Y1",li_Y1 ) ids_Rows.SetItem(li_Row,"textRect_Y2",lnv_Line.Y1) li_MaxROW++ END IF Continue END IF END IF END IF Next //if is_name="header" then // ids_rows.saveas("c:\rows2.txt",text!,true) //END IF //计算行间距 For li=1 To ids_Rows.RowCount() IF ids_Rows.GetItemString(li,"TopLine")="1" AND ids_Rows.GetItemString(li,"BottomLine")="1" Then ids_Rows.SetItem(li,"TopSpace",0) ids_Rows.SetItem(li,"BottomSpace",0) Continue END IF //上边距 IF li=1 Then IF ids_Rows.GetItemString(li,"TopLine")="1" Then ids_Rows.SetItem(1,"TopSpace", ids_Rows.GetItemNumber(1,"Y1")) ELSE ids_Rows.SetItem(1,"TopSpace", ids_Rows.GetItemNumber(1,"textRect_Y1")) END IF ELSE IF ids_Rows.GetItemString(li,"TopLine")="1" Then IF ids_Rows.GetItemString(li -1 ,"BottomLine")="1" Then ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"Y1") - ids_Rows.GetItemNumber(li -1,"y2") ) ELSE ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"Y1") - ids_Rows.GetItemNumber(li -1,"textRect_Y2") ) END IF ELSE IF ids_Rows.GetItemString(li -1 ,"BottomLine")="1" Then ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"textRect_Y1") - ids_Rows.GetItemNumber(li -1,"y2") ) ELSE ids_Rows.SetItem(li,"TopSpace", ids_Rows.GetItemNumber( li ,"textRect_Y1") - ids_Rows.GetItemNumber(li -1,"y2") ) END IF END IF END IF IF li = ids_Rows.RowCount() Then IF ids_Rows.GetItemString(li,"BottomLine")="1" Then ids_Rows.SetItem(li,"BottomSpace", il_BandHeight - ids_Rows.GetItemNumber(li,"Y2")) ELSE ids_Rows.SetItem(li,"BottomSpace", il_BandHeight - ids_Rows.GetItemNumber(li,"textRect_Y2")) END IF ELSE IF ids_Rows.GetItemString(li,"BottomLine")="1" Then IF ids_Rows.GetItemString(li +1 ,"TopLine")="1" Then ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"Y1") - ids_Rows.GetItemNumber(li ,"y2") ) ELSE ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"textRect_Y1") - ids_Rows.GetItemNumber(li ,"y2") ) END IF ELSE IF ids_Rows.GetItemString(li +1 ,"TopLine")="1" Then ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"Y1") - ids_Rows.GetItemNumber(li ,"textRect_Y2") ) ELSE ids_Rows.SetItem(li,"BottomSpace", ids_Rows.GetItemNumber( li+1 ,"textRect_Y1") - ids_Rows.GetItemNumber(li ,"textRect_Y2") ) END IF END IF END IF IF ids_Rows.GetItemNumber(li,"TopSpace")<0 Then ids_Rows.SetItem(li,"TopSpace",0) END IF IF ids_Rows.GetItemNumber(li,"BottomSpace")<0 Then ids_Rows.SetItem(li,"BottomSpace",0) END IF Next //if is_name="header" then // ids_rows.saveas("c:\rows3.txt",text!,true) //END IF //如果对象跟后一行的间距比较多,则补入空行 For li=ids_Rows.RowCount() To 1 Step -1 li_TopSpace = ids_Rows.GetItemNumber(li,"TopSpace") li_BottomSpace = ids_Rows.GetItemNumber(li,"BottomSpace") IF li_BottomSpace>=60 Then //补入空行 IF ids_Rows.GetItemString(li,"BottomLine")="1" Then li_Y1 =ids_Rows.GetItemNumber(li,"Y2") ids_Rows.SetItem(li,"BottomSpace",0) lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li+1) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y1 + li_BottomSpace) ELSE IF ids_Rows.GetItemString(li,"TopLine")="1" Then li_Y1 =ids_Rows.GetItemNumber(li,"TextRect_Y2") + ( ids_Rows.GetItemNumber(li,"TextRect_Y1") -ids_Rows.GetItemNumber(li,"Y1")) IF li=ids_Rows.RowCount() Then li_Y2 =il_BandHeight ELSE li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1") END IF ids_Rows.SetItem(li,"BottomSpace",0) lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li+1) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y2) ELSE IF li_TopSpace<=60 Then li_Y1 =ids_Rows.GetItemNumber(li,"TextRect_Y2") +li_TopSpace/2 IF li>1 Then ids_Rows.SetItem(li -1 , "BottomSpace",ids_Rows.GetItemNumber(li -1, "BottomSpace") - li_TopSpace/2) END IF //ELSE // li_Y1+=20 // IF li>1 Then // ids_Rows.SetItem(li -1 , "BottomSpace",ids_Rows.GetItemNumber(li -1, "BottomSpace") -20) // END IF END IF IF li=ids_Rows.RowCount() Then li_Y2 =il_BandHeight ELSE li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1") END IF ids_Rows.SetItem(li,"BottomSpace",0) lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li+1) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y2) END IF END IF ELSE IF li=30 Then //两个横线之间的间隔 IF ids_Rows.GetItemString(li,"BottomLine")="1" AND ids_Rows.GetItemString(li+1,"TopLine")="1" Then li_Y1 = ids_Rows.GetItemNumber(li,"Y2") li_Y2 = ids_Rows.GetItemNumber(li+1,"Y1") lb_InsertRows =TRUE li_Row=ids_Rows.InsertRow(li+1) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",li_Y2) END IF END IF END IF Next //if is_name="header" then // ids_rows.saveas("c:\rows4.txt",text!,true) //END IF //处理第一行的上边距 li_TopSpace = ids_Rows.GetItemNumber(1,"TopSpace") IF li_TopSpace>=60 OR ( ids_Rows.GetItemString(1 ,"TopLine")="1" AND li_TopSpace>=30 ) Then //补入空行 IF ids_Rows.GetItemString(1,"TopLine")="1" Then li_Y2 =ids_Rows.GetItemNumber(1,"Y1") ELSE li_Y2= ids_Rows.GetItemNumber(1,"TextRect_Y1") END IF lb_InsertRows =TRUE ids_Rows.SetItem(1,"TopSpace",0) li_Row=ids_Rows.InsertRow(1) ids_Rows.SetItem(li_Row,"Y1",0) ids_Rows.SetItem(li_Row,"Y2",li_Y2) END IF //处理最后一行 IF Not ib_AutoHeight Then li_BottomSpace = ids_Rows.GetItemNumber(ids_Rows.RowCount() ,"BottomSpace") IF li_BottomSpace>=60 OR ( ids_Rows.GetItemString(ids_Rows.RowCount() ,"BottomLine")="1" AND li_BottomSpace>=30 ) Then //补入空行 IF ids_Rows.GetItemString(ids_Rows.RowCount(),"BottomLine")="1" Then li_Y1 =ids_Rows.GetItemNumber(ids_Rows.RowCount(),"Y2") ELSE li_Y1= ids_Rows.GetItemNumber(ids_Rows.RowCount(),"TextRect_Y2") END IF lb_InsertRows =TRUE ids_Rows.SetItem(ids_Rows.RowCount(),"BottomSpace",0) li_Row=ids_Rows.InsertRow(0) ids_Rows.SetItem(li_Row,"Y1",li_Y1) ids_Rows.SetItem(li_Row,"Y2",il_BandHeight ) END IF END IF //if is_name="detail" AND inv_Requestor.OF_IsChild()=False then // ids_rows.saveas("c:\rows5.txt",text!,true) //END IF label1: IF ids_Rows.GetItemString(1,"TopLine")<>"1" Then ids_Rows.SetItem(1,"Y1",0) END IF IF ids_Rows.GetItemString(ids_Rows.RowCount() ,"BottomLine")<>"1" AND ib_AutoHeight=False Then // ids_Rows.SetItem(ids_Rows.RowCount(),"Y2",il_BandHeight ) END IF For li=1 To ids_Rows.RowCount() ids_Rows.SetItem(li,"NewRowNum",li) IF li"1" Then ids_Rows.SetItem(li+1,"Y1", ids_Rows.GetItemNumber(li,"Y2")) END IF ELSEIF ids_Rows.GetItemString(li,"TopLine")="1" Then ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1")) ELSE li_BottomSpace = ids_Rows.GetItemNumber(li+1,"Y1") - ids_Rows.GetItemNumber(li,"Y2") IF li_BottomSpace<=60 Then ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li,"Y2") +li_BottomSpace/2 ) ELSE ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li,"Y2") +20 ) END IF ids_Rows.SetItem(li+1,"Y1", ids_Rows.GetItemNumber(li,"Y2") ) END IF END IF NEXT //if is_name="header" then // ids_rows.saveas("c:\rows6.txt",text!,true) //END IF IF lb_InsertRows AND ids_Rows.RowCount()>1 Then For li=1 To UpperBound(inv_Objects) lnv_Object = inv_Objects[li] li_Row = ids_Rows.Find("OldRowNum="+String(lnv_Object.StartRow),1, ids_Rows.RowCount()) IF li_Row>0 Then lnv_Object.StartRow = ids_Rows.GetItemNumber(li_Row,"NewRowNum") END IF li_Row = ids_Rows.Find("OldRowNum="+String(lnv_Object.EndRow),1, ids_Rows.RowCount()) IF li_Row>0 Then lnv_Object.EndRow = ids_Rows.GetItemNumber(li_Row,"NewRowNum") END IF Next li_MaxROW = ids_Rows.RowCount() END IF For li=1 To ids_Rows.RowCount() -1 IF ids_Rows.GetItemNumber(li,"Y2")> ids_Rows.GetItemNumber(li+1,"Y1") Then ids_Rows.SetItem(li,"Y2", ids_Rows.GetItemNumber(li+1,"Y1")) END IF Next ////检查所有单元,避免多个对象输出到同一单元 OF_SortObject_Col() li_ObjCount = UpperBound(inv_Objects) For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF IF lnv_Object.StartCol = lnv_Object.EndCol Then Continue END IF IF lnv_Object.NoContaint AND lnv_Object.BorderStyle='0' Then Continue END IF IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" THEN Continue END IF //与前面是否有对象重复输出相同的单元 For lj=li -1 To 1 Step -1 lnv_Object2=inv_Objects[lj] IF Not lnv_Object2.Visible Then Continue END IF IF lnv_Object2.NoContaint AND lnv_Object.BorderStyle='0' Then Continue END IF IF lnv_Object2.ObjType="report" OR lnv_Object2.ObjType="tempobj" THEN Continue END IF IF lnv_Object2.StartRow<=lnv_Object.EndRow AND & lnv_Object2.EndRow>=lnv_Object.StartRow AND & lnv_Object2.EndCol =lnv_Object.StartRow AND & lnv_Object2.StartCol<=lnv_Object.EndCol AND & lnv_Object2.EndCol>=lnv_Object.StartCol Then //如果上一对象实际需要显示的内容,与当前对象开始列很近 IF lnv_Object2.EndCol> lnv_Object2.StartCol Then li_x1 = inv_Layout.OF_GetColumn_X1( lnv_Object.StartCol ) IF (lnv_Object2.x2 - li_x1)<100 OR ( lnv_Object2.OF_GetTextRect_X2() -ii_RowSpace)< li_x1 Then lnv_Object.EndCol = lnv_Object2.StartCol -1 EXIT END IF END IF //如果当前对象离下一列很近,或实际显示的内容在下一列 IF lnv_Object.EndCol>lnv_Object2.EndCol Then li_x2 = inv_Layout.OF_GetColumn_X2( lnv_Object2.EndCol ) IF ( li_X2 - lnv_Object.X1 )<100 OR ( lnv_Object2.OF_GetTextRect_X1()+ii_RowSpace) > li_x2 Then lnv_Object.StartCol =lnv_Object2.EndCol+1 EXIT END IF END IF //则按对象的实际显示位置,再处理一次 IF lnv_Object2.Alignment='0' Then lnv_Object2.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object2.OF_GetTextRect_X2() ) IF lnv_Object2.EndCol < lnv_Object.StartCol Then Continue END IF END IF IF lnv_Object.Alignment='1' Then lnv_Object.StartCol= inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X1() ) IF lnv_Object.StartCol> lnv_Object2.EndCol Then Continue END IF END IF IF lnv_Object.Alignment<>'0' Then lnv_Object.StartCol =inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() ) lnv_Object.EndCol =inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() ) END IF IF lnv_Object2.Alignment='2' Then lnv_Object2.StartCol =inv_Layout.OF_GetStartColumn( lnv_Object2.OF_GetTextRect_X1() ) lnv_Object2.EndCol =inv_Layout.OF_GetEndColumn( lnv_Object2.OF_GetTextRect_X2() ) END IF IF lnv_Object2.Alignment='0' AND lnv_Object2.VisibleExp="" AND lnv_Object.VisibleExp="" AND & lnv_Object2.EndCol> lnv_Object2.StartCol AND lnv_Object2.EndCol = lnv_Object.StartCol Then lnv_Object2.EndCol = lnv_Object.StartCol -1 Exit END IF IF lnv_Object.Alignment='1' AND lnv_Object2.VisibleExp="" AND lnv_Object.VisibleExp="" AND & lnv_Object.EndCol> lnv_Object.StartCol AND lnv_Object.StartCol = lnv_Object2.EndCol Then lnv_Object.StartCol = lnv_Object2.EndCol +1 Exit END IF lnv_Object.CellHasMultiObjects =TRUE lnv_Object2.CellHasMultiObjects =TRUE END IF Next //与后面是否有 For lj=li +1 To li_ObjCount lnv_Object2=inv_Objects[lj] IF Not lnv_Object2.Visible Then Continue END IF IF lnv_Object2.NoContaint AND lnv_Object.BorderStyle='0' Then Continue END IF IF lnv_Object2.ObjType="report" OR lnv_Object2.ObjType="tempobj" THEN Continue END IF IF lnv_Object2.StartRow<=lnv_Object.EndRow AND & lnv_Object2.EndRow>=lnv_Object.StartRow AND & lnv_Object2.EndCol =lnv_Object.StartRow AND & lnv_Object2.StartCol<=lnv_Object.EndCol AND & lnv_Object2.EndCol>=lnv_Object.StartCol Then //如果下一对象实际需要显示的内容,与当前对象开始列很近 li_x1 = inv_Layout.OF_GetColumn_X1( lnv_Object2.StartCol ) IF Abs(lnv_Object.x2 - li_x1)<100 OR ( lnv_Object.OF_GetTextRect_X2() -ii_RowSpace)< li_x1 Then lnv_Object.EndCol = lnv_Object2.StartCol -1 EXIT END IF lnv_Object.CellHasMultiObjects =TRUE lnv_Object2.CellHasMultiObjects =TRUE END IF Next Next //如果自动行高 IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then For li=1 To UpperBound(inv_Objects) inv_Objects[li].VAlignment=inv_Api.VAlign_TOP Next END IF OF_GetLineColRowInfo() end subroutine public subroutine of_getcolrowinfo ();Long li, lj,lk Long li_Row, li_Find ,li_ObjCount, li_Count Long li_x1, li_x2 ,li_Y1, li_Y2 Long li_Pre_x1, li_Pre_y1 String ls_Processing Boolean lb_HasObject n_dw2xls_Object lnv_Object n_dw2xls_Line lnv_Line //先处理子数据窗口对象 For li=1 TO UpperBound(inv_Objects) IF inv_Objects[li].ObjType="report" AND IsValid( inv_Objects[li].inv_Report) Then inv_Objects[li].inv_Report.OF_GetColRowInfo() END IF Next //判断对象的起止列 OF_SortObject_X() li_ObjCount = UpperBound(inv_Objects) ls_Processing = inv_Requestor.OF_GetProcessing() For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) AND & IsValid(lnv_Object.inv_TopLine) AND IsValid(lnv_Object.inv_BottomLine) Then lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.inv_LeftLine.x1 ) lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.inv_RightLine.X1 ) ELSE lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.x1 ) lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.X2 ) /* IF lnv_Object.EndCol>lnv_Object.StartCol Then IF ls_Processing<>"1" AND ls_Processing<>"4" AND is_Name<>"detail" Then IF IsValid(lnv_Object.inv_LeftLine)=False AND IsValid(lnv_Object.inv_RightLine) =False Then IF lnv_Object.Alignment='1' Then lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() ) ELSEIF lnv_Object.Alignment='2' Then lnv_Object.StartCol = inv_Layout.OF_GetStartColumn( lnv_Object.OF_GetTextRect_X1() ) lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() ) ELSE lnv_Object.EndCol = inv_Layout.OF_GetEndColumn( lnv_Object.OF_GetTextRect_X2() ) END IF END IF END IF END IF */ END IF IF lnv_Object.StartColinv_Requestor.OF_GetLastColumn() Then inv_Requestor.OF_SetLastColumn( lnv_Object.EndCol) END IF Next For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF //查找前面一列 IF lnv_Object.BorderStyle='2' OR ( ls_Processing='1' OR ls_Processing='4') Then IF lnv_Object.StartCol>1 Then IF (inv_Layout.OF_GetColumn_X1(lnv_Object.StartCol) - lnv_Object.X1)>10 AND & ( lnv_Object.X1 - inv_Layout.OF_GetColumn_X1(lnv_Object.StartCol -1))<=50 then //inv_Layout.ii_ColSpace Then //前面是否有相同的对象? lb_HasObject=False For lj= li -1 To 1 Step -1 IF inv_Objects[lj].Y1lnv_Object.Y1 AND inv_Objects[lj].EndCol>= (lnv_Object.StartCol -1) Then lb_HasObject=TRUE Exit END IF NEXT IF Not lb_HasObject Then lnv_Object.StartCol =lnv_Object.StartCol -1 END IF END IF END IF IF lnv_Object.EndCol10 AND & ( inv_Layout.OF_GetColumn_X1(lnv_Object.EndCol +1) - lnv_Object.X2)<=50 Then //后面是否有相同的对象? lb_HasObject=False For lj= li +1 To li_ObjCount IF inv_Objects[lj].Y1lnv_Object.Y1 AND inv_Objects[lj].StartCol<= (lnv_Object.EndCol +1) Then lb_HasObject=TRUE Exit END IF NEXT IF Not lb_HasObject Then lnv_Object.EndCol =lnv_Object.EndCol +1 END IF END IF END IF END IF Next //IF is_Name="detail" Then // inv_Layout.ids_Columns.SaveAs("c:\columns.Txt",Text!,True) //END IF //Grid或Crosstab形式的数据窗口,细节区对象的起止行号都为1,不需要特别处理 IF (ls_Processing="1" or ls_Processing="4" ) AND is_Name="detail" AND ib_HasNestReport=False Then ids_Rows.InsertRow(0) ids_Rows.SetItem(1,"y1",0) ids_Rows.SetItem(1,"y2",il_BandHeight) IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then For li=1 To UpperBound(inv_Objects) inv_Objects[li].VAlignment=inv_Api.VAlign_TOP Next END IF Return END IF //查找对象的Slideup的基准对象 OF_SortObject_Y() For li=1 TO li_ObjCount lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF li_x1= lnv_Object.x1 li_y1 = lnv_Object.y1 li_x2= lnv_Object.x2 li_y2 = lnv_Object.y2 IF lnv_Object.IsSlideup Then For lj=li -1 To 1 Step -1 IF (inv_Objects[lj].objType="report" OR UpperBound(inv_Objects[lj].inv_SlideupObject)>0 ) AND & inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1li_x1 AND inv_Objects[lj].X1=lnv_Object.X2 Then Exit END IF END IF NEXT END IF Next OF_SortLine() li_Count= UpperBound(inv_HLines) For li=1 To li_Count lnv_Line = inv_HLines[li] li_x1= lnv_Line.x1 li_y1 = lnv_Line.y1 li_x2= lnv_Line.x2 li_y2 = lnv_Line.y2 IF lnv_Line.IsSlideup Then For lj=li_ObjCount To 1 Step -1 IF (inv_Objects[lj].objType="report" OR UpperBound(inv_Objects[lj].inv_SlideupObject)>0 ) AND & inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1li_x1 AND inv_Objects[lj].X10 ) AND & inv_Objects[lj].Y2 <(li_Y1+30) AND inv_Objects[lj].Y1li_x1 AND inv_Objects[lj].X1 lnv_Object.StartCol Then Continue END IF IF lnv_Object.NoContaint AND lnv_Object.BorderStyle='0' Then Continue END IF IF lnv_Object.ObjType="report" OR lnv_Object.ObjType="tempobj" THEN Continue END IF IF IsValid(lnv_Object.inv_LeftLine) AND IsValid(lnv_Object.inv_RightLine) Then Continue END IF IF lnv_Object.TextWidth>0 Then li_Width = inv_Layout.OF_GetColumn_Width(lnv_Object.StartCol) IF li_Width1 OF_RefreshRowInfo(al_Row ) END IF //计算表达式的值 inv_Requestor.OF_UpdateExpValues(al_Row) //输出行高 OF_WriteRowHeight(al_Row , al_XlsRow) //输出背景 IF OF_RowCount()>0 Then IF is_BKColorExp<>'' Then il_BkColor =inv_Api.OF_GetColor(Long(inv_Requestor.OF_Evaluate(al_Row,is_BKColorExp))) END IF IF il_BKColor>0 AND il_BkColor<>COLOR_TRANSPARENT AND il_BKColor<> inv_Requestor.OF_GetBKColor() Then inv_Api.SetBackColor(il_hSheet, 1+al_xlsRow, inv_Requestor.OF_GetFirstColumn() , OF_RowCount()+al_xlsRow, inv_Requestor.OF_GetLastColumn() ,il_BKColor ) END IF END IF // 输出边线 For li=1 TO UpperBound(inv_HLines) IF inv_HLines[li].IsClone Then Continue END IF IF inv_HLines[li].IsSlideUp AND IsValid( inv_HLines[li].inv_SlideUpObject) Then Continue END IF IF inv_HLines[li].VisibleExp<>"" Then IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_HLines[li].VisibleExp))=0 Then Continue END IF END IF OF_WriteBorder( inv_HLines[li], al_XlsRow) li_EndRow = al_XlsRow + inv_HLines[li].EndRow IF li_EndRow > li_Max_EndRow Then li_Max_EndRow = li_EndRow END IF Next For li=1 TO UpperBound(inv_VLines) IF inv_VLines[li].IsClone Then Continue END IF IF inv_VLines[li].IsSlideUp AND IsValid( inv_VLines[li].inv_SlideUpObject) Then Continue END IF IF inv_VLines[li].VisibleExp<>"" Then IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_VLines[li].VisibleExp))=0 Then Continue END IF END IF OF_WriteBorder( inv_VLines[li], al_XlsRow) li_EndRow = al_XlsRow + inv_VLines[li].EndRow IF li_EndRow > li_Max_EndRow Then li_Max_EndRow = li_EndRow END IF Next //输出对象内容 For li=1 To UpperBound(inv_Objects) IF inv_Requestor.OF_IsCancel() Then Return -1 END IF lnv_Object = inv_Objects[li] IF Not lnv_Object.Visible Then Continue END IF IF lnv_Object.IsBorderOnly OR ( lnv_Object.NoContaint AND lnv_Object.CellHasMultiObjects ) Then Continue END IF li_DataRow = al_Row+lnv_Object.RowInDetail -1 IF li_DataRow>inv_Requestor.OF_RowCount() Then Continue END IF IF lnv_Object.VisibleExp<>"" Then //由于VisibleExp没有通过OF_AddExpression加入到表达式数组,所以不能用OF_GetExpValue来取值 IF Long(inv_Requestor.OF_Evaluate(li_DataRow,lnv_Object.VisibleExp))=0 Then Continue END IF END IF IF IsValid(lnv_Object.inv_Report) Then IF inv_Requestor.OF_IsNested() AND al_Row>1 Then // Then inv_Requestor.OF_UpdateReport(al_Row, lnv_Object.Name, lnv_Object.inv_Report) END IF IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then li_CurRow = lnv_Object.OF_GetLastRow() IF (lnv_Object.Y1 - lnv_Object.inv_SlideUpObject[1].Y2)>=25 Then //已经从Y从大向小排序 li_CurRow++ lj =lnv_Object.Y1 - lnv_Object.inv_SlideUpObject[1].Y2 lj = UnitsToPixels(lj,YUnitsToPixels!) /96*1440 inv_Api.SetRowHeight(il_hSheet, li_CurRow, lj) END IF li_EndRow = lnv_Object.inv_Report.OF_OutPut(il_hSheet ,li_CurRow ) ELSE li_EndRow = lnv_Object.inv_Report.OF_OutPut(il_hSheet , lnv_Object.StartRow +al_XlsRow -1 ) END IF lnv_Object.LastRow = li_EndRow IF li_EndRow>li_Max_EndRow Then li_Max_EndRow = li_EndRow END IF Continue END IF IF lnv_Object.IsPicture OR lnv_Object.IsGraph Then IF inv_Requestor.OF_IsWritePictures() Then OF_WritePicture(lnv_Object, li_DataRow, al_XlsRow) END IF Continue END IF li_StartRow = lnv_Object.StartRow li_EndRow = lnv_Object.EndRow li_StartCol = lnv_Object.StartCol li_EndCol = lnv_Object.EndCol IF li_StartCol<1 OR li_EndCol<1 OR li_StartRow<1 OR li_EndRow<1 Then Continue END IF IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then li_CurRow = lnv_Object.OF_GetLastRow() +1 ELSE li_CurRow = li_StartRow + al_xlsrow END IF li_EndRow = li_CurRow + li_EndRow - li_StartRow pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_StartCol) IF pCell<=0 Then Continue END IF lb_WriteValue=false lb_SameValue=False IF lnv_Object.ObjType<>"tempobj" AND lnv_Object.NoContaint=False Then OF_WriteValue(lnv_Object, pCell, li_DataRow ,lb_WriteValue,lb_SameValue ) //输出内容 END IF IF lnv_Object.CellHasMultiObjects Then IF lb_WriteValue Then OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式 END IF ELSEIF lnv_Object.DynamicPosition Then // OR ib_AutoHeight IF lb_WriteValue OR lnv_Object.PositionChanged=False Then OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式 END IF ELSE OF_WriteFormat(lnv_Object, li_CurRow,pCell, li_DataRow ) //输出单元格式 END IF IF lnv_Object.IsSparse AND lb_SameValue AND lnv_Object.LastRow>0 AND lnv_Object.LastWriteValueRow1 Then //AND inv_Requestor.OF_IsDetail_Begin()=False IF inv_Requestor.OF_GetProcessing()="1" OR inv_Requestor.OF_GetProcessing()="4" Then inv_Api.SetBorder(pCell,inv_Api.Border_TOP,inv_Api.BorderStyle_NONE, 0) li_Cell = inv_Api.GetCell(il_hSheet, lnv_Object.LastRow,lnv_Object.StartCol ) IF li_Cell>0 Then inv_Api.SetBorder(li_Cell,inv_Api.Border_BOTTOM ,inv_Api.BorderStyle_NONE, 0) END IF END IF END IF //合并单元 IF lnv_Object.EndRow> lnv_Object.StartRow OR lnv_Object.EndCOl>lnv_Object.StartCol Then IF lnv_Object.CellHasMultiObjects Then //OR ib_AutoHeight IF lb_WriteValue Then inv_Api.MergeCells(il_hSheet, li_CurRow,li_StartCol, li_EndRow, li_EndCol) END IF ELSEIF lnv_Object.DynamicPosition Then IF lb_WriteValue OR lnv_Object.PositionChanged=False Then inv_Api.MergeCells(il_hSheet, li_CurRow,li_StartCol, li_EndRow, li_EndCol) END IF ELSE inv_Api.MergeCells(il_hSheet, li_CurRow ,li_StartCol, li_EndRow , li_EndCol) END IF END IF IF lb_WriteValue OR ( lnv_Object.AutoHeight=False AND lnv_Object.CellHasMultiObjects =False) Then IF li_EndRow > li_Max_EndRow Then li_Max_EndRow = li_EndRow END IF END IF IF lnv_Object.IsSparse AND lb_WriteValue AND al_Row>1 Then For lj=li+1 To UpperBound(inv_Objects) IF inv_Objects[lj].IsSparse Then inv_Objects[lj].LastWriteValueRow = al_Row END IF Next END IF lnv_Object.LastRow =li_EndRow Next li_OutRows = li_Max_EndRow - al_xlsrow IF li_OutRows>OF_RowCount() Then //存在子数据窗口,则根据线条的位置重新设置边线 For li=1 TO UpperBound(inv_HLines) IF inv_HLines[li].ii_TopBottom<>2 Then Continue END IF IF inv_HLines[li].IsClone Then Continue END IF IF inv_HLines[li].Y1Exp_RowHeight=False AND & ((inv_HLines[li].Y1+30)"" Then IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_HLines[li].VisibleExp))=0 Then //OF_GetExpValue Continue END IF END IF IF inv_HLines[li].IsSlideUp AND IsValid(inv_HLines[li].inv_SlideupObject) Then OF_WriteBorder( inv_HLines[li], inv_HLines[li].inv_SlideupObject.LastRow - inv_HLines[li].inv_SlideupObject.StartRow ) //+ inv_HLines[li].StartRow ELSEIF inv_HLines[li].Y1Exp_RowHeight Then li_StartRow = inv_HLines[li].StartRow li_EndRow = inv_HLines[li].EndRow inv_HLines[li].StartRow = li_OutRows inv_HLines[li].EndRow = li_OutRows OF_WriteBorder( inv_HLines[li], al_XlsRow) inv_HLines[li].StartRow=li_StartRow inv_HLines[li].EndRow= li_EndRow END IF Next For li=1 TO UpperBound(inv_VLines) IF inv_VLines[li].IsClone Then Continue END IF IF inv_VLines[li].Y2Exp_RowHeight=False AND ((inv_VLines[li].Y2+30)"" Then IF Long(inv_Requestor.OF_Evaluate(al_Row,inv_VLines[li].VisibleExp))=0 Then Continue END IF END IF li_EndRow = inv_VLines[li].EndRow inv_VLines[li].EndRow = li_OutRows OF_WriteBorder( inv_VLines[li], al_XlsRow) inv_VLines[li].EndRow= li_EndRow Next END IF IF ib_AutoHeight Then IF li_OutRows<0 Then li_OutRows =0 END IF ELSE IF li_OutRowsCOLOR_TRANSPARENT OR is_BKColorExp="") AND & lnv_Object.IsSparse=False Then IF IsValid(lnv_Object.inv_TopLine) Then IF lnv_Object.inv_TopLine.VisibleExp<>'' THen Continue END IF END IF IF IsValid(lnv_Object.inv_BottomLine) Then IF lnv_Object.inv_BottomLine.VisibleExp<>'' THen Continue END IF END IF IF lnv_Object.IsSlideUp AND UpperBound(lnv_Object.inv_SlideUpObject)>0 Then li_StartRow = lnv_Object.OF_GetLastRow() +1 li_EndRow = li_StartRow + (lnv_Object.EndRow - lnv_Object.StartRow) ELSE li_StartRow = lnv_Object.StartRow li_EndRow = lnv_Object.EndRow END IF li_StartCol = lnv_Object.StartCol li_EndCol = lnv_Object.EndCol IF li_StartCol<1 OR li_EndCol<1 OR li_StartRow<1 OR li_EndRow<1 Then Continue END IF li_CurRow = li_StartRow + al_xlsrow pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_StartCol) lnv_Object.xfIndex =inv_Api.GetXF(pCell) END IF Next END IF ib_FirstOut =False Return li_OutRows Return 0 end function public subroutine of_writeborder (readonly n_dw2xls_line anv_line, readonly long al_xlsrow);Int li_Row, li_Col , li_Side Int li_StartRow ,li_EndRow, li_StartCol, li_EndCol Long li_CurRow,pCell IF anv_Line.IsClone Then Return END IF IF anv_Line.ii_LeftRight<>0 Then IF anv_Line.ii_LeftRight=1 Then li_Col =anv_Line.StartCol li_Side = inv_Api.BORDER_LEFT ELSE li_Col = anv_Line.EndCol li_Side = inv_Api.BORDER_RIGHT END IF For li_Row = anv_Line.StartRow To anv_Line.EndRow li_CurRow = al_xlsRow + li_Row pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_Col) inv_Api.SetBorder(pCell, li_Side, anv_Line.BorderStyle ,anv_Line.PenColor ) Next ELSEIF anv_Line.ii_TopBottom<>0 Then IF anv_Line.ii_TopBottom=1 Then li_Row =anv_Line.StartRow li_Side = inv_Api.BORDER_TOP ELSE li_Row = anv_Line.EndRow li_Side = inv_Api.BORDER_BOTTOM END IF For li_Col = anv_Line.StartCol To anv_Line.EndCol li_CurRow = al_xlsRow + li_Row pCell = inv_Api.GetCell(il_hSheet, li_CurRow, li_Col) inv_Api.SetBorder(pCell, li_Side, anv_Line.BorderStyle ,anv_Line.PenColor ) Next END IF end subroutine protected subroutine of_writeformat (readonly n_dw2xls_object anv_object, readonly long al_xlsrow, readonly long pcell, readonly long al_row);Long li ,lj String ls_Temp Long li_Temp,li_Cell, li_XF //输出对象的格式,如字体、对齐方式、边框等 IF anv_Object.XFIndex<> -1 Then inv_Api.SetXF(pCell, anv_Object.XFIndex ) ELSEIF anv_Object.NoContaint Then IF anv_Object.BorderStyle='2' Then FOR lj=anv_Object.StartCol To anv_Object.EndCol li_Cell = inv_Api.GetCell(il_hSheet, al_xlsRow + anv_Object.EndRow - anv_Object.StartRow,lj ) inv_Api.SetBorder(pCell, inv_Api.borderstyle_thin, 0 ) Next ELSEIF anv_Object.BorderStyle='4' Then FOR lj=anv_Object.StartCol To anv_Object.EndCol li_Cell = inv_Api.GetCell(il_hSheet, al_xlsRow + anv_Object.EndRow - anv_Object.StartRow,lj ) inv_Api.SetBorder(pCell, inv_Api.Border_BOTTOM, inv_Api.borderstyle_thin, 0 ) Next END IF ELSE IF anv_Object.ObjType="tempobj" Then IF is_BKColorExp<>"" Then //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, is_BKColorExp )) ) li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue(is_BKColorExp,1 )) ) IF li_Temp<>COLOR_TRANSPARENT Then inv_Api.SetBackColor(pCell, li_Temp ) END IF ELSEIF il_BkColor<>COLOR_TRANSPARENT Then inv_Api.SetBackColor(pCell, il_BkColor ) END IF ELSE IF anv_Object.FontNameExp="" Then inv_Api.SetFontName(pCell, anv_Object.FontName ) ELSE //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontNameExp) ls_Temp =inv_Requestor.OF_GetExpValue(anv_Object.FontNameExp,anv_Object.RowInDetail ) IF ls_Temp="" Then inv_Api.SetFontName(pCell, anv_Object.FontName ) ELSE inv_Api.SetFontName(pCell, ls_Temp ) END IF END IF IF anv_Object.FontSizeExp="" Then inv_Api.SetFontSize(pCell, anv_Object.FontSize ) ELSE // li_Temp =Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontSizeExp)) li_Temp =Long(inv_Requestor.OF_GetExpValue( anv_Object.FontSizeExp, anv_Object.RowInDetail )) IF li_Temp=0 Then inv_Api.SetFontSize(pCell, anv_Object.FontSize ) ELSE IF li_Temp>0 Then inv_Api.SetFontSize(pCell, inv_Requestor.OF_GetWinApi().OF_GetFontSize(li_Temp, inv_Requestor.OF_GetUnits() ) ) ELSE inv_Api.SetFontSize(pCell, Abs(li_Temp) ) END IF END IF END IF IF anv_Object.FontBoldExp="" Then inv_Api.SetFontBold(pCell, anv_Object.FontBold ) ELSE //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontBoldExp) ls_Temp =inv_Requestor.OF_GetExpValue(anv_Object.FontBoldExp , anv_Object.RowInDetail ) IF ls_Temp>='700' Then inv_Api.SetFontBold(pCell, True ) ELSE inv_Api.SetFontBold(pCell, False ) END IF END IF IF anv_Object.FontItalicExp="" Then inv_Api.SetFontItalic(pCell, anv_Object.FontItalic ) ELSE // ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontItalicExp) ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontItalicExp,anv_Object.RowInDetail ) IF ls_Temp="1" OR ls_Temp="yes" Then inv_Api.SetFontItalic(pCell, True ) ELSE inv_Api.SetFontItalic(pCell, False ) END IF END IF IF anv_Object.FontUnderlineExp="" Then inv_Api.SetFontUnderline(pCell, anv_Object.FontUnderline ) ELSE //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontUnderlineExp) ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontUnderlineExp,anv_Object.RowInDetail ) IF ls_Temp="1" OR ls_Temp="yes" Then inv_Api.SetFontUnderline(pCell, True ) ELSE inv_Api.SetFontUnderline(pCell, False ) END IF END IF IF anv_Object.FontStrikeoutExp="" Then inv_Api.SetFontStrikeout(pCell, anv_Object.FontStrikeout ) ELSE //ls_Temp =inv_Requestor.OF_Evaluate(al_Row, anv_Object.FontStrikeoutExp) ls_Temp =inv_Requestor.OF_GetExpValue( anv_Object.FontStrikeoutExp,anv_Object.RowInDetail ) IF ls_Temp="1" OR ls_Temp="yes" Then inv_Api.SetFontStrikeout(pCell, True ) ELSE inv_Api.SetFontStrikeout(pCell, False ) END IF END IF IF anv_Object.ColorExp="" Then IF anv_Object.Color<>COLOR_TRANSPARENT Then inv_Api.SetTextColor(pCell, anv_Object.Color) END IF ELSE //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.ColorExp)) ) li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue( anv_Object.ColorExp,anv_Object.RowInDetail )) ) IF li_Temp<>COLOR_TRANSPARENT Then inv_Api.SetTextColor(pCell, li_Temp ) END IF END IF IF anv_Object.bkColorExp="" Then IF anv_Object.BkColor<>COLOR_TRANSPARENT AND anv_Object.BkColor<>inv_Requestor.OF_GetBKColor() Then inv_Api.SetBackColor(pCell, anv_Object.BkColor) END IF ELSE //li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_Evaluate(al_Row, anv_Object.bkColorExp)) ) li_Temp =inv_Api.OF_GetColor( Long(inv_Requestor.OF_GetExpValue( anv_Object.bkColorExp, anv_Object.RowInDetail )) ) IF li_Temp<>inv_Requestor.OF_GetBKColor() AND li_Temp<>COLOR_TRANSPARENT Then inv_Api.SetBackColor(pCell, li_Temp ) END IF END IF //输出数据格式、对齐方式 inv_Api.SetHalignment(pCell, anv_Object.HAlignment ) inv_Api.SetValignment(pCell, anv_Object.VAlignment ) inv_Api.SetTextWrap(pCell,anv_Object.WrapText ) IF anv_Object.FormatExp='' Then IF anv_Object.Format<>'' Then inv_Api.SetFormat(pCell, anv_Object.Format ) END IF ELSE // ls_Temp = inv_Requestor.OF_Evaluate(al_Row, anv_Object.FormatExp) ls_Temp = inv_Requestor.OF_GetExpValue( anv_Object.FormatExp ,anv_Object.RowInDetail ) IF ls_Temp<>"" Then inv_Api.SetFormat(pCell, ls_Temp ) END IF END IF END IF //输出边框\颜色等 IF anv_Object.BorderStyle='2' Then inv_Api.SetBorder(pCell, inv_Api.borderstyle_thin, 0) ELSEIF anv_Object.BorderStyle='4' Then //下边线 inv_Api.SetBorder(pCell, inv_Api.Border_BOTTOM, inv_Api.borderstyle_thin, 0 ) END IF END IF anv_Object.WritedFormat =TRUE end subroutine protected subroutine of_writevalue (readonly n_dw2xls_object anv_object, readonly long pcell, readonly long al_row, ref boolean ab_writevalue, ref boolean ab_samevalue);Long li_Pos ,li_Cell ,li_LastRow String ls_Value Double ldb_Value Date ld_Value Datetime ldt_Value Time lt_Value ab_WriteValue =False ab_SameValue =False IF anv_Object.IsSparse Then li_LastRow = anv_Object.OF_GetLastWriteValueRow() END IF //输出对象的数据内容 IF anv_Object.ObjType="text" Then IF anv_Object.TextExp<>'' Then //ls_Value =inv_Requestor.OF_Evaluate(al_Row, anv_Object.TextExp) ls_Value =inv_Requestor.OF_GetExpValue( anv_Object.TextExp , anv_Object.RowInDetail ) ELSE ls_Value = anv_Object.Text END IF IF Pos(ls_Value,"~r")>0 AND Pos(ls_Value,"~n")<=0 Then ls_Value=inv_Requestor.OF_ReplaceAll(ls_Value,"~r","~r~n") anv_Object.WrapText=TRUE inv_Api.SetTextWrap(pcell, TRUE ) END IF IF IsNull(ls_Value) Then ls_Value="" END IF IF ls_Value<>'' Then IF anv_Object.WrapText=False AND anv_Object.Alignment='0' AND & (anv_Object.X1 - inv_Layout.OF_GetColumn_X1(anv_Object.StartCol ))>anv_Object.SpaceCharWidth AND anv_Object.SpaceCharWidth>0 Then ls_Value=Space(Ceiling( ( anv_Object.X1 - inv_Layout.OF_GetColumn_X1(anv_Object.StartCol )) / anv_Object.SpaceCharWidth) ) + ls_Value //ELSEIF anv_Object.Alignment='1' AND ( inv_Layout.OF_GetColumn_X2(anv_Object.EndCol ) - anv_Object.X2 )>anv_Object.SpaceCharWidth AND anv_Object.SpaceCharWidth>0 Then // ls_Value =ls_Value+Space(Ceiling( (inv_Layout.OF_GetColumn_X2(anv_Object.EndCol ) - anv_Object.X2 ) / anv_Object.SpaceCharWidth) ) END IF inv_Api.SetValue(pcell, ls_Value ) ab_WriteValue =TRUE END IF ELSEIF anv_Object.IsGetDisplayValue Then ls_Value =inv_Requestor.OF_GetDisplayValue(al_Row, anv_Object.ColID, anv_Object.Name, anv_Object.IsCloneColumn, anv_Object.EditStyle , anv_Object.ColType ) IF IsNull(ls_Value) Then ls_Value="" END IF IF ls_Value<>"?" AND ls_Value<>"!" AND ls_Value<>"" Then IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False THEN IF li_LastRow1 Then ab_SameValue =TRUE ELSE anv_Object.PriorRowValue =ls_Value END IF END IF ELSEIF anv_Object.ObjType="column" OR anv_Object.ObjType="compute" Then IF anv_Object.ColType="" Then //对象的计算公式可能无效 Return END IF IF anv_Object.ColType="char" Then IF anv_Object.ColID>0 Then ls_Value = inv_Requestor.OF_GetItemString(al_Row, anv_Object.ColID) ELSE ls_Value = inv_Requestor.OF_GetItemString(al_Row, anv_Object.Name) END IF IF IsNull(ls_Value) Then ls_Value="" END IF IF anv_Object.IsCheckBox AND anv_Object.CheckBox_Text<>"" Then IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow"" AND IsNull(ls_Value)=False Then IF Pos(ls_Value,"~r")>0 AND Pos(ls_Value,"~n")<=0 Then ls_Value=inv_Requestor.OF_ReplaceAll(ls_Value,"~r","~r~n") END IF IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow1 Then ab_SameValue=TRUE ELSE anv_Object.PriorRowValue =ls_Value END IF END IF ELSEIF anv_Object.ColType="datetime" Then IF anv_Object.ColID>0 Then ldt_Value = inv_Requestor.OF_GetItemDateTime(al_Row,anv_Object.ColID) ELSE ldt_Value = inv_Requestor.OF_GetItemDateTime(al_Row,anv_Object.Name) END IF IF IsNull(ldt_Value)=False Then //Date(ldt_Value)<>Date("1900-01-01") AND IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow0 Then ld_Value = inv_Requestor.OF_GetItemDate(al_Row,anv_Object.ColID) ELSE ld_Value = inv_Requestor.OF_GetItemDate(al_Row,anv_Object.Name) END IF IF Not IsNull(ld_Value) Then //Date(ld_Value)<>Date("1900-01-01") AND IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow0 Then lt_Value = inv_Requestor.OF_GetItemTime(al_Row,anv_Object.ColID) ELSE lt_Value = inv_Requestor.OF_GetItemTime(al_Row,anv_Object.Name) END IF IF IsNull(lt_Value)=False Then IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow0 Then ldb_Value =inv_Requestor.OF_GetItemNumber(al_Row, anv_Object.ColID ) ELSE ldb_Value =inv_Requestor.OF_GetItemNumber(al_Row, anv_Object.Name) END IF IF anv_Object.IsCheckBox AND anv_Object.CheckBox_Text<>"" Then IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow"" AND IsNull(ls_Value)=False Then IF anv_Object.IsSparse AND inv_Requestor.OF_IsDetail_Begin()=False Then IF li_LastRow150 Then // inv_Layout.OF_RegistObject(lnv_Object.X1) // inv_Layout.OF_RegistObject(lnv_Object.X2 ) IF is_Name<>"detail" THEN IF lnv_Object.Alignment='1' AND lnv_Object.NoContaint=False THEN li_Next_X1=inv_Layout.OF_Get_Next_X1(lnv_Object.x2 -30 ) IF li_Next_X1<=lnv_Object.X1 AND (lnv_Object.x2 - li_Next_X1 )>100 Then inv_Layout.OF_RegistObject(lnv_Object.X2 ,FALSE) ELSEIF (li_Next_X1 - lnv_Object.x2)>100 Then //如果跟边线离得不是太远,则不登记了 inv_Layout.OF_RegistObject(lnv_Object.X2,FALSE ) END IF END IF END IF Next end subroutine public function integer of_gety1 (long ai_row); IF ai_Row>ids_Rows.RowCount() Then ai_Row=ids_Rows.RowCount() END IF IF ai_Row<=0 Then Return 0 END IF RETURN ids_Rows.GetItemNumber(ai_Row,"y1") end function public function Long of_gety2 (integer ai_row);IF ai_Row>ids_Rows.RowCount() Then ai_Row=ids_Rows.RowCount() END IF IF ai_Row<=0 Then Return 0 END IF RETURN ids_Rows.GetItemNumber(ai_Row,"y2") end function public subroutine of_updatebandheight (readonly long ai_height);IF ib_AutoHeight AND ai_Height> il_BandHeight Then il_BandHeight = ai_Height END IF end subroutine public function Long of_getrowheight (integer ai_row);IF ai_Row<0 OR ai_Row>ids_Rows.RowCount() Then Return 0 END IF Long li_Height li_Height =ids_Rows.GetItemNumber(ai_Row,"y2") - ids_Rows.GetItemNumber(ai_Row,"y1") li_Height = ( UnitsToPixels(li_Height,YUnitsToPixels!)+2) *1440 /inv_Layout.ii_LOGPIXELSY Return li_Height end function public function Long of_getbandheight ();Return il_BandHeight end function public function integer of_getstartrow (long ai_y);Int li_Find //IF ai_y=inv_Requestor.of_getheader_beginy() Then // ids_Rows.Saveas("c:\11.txt",text!,false) //end if li_Find = ids_Rows.Find("y1= "+String(ai_y), 1, ids_Rows.RowCount() ) IF li_Find<=0 Then li_Find = ids_Rows.Find("y1<= "+String(ai_y+ii_RowSpace)+" AND y1>= "+String(ai_y - ii_RowSpace),1,ids_Rows.RowCount()) IF li_Find<=0 Then li_Find = ids_Rows.Find("y1> "+String(ai_y + ii_RowSpace),1 , ids_Rows.RowCount() ) IF li_Find<=0 Then li_Find=ids_Rows.Find("y2<"+String(ai_y+ii_RowSpace),ids_Rows.RowCount() ,1) IF li_Find<=0 Then li_Find= ids_Rows.RowCount() ELSE li_Find = li_Find +1 END IF ELSE li_Find = li_Find -1 IF li_Find>0 AND li_Find ai_Y Then li_Find = li_Find +1 END IF END IF END IF END IF END IF IF li_Find<=0 Then li_Find =1 ELSEIF li_Find> ids_Rows.RowCount() Then li_Find = ids_Rows.RowCount() END IF Return li_Find end function public function integer of_getendrow (long ai_y);Int li_Find li_Find = ids_Rows.Find("y2= "+String(ai_y), 1, ids_Rows.RowCount() ) IF li_Find<=0 Then li_Find = ids_Rows.Find("y2<= "+String(ai_y+ii_RowSpace)+" AND y2>= "+String(ai_y - ii_RowSpace),1,ids_Rows.RowCount()) IF li_Find<=0 Then li_Find = ids_Rows.Find("y1> "+String(ai_y +ii_RowSpace), 1, ids_Rows.RowCount() ) IF li_Find<=0 Then li_Find=ids_Rows.Find("y2<"+String(ai_y+ii_RowSpace),ids_Rows.RowCount() ,1) IF li_Find<=0 Then li_Find= ids_Rows.RowCount() ELSE li_Find = li_Find +1 END IF ELSE li_Find = li_Find -1 END IF END IF END IF IF li_Find<=0 Then li_Find =1 ELSEIF li_Find> ids_Rows.RowCount() Then li_Find = ids_Rows.RowCount() END IF Return li_Find end function public function Long getrowheight (integer ai_row);IF ai_Row<0 OR ai_Row>ids_Rows.RowCount() Then Return 0 END IF Return ( ids_Rows.GetItemNumber(ai_Row,"y2") - ids_Rows.GetItemNumber(ai_Row,"y1")) *20 end function public function Long of_getbottomspaceheight ();Return il_BottomSpaceHeight end function protected subroutine of_writerowheight (readonly long al_row, readonly long al_xlsrow);Long li, li_Height IF is_Name="detail" AND ids_Rows.RowCount()=1 AND ib_AutoHeight Then li_Height =Long( inv_Requestor.OF_Evaluate(al_Row -1 ,"RowHeight()")) IF inv_Requestor.OF_GetUnits()='0' Then li_Height = UnitsToPixels(li_Height, YUnitsToPixels!) ELSEIF inv_Requestor.OF_GetUnits()='2' Then li_Height =inv_Api.OF_InchToPixels(li_Height/1000) ELSEIF inv_Requestor.OF_GetUnits()='3' Then li_Height =inv_Api.OF_CMToPixels(li_Height /1000 ) END IF li_Height =li_Height*1440 /inv_Layout.ii_LOGPIXELSY IF li_Height>0 Then inv_Api.SetRowHeight(il_hSheet, al_xlsRow+1, li_Height) END IF ELSE For li=1 To ids_Rows.RowCount() li_Height = ids_Rows.GetItemNumber(li,"y2") - ids_Rows.GetItemNumber(li,"y1") li_Height = ( UnitsToPixels(li_Height,YUnitsToPixels!)+2) *1440 /inv_Layout.ii_LOGPIXELSY IF li_Height>0 Then inv_Api.SetRowHeight(il_hSheet, al_xlsRow+li, li_Height) END IF Next END IF end subroutine on n_dw2xls_band.create call super::create TriggerEvent( this, "constructor" ) end on on n_dw2xls_band.destroy TriggerEvent( this, "destructor" ) call super::destroy end on event destructor;Int li For li=1 To UpperBound(inv_Objects) Destroy inv_Objects[li] Next For li=1 To UpperBound(inv_VLines) Destroy inv_VLines[li] Next For li=1 To UpperBound(inv_HLines) Destroy inv_HLines[li] Next Destroy ids_Rows end event event constructor;String ls_Syntax ids_Rows = Create DataStore ls_Syntax =" release 6 ; "+ & " datawindow(units=0 processing=1 ) " + & " header(height=0 ) " + & " detail(height=0 ) "+ & " summary(height=0 ) "+ & " table( "+& " column=(type=long updatewhereclause=no name=y1 dbname='y1' initial='0' ) " +& " column=(type=long updatewhereclause=no name=y2 dbname='y2' initial='0' ) " +& " column=(type=long updatewhereclause=no name=textrect_y1 dbname='textrect_y1' initial='0' ) " +& " column=(type=long updatewhereclause=no name=textrect_y2 dbname='textrect_y2' initial='0' ) " +& " column=(type=long updatewhereclause=no name=topspace dbname='topspace' initial='0' ) " +& " column=(type=long updatewhereclause=no name=bottomspace dbname='bottomspace' initial='0' ) " +& " column=(type=char(1) updatewhereclause=no name=TopLine dbname='TopLine' initial='0' ) " +& " column=(type=char(1) updatewhereclause=no name=BottomLine dbname='BottomLine' initial='0' ) " +& " column=(type=long updatewhereclause=no name=OldRowNum dbname='OldRowNum' initial='0' ) " +& " column=(type=long updatewhereclause=no name=NewRowNum dbname='NewRowNum' initial='0' ) " +& " sort='y1 A, y2 A ' ) " ids_Rows.Create( ls_Syntax) end event