注册 登录
编程论坛 VFP论坛

如何按班级、按模板格式批量生成WORD表格

王咸美 发布于 2021-12-30 08:05, 3090 次点击
现有 成绩汇总表.dbf、模板文件cjtjmb.doc,如何按班级、按模板格式批量生成WORD表格(各班成绩统计表)?请高手帮忙,万分感谢!!!
只有本站会员才能查看附件,请 登录

成绩汇总表.dbf
只有本站会员才能查看附件,请 登录

模板文件cjtjmb.doc
只有本站会员才能查看附件,请 登录

生成的样表
只有本站会员才能查看附件,请 登录

12 回复
#2
laowan0012021-12-30 08:37
不管转成什么,还是先加工好dbf,之后就好办了
另外:转成excel不好吗?
#3
王咸美2021-12-30 08:54
附件中含 成绩汇总表.dbf和模板文件 cjtjmb.doc
#4
sostemp2021-12-30 09:13
判断WORD多少行
根据记录数来进行定位填充,可能分为多种情况。(一页或多页)


#5
吹水佬2021-12-30 10:54
回复 楼主 王咸美
看了一下你发问的贴,如果都看通透应该可成WORD的专家,填写WORD模板应该不成问题。
#6
厨师王德榜2021-12-31 11:09
可以做,一个班最多60人吗? 以下代码可以达到要求.
程序代码:
CLEAR
CLOSE TABLES ALL
PUBLIC cpath  as String  

LOCAL iArr1 as Integer ,iMax as Integer
cpath = 'c:\XIDE\Projects\'  &&  成绩表和模板文件所在的文件夹。
iMax = 60  &&  模板文件可装入人数的最大值。
USE (cpath + '成绩汇总表.DBF')  IN 0
SELECT 班级 ,COUNT(*) as 人数 FROM 成绩汇总表 GROUP BY 班级 INTO ARRAY arrbanji
FOR iArr1 = 1 TO ALEN( arrbanji ,1)
    IF arrbanji[iArr1 ,2] > iMax THEN
        WAIT  arrbanji[iArr1 ,1] + '' +  LTRIM(STR(arrbanji[iArr1 ,2])) + ;
         '人,人数超出模板文件限制,请重新制定模板。程序将跳过制作该班汇总表。' WINDOW AT  10 ,20 TIMEOUT  3
    ELSE
        WAIT  arrbanji[iArr1 ,1] + '' +  LTRIM(STR(arrbanji[iArr1 ,2])) + ;
         '人,程序开始制作该班汇总表。。。' WINDOW AT  10 ,20 NOWAIT
        SELECT 姓名,语文,数学,英语 FROM 成绩汇总表 INTO ARRAY arrcj where 班级 = arrbanji[iArr1 ,1]
        = MakeDoc(arrbanji[iArr1 ,1] ,@arrcj)
        RELEASE arrcj        
    ENDIF
   
NEXT iArr1

USE IN 成绩汇总表
WAIT CLEAR
MESSAGEBOX('制作完成,共输出' +  LTRIM(STR(ALEN( arrbanji ,1)))  + '个文件。',64,'成绩汇总表')
RELEASE arrbanji


PROCEDURE MakeDoc(bjmc ,arrcj2)
LOCAL oApp as Object ,oDoc as Object ,oTab as Object
LOCAL cWordFile as String ,cFileOut as String
LOCAL iside ,iCol , iRow , ii as Integer
STORE 0 TO  iside ,iCol , iRow , ii
cWordFile = cpath + 'cjtjmb.doc'  &&  模板文件
cFileOut = cpath + bjmc  &&  输出文件
oApp = CREATEOBJECT('Word.Application')
oDoc = oApp.Documents.Open(cWordFile,0,.t.)
oTab = oDoc.Tables(1)

For iside = 1 To 2
    For irow = 2 To oTab.Rows.Count
        IF ii < ALEN(arrcj2 ,1 ) THEN
            For icol = 1 To 4
                oTab.cell(irow, icol + 4 * (iside - 1)).Range.Text = arrcj2(irow + 30 * (iside - 1) - 1, icol)         
            Next icol
            ii = ii + 1
        ELSE
            EXIT
        ENDIF
    Next irow
Next iside


IF FILE(cFileOut) THEN
    DELETE FILE &cFileOut
ENDIF
odoc.SaveAs2(cFileOut)
oDoc.Close()
oApp.Quit()

ENDPROC
#7
schtg2022-01-01 07:29
回复 6楼 厨师王德榜
好办法!
#8
王咸美2022-01-01 15:07
Thank you!

[此贴子已经被作者于2022-1-1 15:21编辑过]

#9
adonguo1632022-01-29 10:44
真是高手
#10
yuq2022-03-13 10:36
回复 6楼 厨师王德榜
可以标一下注释吗?让我们新手也学习、瞻仰一下
#11
星光闪闪5132022-03-13 17:30
oTab.cell(irow, icol + 4 * (iside - 1)).Range.Text = arrcj2(irow + 30 * (iside - 1) - 1, icol)  执行时有ole错误
#12
星光闪闪5132022-03-13 17:34
只有本站会员才能查看附件,请 登录
#13
yuq2022-11-04 09:57
回复 6楼 厨师王德榜
将多个班级放在同一文件中应该怎么做呢?
1