分享

张洪举权威指南中用Excel实现自定义报表输出

 Alkaid2015 2013-10-24

*!* 创建临时表并按表格列的索引号排序
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这句就会出错。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多