将数据按班导出到同EXCEL的不同工作表上代码的改进反馈,并求助!
*************************************************************************** 程 序 名:按班导出到EXCEL的不同工作表中.PRG
* 原贴提问:如何把一个学生成绩表,分别按 班级 导出excel中不同的sheet中。
* 比如:把一班的成绩导出到sheet1中,把二班的成绩导出到sheet2中。
* 翁建林于2011年12月16日晚摘自 https://bbs.bccn.net/thread-197786-1-8.html 帖子
* 上Tiger5392的回答,并进行了修改和注释
* 原回答上生成的EXCEL表上没有字段名,经修改后就有了字段名
* 原理理解:数据表的记录排列前提是以班级为序
**************************************************************************
SET SAFETY off
SET ENGI 70
create cursor Student (班级 C(10),学号 C(8),姓名 C(8),性别 C(2))
insert into Student Values ('经济04-1','B0401001','张三','男')
insert into Student Values ('经济04-1','B0401002','李四','男')
insert into Student Values ('经济04-2','B0401003','王五','男')
insert into Student Values ('经济04-2','B0401004','赵六','男')
insert into Student Values ('经济04-3','B0401005','孙启','男')
insert into Student Values ('经济04-3','B0401006','周把','男')
insert into Student Values ('经济05-1','B0501001','乌桕','男')
insert into Student Values ('经济05-1','B0501002','手动','男')
insert into Student Values ('经济05-1','B0501003','风格','男')
insert into Student Values ('经济06-1','B0601001','规划','男')
insert into Student Values ('经济06-1','B0601002','沟通','男')
select * from student order by 班级 into cursor st
select count(*) as amount from student group by 班级 into cursor st1
select st1
lnSheets=reccount('st1') &&&&这个是记录班级数量
*----------------------------------------------------
*
*此外需加一判断,如果用户的电脑上未装EXCEL软件,则结束运行。 此判断不会写,请高手赐教
*
*----------------------------------------------------
oel=NewObject('Excel.Application') &&&&这是创建EXCEL对象
oel.workbooks.add &&&这是增加工作簿
oel.visible=.t. &&&显示EXCEL对象
DO while oel.workbooks(1).worksheets.count<lnSheets
oel.workbooks(1).worksheets.add
ENDDO
*--- 通过这个DO while……ENDDO循环增加工作表
*----------------------------------------------------
select st &&&& 数据表的记录排列前提是以班级为序
lcClass=space(100) &&&&& 班级名变量
lnCnt=0 &&&&& 工作表计数
lnRow=1 &&&&& 行控制变量
SCAN
IF lcClass#班级 &&&& 如果变量 lcClass 与字段名变量的内容不相等
lnCnt=lnCnt+1 &&& 用于控制EXCEL中的第几张表
lnRow=1
lcClass=班级
oel.workbooks(1).worksheets(lnCnt).name=lcClass &&&&&对工作表的名称命名为 DBF表中bj字段中的班级名
oel.workbooks(1).worksheets(lnCnt).Activate &&&&& 设置为“活动的工作表”或“当前工作表”
oel.ActiveSheet.Cells.Select &&&&& 选定整张工作表
oel.Selection.NumberFormatLocal = "@" &&&&& 将整张工作表的单元格格式设置为“文本”,以改名身份证号成为科学记数状
oel.ActiveSheet.Range("A1").Select &&&&&
FOR gncount=1 to FCOUNT() &&&&& 按DBF表的字段数循环
oel.workbooks(1).worksheets(lnCnt).cells(lnRow,gncount).value=FIELD(gncount) &&& 此循环在第一行写入字段名
NEXT
ENDIF
lnRow=lnRow+1 &&&从第二行开始写入分班的内容,用于控制EXCEL中的行
FOR gncount=1 to FCOUNT() &&&&& 此“FOR……NEXT”循环只完成将DBF表中一条记录转入到EXCEL中的一行
oel.workbooks(1).worksheets(lnCnt).cells(lnRow,gncount).value=EVALUATE(FIELD(gncount)) &&& 此循环完成下面注释掉的四句的功能,这样实现了动态
NEXT
*!* oel.workbooks(1).worksheets(lnCnt).cells(lnRow,1).value=班级
*!* oel.workbooks(1).worksheets(lnCnt).cells(lnRow,2).value=学号
*!* oel.workbooks(1).worksheets(lnCnt).cells(lnRow,3).value=姓名
*!* oel.workbooks(1).worksheets(lnCnt).cells(lnRow,4).value=性别
ENDSCAN
oel.workbooks(1).SaveAs("tmp.xls") &&&工作簿另为
*oel.workbooks(1).saved=.t. &&& 放弃存盘
oel.workbooks(1).close &&& 关闭工作簿
oel.QUIT &&& 退出Excel
MESSAGEBOX('已按班级生成在不同的工作表上了!',64,'生成提示:')