---- 存在的問題
---- 用VFP生面的執(zhí)行程序后,對于用戶所需的某一數(shù)據(jù)庫的任意字段組合報表,就顯得不是那樣運用自如。因為,一方面軟件開發(fā)時,無法考慮到日后用戶所需報表的所有格式。另一方面,由于所設(shè)計好的報表格式文件已編譯成可執(zhí)行文件,即使修改了.FRX和.FRT文件結(jié)構(gòu)內(nèi)容,也需在開發(fā)環(huán)境下重新編譯,對用戶來講是不實現(xiàn)的。例如需一份員工名單及一個空欄位,進(jìn)行簽名或登記某一證件號碼的問題就比較難解決。
---- 解決方案
---- 運用VFP與Excel 的交換數(shù)據(jù)及在VFP中全面控制Excel的操作(即自動服務(wù)器),就可以很好的解決這一問題。關(guān)于如何控制Excel,一方面可以通過Excel的幫助文件的VBA語法,另一方面也有相當(dāng)多的文章關(guān)于控制Excel的語法。值得注意的是:1、為提高效率,所有有關(guān)計算、小計、合計最好在VFP中進(jìn)行,并寫在相應(yīng)的記錄內(nèi);2、由于是兩個軟件,如果在有大量數(shù)據(jù)逐一插入Excel單元格時,顯得速度較慢,所以如果數(shù)據(jù)量較大,應(yīng)直接用VFP的數(shù)據(jù)表導(dǎo)出為Excel格式,再由VFP在后臺控制Excel打開,并指定的Excel格式文件進(jìn)行修改文檔標(biāo)題、列的名稱、網(wǎng)格線型,以及根據(jù)紙張大小計算各列寬和調(diào)整字體大小。
---- 實現(xiàn)辦法
---- 利用SQL結(jié)構(gòu)化語言的Select生成一個數(shù)據(jù)表
---- 在Select字段時,可以利用一個表單Form1加入兩個列表框,一個列表框列出所有數(shù)據(jù)表的字段,另一個為空,利用鼠標(biāo)雙擊或拖拉至空的列表框里,為選定一字段(此時第一個含有所有字段的列表框中,將不再顯示被拖拉走的字段,而在另一列表中顯示),并生成相應(yīng)的Select查詢程序段。
---- 在本實例中為:form1中含有一個list1和edit1和兩個按鈕
Form1.ini public a,b,c,d,f,g
a="SELECT " b="" c=" FROM bn INTO CURSOR myquery" d="" f=0 g=0
list1.dblclick if len(alltrim(b))=0 b=b+thisform.list1.value else b=b+","+thisform.list1.value endif d=a+b+c thisform.edit1.refresh
for mm=1 to thisform.list1.listcount if thisform.list1.selected(mm) thisform.list1.removeitem(mm) endif endfor
command1.click ** 執(zhí)行所生成的select語句 SELECT &B FROM BN INTO CURSOR MYQUERY sele myquery
command2.click** 調(diào)用excel my=createobject("excel.application") my.visible=.t. **如果在交付用戶時可以將其設(shè)置成 .F. my.workbooks.add select myquery f=fcount() g=reccount()
goto top for l=1 to g for i=1 to f fieldname=field(i) ** 對于要生成中文的列位標(biāo)題可以用 一英文字段名稱與中文名稱對應(yīng)的參數(shù)庫來解決 my.activeworkbook.sheets(1).cells(l,i).value=myquery.&fieldname endfor skip endfor ** 如果要增加一空列可以用 my.activesheet.columns(f+1).insert語法 ** 設(shè)置頁眉 my.activesheet.pagesetup. centerheader (centerfooter)=” xxx”
---- 其它方面的控制可以按上述提到的方法參考
|