*!* 创建临时表并按表格列的索引号排序 CREATE CURSOR curTemp (CntSource C(254),ColIndex N(15) UNIQUE) SET ORDER TO ColIndex
cAlias=Thisform.Grid1.RecordSource SELECT (cAlias) FOR i=1 TO Thisform.Grid1.ColumnCount &&读取要打印的字段信息 IF JUSTSTEM(Thisform.Grid1.Columns(i).Header1.Picture)=\"selected\" INSERT INTO curTemp (CntSource,ColIndex) VALUES ; (Thisform.Grid1.Columns(i).ControlSource,Thisform.Grid1.Columns(i).ColumnOrder) 此句是什么意思? ENDIF ENDFOR
cTmp=\"\" SELECT curTemp SCAN &&生成SQL语句的字段 cTmp=cTmp+ALLTRIM(curTemp.CntSource)+\",\" ENDSCAN
USE IN curTemp cTmp=SUBSTR(cTmp,1,LEN(cTmp)-1) &&删除尾部的逗号 cSQL=\"SELECT \"+cTmp+\" FROM \"+cAlias+\" INTO CURSOR curPrint\" &&生成SQL语句 &cSQL &&&运行提示有问题 SELECT curPrint nCount=AFIELDS(aPrtArray) &&将表结构信息保存在数组中 IF NOT USED(\"tblPrtSet\") USE tblPrtSet ALIAS tblPrtSet IN 0 ENDIF GO TOP
*!* 设置EXCEL表格头 oExl=CREATEOBJECT(\"Excel.Application\") oExl.Workbooks.Add oExl.Worksheets(\"sheet1\").Activate oExl.ActiveSheet.PageSetup.TopMargin=tblPrtSet.TopMarg/0.035 &&设置上边距 oExl.ActiveSheet.PageSetup.BottomMargin=tblPrtSet.BottMarg/0.035 &&下边距 oExl.ActiveSheet.PageSetup.LeftMargin=tblPrtSet.LeftMarg/0.035 &&左边距 oExl.ActiveSheet.PageSetup.RightMargin=tblPrtSet.RightMarg/0.035 &&右边距 oExl.ActiveSheet.PageSetup.PrintTitleRows =\"$1:$2\" &&设置顶端标题行 oExl.ActiveSheet.PageSetup.PaperSize=tblPrtSet.PaperSize &&纸张大小 oExl.ActiveSheet.PageSetup.Orientation=tblPrtSet.Orientate &&纸张方向 oExl.ActiveSheet.PageSetup.RightHeader=\"第&P页 共&N页\" oExl.ActiveSheet.PageSetup.HeaderMargin=tblPrtSet.HeaderMarg/0.035 &&页眉 oExl.ActiveSheet.PageSetup.FooterMargin=tblPrtSet.FooterMarg/0.035 &&页脚 oExl.ActiveSheet.PageSetup.Zoom=tblPrtSet.Zoom &&缩放比例 oExl.Cells(1,1).Value=Thisform.Text1.Value oExl.Cells(1,1).Font.Name=\"黑体\" oExl.Cells(1,1).Font.Size=14 oExl.Cells(1,1).HorizontalAlignment=3 &&水平居中 oExl.Range(To26(1)+\"1:\"+To26(nCount)+\"1\").Merge &&合并列
*!* 循环生成表格头 FOR i=1 TO nCount oExl.ActiveSheet.Columns(i).Font.Size=9 oExl.ActiveSheet.Columns(i).ColumnWidth=10 oExl.Cells(2,i).Value=aPrtArray(i,1) oExl.Cells(2,i).HorizontalAlignment=3 &&水平居中 ENDFOR
*!* 生成表内容 SELECT curPrint nRow=3 SCAN FOR nColumn=1 TO nCount cField=aPrtArray(nColumn,1) oExl.Cells(nRow,nColumn).Value=&cField ENDFOR nRow=nRow+1 ENDSCAN oExl.Range(\"A2:\"+To26(nCount)+ALLTRIM(STR(nRow-1))).Borders.LineStyle=1 &&细线 oExl.Range(\"a2:\"+To26(nCount)+ALLTRIM(STR(nRow-1))).Borders.Weight=2 &&线粗细 oExl.Visible=.T. &&显示Excel *!* oExl.ActiveSheet.PrintOut &&直接打印输出
这其实是一条INSERT - SQL 命令分成两行来写而已,这条命令的意思应该不用我说了吧,真不懂就查查帮助文件
INSERT INTO curTemp (CntSource,ColIndex) VALUES (Thisform.Grid1.Columns(i).ControlSource,Thisform.Grid1.Columns(i).ColumnOrder)
至于 &cSQL 为什么会出错,是因为变量cTmp里面是空串,也就是说curTemp里面没有记录,为什么会没有记录呢?请在第一个for循环里面找原因。我看大概是运行的时候你一个表头都没有选择,而这个FOR循环就是要将表单中的表格控件里所选择的表头所代表的字段名存入临时表curTemp。
所以这个示例程序还是有待完善的,比如它必须通过那个“打开表”的按钮来选择表,这样才会应用自定义表头,如果你运行表单的时候当前工作区有表打开它里面的表格也会显示,但是这时没有应用自定义表头,后面输出就会出错;而你一个表头都没有选择的时候,curTemp里面就没有实际的内容,从而变量cSQL就是空串,那么&SQL这句就会出错。
|