PB操作Excel详解.docx
《PB操作Excel详解.docx》由会员分享,可在线阅读,更多相关《PB操作Excel详解.docx(32页珍藏版)》请在冰豆网上搜索。
PB操作Excel详解
run("notpad.exe")////pb运行记事本
run("calc.exe")////pb运行计算器
记住:
当我们用PB导出数据到EXCEL时,不管是用Saveas还是clipboard它输出的数据是定义了字段类型的列的数据,也就是说,不管列是可见还是不可见,只要该列定义了列
属性,在查询时主缓冲区中该列有数据,则就会导出出来~
用方法得到列名或其他属性也是一样的~及时隐藏了也可以得到
当中间的某列给隐藏时,下次打开后它会显示在末尾的位置,但是用Saveas输出数据时,不管它是否隐藏,是否改变了位置,它仍可输出数据而且位置还是不变的~
也就是说没有改变数据窗口对象的源,数据窗口对象上显示的列位置只会影响我们在程序界面上看到的位置,而不会影响它在后台存储的实际位置。
但是这样会改变界面显示的位置,记住,没有改变源
如何用PB程序在excel画表格边框线,如何改变文字大小
1.创建Excel对象
eole=CREATEOBJECT′(
2.添加新工作簿eole.Workbooks.add
Excel.application′)
3.设置第3个工作表为激活工作表eole.Worksheets(″sheet3″).Activate4.打开指定工作簿
eole.Workbooks.Open(″c:
\temp\ll.xls″)5.显示Excel窗口
eole.visible=.t.
6.更改Excel标题栏
eole.Caption=″VFP应用程序调用MicrosoftExcel″
7.给单元格赋值
eole.cells(1,4).value=XM(XM为数据库字段名)8.设置指定列的宽度(单位:
字符个数)eole.ActiveSheet.Columns
(1).ColumnWidth=59.设置指定行的高度(单位:
磅)eole.ActiveSheet.Rows
(1).RowHeight=1/0.035
(设定行高为1厘米,1磅=0.035厘米)10.在第18行之前插入分页符
eole.Worksheets(″Sheet1″).Rows(18).PageBreak=111.在第4列之前删除分页符eole.ActiveSheet.Columns(4).PageBreak=0
12.指定边框线宽度(Borders参数如下)ole.ActiveSheet.Range(″b3:
d3″).Borders
(2).Weight=313.设置四个边框线条的类型
eole.ActiveSheet.Range(″b3:
d3″).Borders
(2).LineStyle=1
(其中Borders参数:
1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:
1与7-细实、2-细虚、4-点虚、9-双细实线)
14.设置页眉
eole.ActiveSheet.PageSetup.CenterHeader=″报表1″
15.
设置页脚
eole.ActiveSheet.PageSetup.CenterFooter=″第&P页″16.设置页眉到顶端边距为2厘米eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.设置页脚到底边距为3厘米eole.ActiveSheet.PageSetup.FooterMargin=3/0.03518.设置顶边距为2厘米eole.ActiveSheet.PageSetup.TopMargin=2/0.03519.设置底边距为4厘米
eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.设置左边距为2厘米veole.ActiveSheet.PageSetup.LeftMargin=2/0.03521.设置右边距为2厘米eole.ActiveSheet.PageSetup.RightMargin=2/0.03522.设置页面水平居中eole.ActiveSheet.PageSetup.CenterHorizontally=.t.23.设置页面垂直居中eole.ActiveSheet.PageSetup.CenterVertically=.t.
24.设置页面纸张大小(1-窄行851139-宽行1411)eole.ActiveSheet.PageSetup.PaperSize=1
25.打印单元格网线eole.ActiveSheet.PageSetup.PrintGridlines=.t.26.拷贝整个工作表eole.ActiveSheet.UsedRange.Copy
27.拷贝指定区域
eole.ActiveSheet.Range(″A1:
E2″).Copy28.粘贴
eole.WorkSheet(″Sheet2″).Range(″A1″).PasteSpecial
29.在第2行之前插入一行eole.ActiveSheet.Rows
(2).Insert30.在第2列之前插入一列
eole.ActiveSheet.Columns
(2).Insert31.设置字体
eole.ActiveSheet.Cells(2,1).Font.Name=″黑体″
32.设置字体大小eole.ActiveSheet.Cells(1,1).Font.Size=2533.设置字体为斜体eole.ActiveSheet.Cells(1,1).Font.Italic=.t.34.设置整列字体为粗体eole.ActiveSheet.Columns
(1).Font.Bold=.t.35.清除单元格公式eole.ActiveSheet.Cells(1,4).ClearContents36.打印预览工作表eole.ActiveSheet.PrintPreview
2/16
37.打印输出工作表eole.ActiveSheet.PrintOut38.工作表另为
eole.ActiveWorkbook.SaveAs(″c:
\temp\22.xls″)39.放弃存盘
eole.ActiveWorkbook.saved=.t.40.关闭工作簿eole.Workbooks.close
41.退出Exceleole.quit
先把标题放到剪贴板上,再PASTE()到EXCEL中,代码如下:
:
:
clipboard(ls_value)ao_object.range(ls_col+string
(1)+":
"+ls_col+string
(1)).select()ao_object.activesheet.Paste()
/*************************************************************
下面的函数f_excel_hb,可以实现“将工作簿filename_s中的工作表sheetname_s以新的工作表名称sheetname_t,复制到工作簿
filename_t的最后”
28.
endif
29.//打开源和目标工作簿
30.ole_object_s.workbooks.open(filename_s)
31.ole_object_s.workbooks.open(filename_t)
32.stringls_t
33.ls_t=filename_t
34.filename_s=of_splitpath(filename_s,2)
35.filename_t=of_splitpath(filename_t,2)
36.//隐藏excel
37.ole_object_s.visible=false
38.ole_object_s.displayalerts=false
39.intn,t
40.intli
41.booleanisexists=false
42.oleobjectlworksheet
43.//判断源工作簿中的工作表是否存在
44.try
45.lworksheet=ole_object_s.Workbooks(filename_s).sheets(sheetname_s)
46.isexists=true
47.catch(oleruntimeerrorer)
48.isexists=false
49.endtry
50.ifisexists=falsethen
51.messagebox('','工作簿【'+filename_s+'】中工作表不存在工作表['+sheetname_s+']')
52.gotoerror
53.endif
54.//当目标工作簿中存在sheet名为sheetname_t的工作表时,为sheetname_t增加后缀
(1),然后再重复进行判断,直到表名不存在
55.isexists=true
56.dowhileisexists
57.try
58.lworksheet=ole_object_s.Workbooks(filename_t).sheets(sheetname_t)
59.isexists=true
60.sheetname_t+='
(1)'
61.catch(oleruntimeerrorer1)
62.isexists=false
63.endtry
64.loop
65.//进行工作表合并(移到目标工作簿的最后)
66.//intli
67.setnull(li)
68.ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(li,ole_object_s.workbooks(filename_t).Sheets(long(ole_object_s.workbooks(filename_t).Sheets.count)))
69.//重命名工作表
70.ole_object_s.workbooks(filename_t).sheets(long(ole_object_s.workbooks(filename_t).Sheets.count)).name=sheetname_t
71.
//保存目标工作簿
72.
isexists=true
73.
//ole_object_s.visible=true
74.
//ole_object_s.displayalerts=true
75.
//messagebox('','')
76.
try
77.
ole_object_s.workbooks(filename_t).save()
78.
catch(oleruntimeerrorer2)
79.
messagebox('提示','无法保存工作簿【'
+filename_t+
'】')
80.
isexists=false
81.
endtry
82.
ifnotisexiststhengotoerror
83.
//关闭工作簿
84.
ole_object_s.workbooks(filename_s).close
85.
ole_object_s.workbooks(filename_t).close
86.
//退出excel
87.
ole_object_s.workbooks.close
88.
ole_object_s.Application.quit();
89.
//断开连接
90.
ole_object_s.disconnectobject();
91.
//注销ole对象
92.
destroyole_object_s;
93.
returntrue
94.
error:
95.
ole_object_s.workbooks(filename_s).close
96.
ole_object_s.workbooks(filename_t).close
97.
ole_object_s.workbooks.close
98.
ole_object_s.Application.quit();
99.
ole_object_s.disconnectobject();
100.
destroyole_object_s;
101.
returnfalse
102.
103.
104.
endfunction
/**********************************************************/
/*函数名称:
uf_dwsaveas_excel
功能:
将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。
参数:
datawindowdatawin,为用户要导出数据窗口的数据窗口控件名
返回值:
integer1,success;-1,error
流程描述:
(原程序)先用saveas()倒出为excel文件,再替换表头为中文名
(新程序)直接用saveasAscii()倒出为excel文件
原因:
为提高程序的可读性作了少量的修改(如:
增加注释、改变排版风
格等)
*/
/**********************************************************/
/***************以下程序将导出为EXCEL文档******************/integerli_rtn,ii,li_asc
stringls_name,ls_pathnamebooleanlb_exist
ifdatawin.RowCount()<1then
MessageBox("提示信息","请先检索数据再导出至Excel!
")return-1//error
endif
li_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件
(*.xls),*.xls")
ifli_rtn=1then
lb_exist=FileExists(ls_pathname)
IFlb_existTHEN
li_rtn=MessageBox("保存",ls_pathname+"已经存在,是否覆盖?
",Exclamation!
YesNo!
)
endif
ifli_rtn=1then
//当文件存在用户选择覆盖,或是文件本就不存在时。
注意变量li_rtnli_rtn=datawin.SaveAsAscii(ls_pathname)
ifli_rtn=1then
MessageBox("提示信息","导出数据成功!
")return1
else
MessageBox("错误信息","导出数据失败!
")return-1//error
endifelse
return-1//errorendif
elsereturn-1
endif
//在程序中调式没有问题,可以把数据窗口原样的输出,包括中英文,如果你用这个函数导出来的
也是乱码的话,可能是你的操作系统有问题了
函数SaveAsAscii()用法:
()函数。
它允许输出数据窗口的可视部分为文本格式,组、交叉报表、计算域等被保存为输出数据的一部分。
在很多的情况下,我们需要将书局窗口中的数据保存为其他应用程序的格式(比如:
MSExcel,Word,email等).为此Powerbuilder提供了SaveAs函数,然而使SaveAs保存数据窗口为Execl格式时有一些缺点,就是它无法保存我们所见到的格式,一些图形、交叉报表、计算
域等等都被丢弃,它仅仅保存了数据窗口buffer中的数据。
为了输出交叉报表、组、和计算
域等等可视的数据,PowerBuilder6.5(afterbuild444)提供了新的函数解决这些缺陷,它是:
SaveAsAscii()函数。
它允许输出数据窗口的可视部分为文本格式,组、交叉报表、计算域等被保存为输出数据的一部分。
下面讨论该函数:
描述:
将数据窗口或数据存储中的内容保存为ASCII文本文件适用于:
数据窗口和DataStore对象
符号:
dwcontrol.SaveAsAscii(filename{,separatorcharacter{,quotecharacter{,lineending}}})
其中:
dwcontrol位数据窗口或DataStore的名字
filename:
要保存的文件名;
separatorcharacter(optional):
分割各个数据的字符串,缺省为tabquotecharacter(optional):
包围值的字符串,缺省为空;
lineending(optional):
放在每行末尾的字符串,缺省为回车character(~r~n)
下面的例子显示将数据窗口中的数据保存到文件monthly.txt,每个数据以'|'分割
dw_4.saveasascii("monthly.txt","|")
在数据之间使用分割符是比较好的注意,因为缺省的tab字符可能会在导入excel时出问题。
在导入Excel时他会提示您,您数据中使用何种分割符。
为了导入到Excel,只需在中Excel打开文件,您可能会看到一个wizard窗口定义正确的分割符即可。
下例显示一个用saveasascii()函数导出的文件,使用SaveAs函数时是不可能有如此结果的。
PB的dw导出到excel文件(使用saveasascii)
PB编程收集2007-07-1711:
01:
29阅读264评论0字号:
大中小订阅
PB的dw导出到excel文件(使用saveasascii)
/**********************************************************/
/*函数名称:
uf_dwsaveas_excel
功能:
将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。
参数:
datawindowdatawin,为用户要导出数据窗口的数据窗口控件名
返回值:
integer1,success;-1,error
流程描述:
先用saveasAscii()倒出为excel文件,再替换表头为中文名设计人:
yanhui2003年11月
修改人:
叶文林2004.4.8
原因:
为提高程序的可读性作了少量的修改(如:
增加注释、改变排版风格
等)*/
/**********************************************************/
/***************以下程序将导出为EXCEL文档******************/integerli_rtn,ii,li_asc
stringls_name,ls_pathnamebooleanlb_exist
ifdatawin.RowCount()<1then
MessageBox("提示信息","请先检索数据再导出至Excel!
")return-1//error
endif
li_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件
(*.xls),*.xls")
ifli_rtn=1then
lb_exist=FileExists(ls_pathname)
IFlb_existTHEN
li_rtn=MessageBox("保存",ls_pathname+"已经存在,是否覆盖?
",Exclamation!
YesNo!
)endif
ifli_rtn=1then
//当文件存在用户选择覆盖,或是文件本就不存在时。
注意变量li_rtnli_rtn=datawin.SaveAsAscii(ls_pathname)
ifli_rtn=1then
//MessageBox("提示信息","导出数据成功!
")else
MessageBox("错误信息","导出数据失败!
")return-1//error
endif
else
return-1//errorendif
elsereturn-1endif
/**********以下程序将导出的EXCEL英文标题替换为汉字*********/longnumcols,numrows,c,r
OLEObjectxlapp,xlsubintret
numcols=long(datawin.Object.DataWindow.Column.Count)
numrows=datawin.RowCount()
//产生oleobject的实例
xlApp=CreateOLEObject
//连接ole对象
ret=xlApp.ConnectToNewObject("Excel.Sheet")ifret<0then
MessageBox("连接失败!
","连接到EXCEL失败,请确认您的系统是否已经安装EXCEL!
~r~n"&
+"错误代码:
"+string(ret))return-1
endif
//打开EXCEL文件xlApp.Application.Workbooks.Open(ls_pathname)
////使文件可见
//xlApp.Application.Visible=true
//得到活动工作表的引用,改善程序性能
xlsub=xlapp.Application.ActiveWorkbook.Worksheets[1]stringls_colname,ls_text,ls_mo