PB操作Excel详解_第1页
PB操作Excel详解_第2页
PB操作Excel详解_第3页
PB操作Excel详解_第4页
PB操作Excel详解_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、run("notpad.exe") /pb 运行记事本run("calc.exe") /pb运行计算器记住:当我们用PB导出数据到EXCEL时,不管是用Saveas 还是clipboard 它输出的数据是定义了字段类型的列的数据,也就是说,不管列是可见还是不可见,只要该列定义了列属性,在查询时主缓冲区中该列有数据,则就会导出出来用方法得到列名或其他属性也是一样的及时隐藏了也可以得到当中间的某列给隐藏时,下次打开后它会显示在末尾的位置,但是用Saveas输出数据时,不管它是否隐藏,是否改变了位置,它仍可输出数据而且位置还是不变的也就是说没有改变数据窗口对象

2、的源,数据窗口对象上显示的列位置只会影响我们在程序界面上看到的位置,而不会影响它在后台存储的实际位置。但是这样会改变界面显示的位置,记住,没有改变源如何用PB程序在excel画表格边框线,如何改变文字大小 1创建Excel对象 eole=CREATEOBJECT(Excel.application) 2添加新工作簿 eole.Workbooks.add 3设置第3个工作表为激活工作表 eole.Worksheets(sheet3).Activate 4打开指定工作簿 eole.Workbooks.Open(c:templl.xls) 5显示Excel窗口 eole.visible=.t. 6更

3、改Excel标题栏 eole.Caption=VFP应用程序调用Microsoft Excel 7给单元格赋值 eole.cells(1,4).value=XM(XM为数据库字段名) 8设置指定列的宽度(单位:字符个数) eole.ActiveSheet.Columns(1).ColumnWidth=5 9设置指定行的高度(单位:磅) eole.ActiveSheet.Rows(1).RowHeight=1/0.035 (设定行高为1厘米,1磅=0.035厘米) 10在第18行之前插入分页符 eole.Worksheets(Sheet1).Rows(18).PageBreak=1 11在第4列

4、之前删除分页符 eole.ActiveSheet.Columns(4).PageBreak=0 12指定边框线宽度(Borders参数如下) ole.ActiveSheet.Range(b3:d3).Borders(2).Weight=3 13设置四个边框线条的类型 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=报表

5、1 15设置页脚 eole.ActiveSheet.PageSetup.CenterFooter=第P页 16设置页眉到顶端边距为2厘米 eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035 17设置页脚到底边距为3厘米 eole.ActiveSheet.PageSetup.FooterMargin=3/0.035 18设置顶边距为2厘米 eole.ActiveSheet.PageSetup.TopMargin=2/0.035 19设置底边距为4厘米 eole.ActiveSheet.PageSetup.BottomMargin=4/0.035 20设

6、置左边距为2厘米 veole.ActiveSheet.PageSetup.LeftMargin=2/0.035 21设置右边距为2厘米 eole.ActiveSheet.PageSetup.RightMargin=2/0.035 22设置页面水平居中 eole.ActiveSheet.PageSetup.CenterHorizontally=.t. 23设置页面垂直居中 eole.ActiveSheet.PageSetup.CenterVertically=.t. 24设置页面纸张大小(1窄行8511 39宽行1411) eole.ActiveSheet.PageSetup.PaperSize

7、=1 25打印单元格网线 eole.ActiveSheet.PageSetup.PrintGridlines=.t. 26拷贝整个工作表 eole.ActiveSheet.UsedRange.Copy 27拷贝指定区域 eole.ActiveSheet.Range(A1:E2).Copy 28粘贴 eole.WorkSheet(Sheet2).Range(A1).PasteSpecial 29在第2行之前插入一行 eole.ActiveSheet.Rows(2).Insert 30在第2列之前插入一列 eole.ActiveSheet.Columns(2).Insert 31设置字体 eole

8、.ActiveSheet.Cells(2,1).Font.Name=黑体 32设置字体大小 eole.ActiveSheet.Cells(1,1).Font.Size=25 33设置字体为斜体 eole.ActiveSheet.Cells(1,1).Font.Italic=.t. 34设置整列字体为粗体 eole.ActiveSheet.Columns(1).Font.Bold=.t. 35清除单元格公式 eole.ActiveSheet.Cells(1,4).ClearContents 36打印预览工作表 eole.ActiveSheet.PrintPreview 37打印输出工作表 eol

9、e.ActiveSheet.PrintOut 38工作表另为 eole.ActiveWorkbook.SaveAs(c:temp22.xls) 39放弃存盘 eole.ActiveWorkbook.saved=.t. 40关闭工作簿 eole.Workbooks.close 41退出Excel eole.quit 先把标题放到剪贴板上,再PASTE()到EXCEL中,代码如下: :clipboard(ls_value) ao_object.range(ls_col+string(1)+":"+ls_col+string(1).select() ao_object.activ

10、esheet.Paste() /*下面的函数f_excel_hb,可以实现“将工作簿filename_s中的工作表sheetname_s以新的工作表名称sheetname_t,复制到工作簿filename_t的最后”1. public function boolean f_excel_hb (string filename_s, string filename_t, string sheetname_s, string sheetname_t);  2. /=

11、60; 3. /  合并两个工作簿中的某个工作表   4. /=  5. /  作者:yyoinge 2011-10-12 18:00  6. /=  7. /  将工作簿filename_s中的工作表sheetname_s以新的  8. /  工作表名称sheetname_t,复制到工作簿filename_t的最后  9. /=  10

12、. if not fileexists(filename_s) then  11.     messagebox('','工作簿【' + filename_s + '】(源)不存在')  12.     return false  13. end if  14. if not fi

13、leexists(filename_t) then  15.     messagebox('','工作簿【' + filename_t + '】(目标)不存在')  16.     return false  17. end if  18. long ll_val  19. /声明ole对

14、象  20. oleobject ole_object_s  21. /创建ole对象  22. ole_object_s=create oleobject  23. /连接到excel  24. ll_val = ole_object_s.connecttonewobject("excel.application")  25. if ll_val <> 0 the

15、n  26.     messagebox('','ole无法连接Excel!')  27.     goto error  28. end if  29. /打开源和目标工作簿  30. ole_object_s.workbooks.open(filename_s)  31. ole_object_s.workbooks.open(filena

16、me_t)  32. string ls_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

17、  38. ole_object_s.displayalerts = false  39. int n,t  40. int li  41. boolean isexists=false  42. oleobject lworksheet  43. /判断源工作簿中的工作表是否存在  44. try     45.   

18、0; lworksheet =  ole_object_s.Workbooks(filename_s).sheets(sheetname_s)  46.     isexists = true  47. catch( oleruntimeerror   er)   48.     isexists = false &#

19、160;49. end try   50. if isexists=false then  51.     messagebox('','工作簿【' + filename_s + '】中工作表不存在工作表' + sheetname_s + '')  52.     goto&

20、#160;error  53. end if  54. /当目标工作簿中存在sheet名为sheetname_t的工作表时,为sheetname_t增加后缀(1),然后再重复进行判断,直到表名不存在  55. isexists = true  56. do while isexists  57.     try     58.   

21、60;     lworksheet =  ole_object_s.Workbooks(filename_t).sheets(sheetname_t)  59.         isexists = true  60.         sheetname_t += '(

22、1)'  61.     catch( oleruntimeerror   er1)   62.         isexists = false  63.     end try   64. loop  65. /进行工作表合并(移到目标工

23、作簿的最后)  66. /int li  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.workboo

24、ks(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. /

25、messagebox('', '')  76. try  77.     ole_object_s.workbooks(filename_t).save()  78. catch( oleruntimeerror   er2)  79.     messagebox('提示', '无法保存工作簿【' +&

26、#160;filename_t + '】')  80.     isexists = false  81. end try  82. if not isexists then goto error  83. /关闭工作簿  84. ole_object_s.workbooks(filename_s).close  85.

27、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. destroy ole_object_s; 

28、60;93. return true  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();

29、60; 100. destroy ole_object_s;  101. return false  102.   103.   104. end function   /*/ /*函数名称:uf_dwsaveas_excel 功能:将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。 参数:datawindow datawin,为用户要导出数据窗口的数据窗口控件名 返回值:integer 1,success;-1,error 流程

30、描述:(原程序)先用saveas()倒出为excel文件,再替换表头为中文名 (新程序)直接用saveasAscii()倒出为excel文件 原因:为提高程序的可读性作了少量的修改(如:增加注释、改变排版风格等) */ /*/ /*以下程序将导出为EXCEL文档*/ integer li_rtn,ii,li_asc string ls_name,ls_pathname boolean lb_exist if datawin.RowCount()<1 then MessageBox("提示信息","请先检索数据再导出至Excel!") return

31、-1/error end if li_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件(*.xls),*.xls") if li_rtn=1 then lb_exist = FileExists(ls_pathname) IF lb_exist THEN li_rtn = MessageBox("保存", ls_pathname+"已经存在,是否覆盖?",Exclamation!, YesNo!) end if if li

32、_rtn=1 then /当文件存在用户选择覆盖,或是文件本就不存在时。注意变量li_rtn li_rtn=datawin.SaveAsAscii(ls_pathname) if li_rtn=1 then MessageBox("提示信息","导出数据成功!") return 1 else MessageBox("错误信息","导出数据失败!") return -1/error end if else return -1/error end if else return -1 end if /在程序中调式没有问题

33、,可以把数据窗口原样的输出,包括中英文,如果你用这个函数导出来的 也是乱码的话,可能是你的操作系统有问题了函数SaveAsAscii()用法:()函数。它允许输出数据窗口的可视部分为文本格式,组、交叉报表、计算域等被保存为输出数据的一部分。在很多的情况下,我们需要将书局窗口中的数据保存为其他应用程序的格式(比如: MS Excel, Word, email 等).为此Powerbuilder提供了SaveAs函数,然而使SaveAs保存数据窗口为Execl格式时有一些缺点,就是它无法保存我们所见到的格式,一些图形、交叉报表、计算域等等都被丢弃,它仅仅保存了数据窗口buffer中的数据。为了输出

34、交叉报表、组、和计算域等等可视的数据, PowerBuilder 6.5 (after build 444) 提供了新的函数解决这些缺陷,它是:SaveAsAscii()函数。它允许输出数据窗口的可视部分为文本格式,组、交叉报表、计算域等被保存为输出数据的一部分。下面讨论该函数: 描述:将数据窗口或数据存储中的内容保存为ASCII文本文件适用于:数据窗口和 DataStore对象符号:dwcontrol.SaveAsAscii ( filename , separatorcharacter , quotecharacter , lineending )其中:dwcontrol 位数据窗口或Da

35、taStore的名字filename :要保存的文件名;separatorcharacter (optional) :分割各个数据的字符串,缺省为tabquotecharacter (optional) :包围值的字符串,缺省为空;lineending (optional) :放在每行末尾的字符串,缺省为回车 character (rn)下面的例子显示将数据窗口中的数据保存到文件monthly.txt,每个数据以'|' 分割dw_4.saveasascii("monthly.txt","|")在数据之间使用分割符是比较好的注意,因为缺省的

36、tab字符可能会在导入excel时出问题。在导入Excel时他会提示您,您数据中使用何种分割符。为了导入到 Excel, 只需在中Excel打开文件,您可能会看到一个wizard窗口 定义正确的分割符即可。下例显示一个用saveasascii()函数导出的文件,使用SaveAs函数时是不可能有如此结果的。PB的dw导出到excel文件(使用saveasascii)PB编程收集 2007-07-17 11:01:29 阅读264 评论0   字号:大中小 订阅 PB的dw导出到excel文件(使用saveasascii) /*/*函数名称:uf_dwsaveas_e

37、xcel功能:将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。参数:datawindow datawin,为用户要导出数据窗口的数据窗口控件名返回值:integer 1,success;-1,error流程描述:先用saveasAscii()倒出为excel文件,再替换表头为中文名设计人:yanhui2003年11月修改人:叶文林 2004.4.8        原因:为提高程序的可读性作了少量的修改(如:增加注释、改变排版风格等)*/*/*以下程序将导出为EXCEL文档*/integer li_

38、rtn,ii,li_ascstring ls_name,ls_pathnameboolean lb_existif datawin.RowCount()<1 thenMessageBox("提示信息","请先检索数据再导出至Excel!")return -1/errorend ifli_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件(*.xls),*.xls")if li_rtn=1 thenlb_exist =

39、FileExists(ls_pathname)IF lb_exist THEN li_rtn = MessageBox("保存", ls_pathname+"已经存在,是否覆盖?",Exclamation!, YesNo!)end ifif li_rtn=1 then/当文件存在用户选择覆盖,或是文件本就不存在时。注意变量li_rtnli_rtn=datawin.SaveAsAscii(ls_pathname)if li_rtn=1 then/MessageBox("提示信息","导出数据成功!")elseMess

40、ageBox("错误信息","导出数据失败!")return -1/errorend ifelsereturn -1/errorend ifelsereturn -1end if/*以下程序将导出的EXCEL英文标题替换为汉字*/long numcols , numrows , c, rOLEObject xlapp , xlsubint retnumcols = long(datawin.Object.DataWindow.Column.Count)numrows = datawin.RowCount()/ 产生oleobject的实例xlApp =

41、Create OLEObject/连接ole对象ret = xlApp.ConnectToNewObject( "Excel.Sheet" )if ret < 0  thenMessageBox("连接失败!","连接到EXCEL失败,请确认您的系统是否已经安装EXCEL!rn"&+"错误代码:"+string(ret)    return -1end if/ 打开EXCEL文件xlApp.Application.Workbooks.Open(ls_pathna

42、me) /使文件可见/xlApp.Application.Visible = true/ 得到活动工作表的引用,改善程序性能xlsub = xlapp.Application.ActiveWorkbook.Worksheets1string ls_colname,ls_text,ls_modistr,ls_col/取字段名更改为对应的文本text值FOR c=1 to numcolsls_col="#"+string(c)+".name"ls_colname=datawin.describe(ls_col)ls_modistr=ls_colname+&q

43、uot;_t.text"ls_text=datawin.describe(ls_modistr)xlsub.cells1,c=ls_textNEXTxlApp.DisConnectObject()Destroy xlappMessageBox("提示信息","导出数据成功!")return 1/successPB的datawindow导出到excel文件 /*函数名称:uf_dwsaveas_excel功能:将数据窗口数据导出EXCEL文件,并将EXCEL文件默认英文标题替换成中文。参数:datawindow datawin,为用户要导出数据窗

44、口的数据窗口控件名返回值:integer 1,success;-1,error流程描述:先用saveasAscii()倒出为excel文件,再替换表头为中文名   原因:为提高程序的可读性作了少量的修改(如:增加注释、改变排版风格等)*/*/ /*以下程序将导出为EXCEL文档*/integer li_rtn,ii,li_ascstring ls_name,ls_pathnameboolean lb_existif datawin.RowCount()<1 thenMessageBox("提示信息","请先检索数据再导出至Excel!&q

45、uot;)return -1/errorend ifli_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件(*.xls),*.xls")if li_rtn=1 thenlb_exist = FileExists(ls_pathname)IF lb_exist THEN li_rtn = MessageBox("保存", ls_pathname+"已经存在,是否覆盖?",Exclamation!, YesNo!)end if

46、if li_rtn=1 then/当文件存在用户选择覆盖,或是文件本就不存在时。注意变量li_rtnli_rtn=datawin.SaveAsAscii(ls_pathname)if li_rtn=1 then/MessageBox("提示信息","导出数据成功!")elseMessageBox("错误信息","导出数据失败!")return -1/errorend ifelsereturn -1/errorend ifelsereturn -1end if/*以下程序将导出的EXCEL英文标题替换为汉字*/lon

47、g numcols , c, rOLEObject xlapp , xlsubint retnumcols = long(datawin.Object.DataWindow.Column.Count)/ 产生oleobject的实例xlApp = Create OLEObject/连接ole对象ret = xlApp.ConnectToNewObject( "Excel.Sheet" )if ret < 0 thenMessageBox("连接失败!","连接到EXCEL失败,请确认您的系统是否已经安装EXCEL!rn"&

48、;+"错误代码:"+string(ret)    return -1end if/ 打开EXCEL文件xlApp.Application.Workbooks.Open(ls_pathname) /使文件可见/xlApp.Application.Visible = true/ 得到活动工作表的引用,改善程序性能xlsub = xlapp.Application.ActiveWorkbook.Worksheets1string ls_colname,ls_text,ls_modistr,ls_col/取字段名更改为对应的文本text值FOR c=1

49、 to numcolsls_col="#"+string(c)+".name"ls_colname=datawin.describe(ls_col)ls_modistr=ls_colname+"_t.text"ls_text=datawin.describe(ls_modistr)xlsub.cells1,c=ls_textNEXTxlApp.DisConnectObject()Destroy xlappMessageBox("提示信息","导出数据成功!")return 1/successPB

50、的datawindow导出到excel文件(支持计算列和显示格式,中国龙) seeyou 发表于 2005-8-30 10:40:00 /=/ PUBLIC Function uf_data2excel 在 u_data2word inherited from nonvisualobject/-/ 说明:将数据倒入excel中,支持计算列及显示格式,要求在题头的计算列要写tag值/-/参数1:value datawindow   adw/说明:数据窗口/-/ 返回:(INTEGER) 成功返回1,不成功返回0/-/ 作者:cwl日期: 2002.03.18/=/变更日志:0

51、20515加入对交叉表倒出的支持(主要是修改了保存题头部分)constant integer ppLayoutBlank = 12OLEObject ole_objectole_object = CREATE OLEObjectinteger li_ret,li_crosstab=0long ll_colnum,ll_rownumstring ls_valuestring ls_objects,ls_obj,ls_objs,ls_objtaglong ll_pos,ll_len,ll_num = 0/题头区long ll_headnumstring ls_head,ls_headtag/合计区

52、long ll_sumnum,i=1,startpos=1,endpos,li_posstring ls_sum,ls_sumtag,ls_bind,token,list,ls_temp,ls_crosstabcoln_cst_string lu_string /PFC string处理对象li_ret = ole_object.ConnectToObject("","Excel.Application")IF li_ret <> 0 THEN/如果Excel还没有打开,则新建。li_ret = ole_object.ConnectToNew

53、Object("Excel.Application")if li_ret <> 0 thenMessageBox('OLE错误','OLE无法连接!错误号:' + string(li_ret)return 0end ifole_object.Visible = false/不可见END IFif adw.Object.DataWindow.Processing='4' then /交叉表处理adw.Object.DataWindow.Crosstab.StaticMode='true'/将数据静态化

54、li_crosstab=1end ifpointer oldpointeroldpointer = SetPointer(HourGlass!)/新增一个工作区ole_object.Workbooks.Addls_objects = trim(adw.Describe('datawindow.Objects')list=ls_objectsEndPos= pos(list, 't', StartPos)/得到对象列表Do while ( EndPos > 0 )tokeni = Mid(list, StartPos, EndPos - StartPos)i

55、 +StartPos = EndPos + 1 EndPos= pos(list, 't', StartPos)LOOPtokeni = Mid(list, StartPos)ll_rownum=UpperBound(token)for i=1 to ll_rownumls_obj = tokeniif ls_obj='title' then messagebox('',adw.Describe(ls_obj + '.type')if lower(adw.Describe(ls_obj + '.type') = &

56、#39;column' or &lower(adw.Describe(ls_obj + '.type') = 'compute' thenls_bind=lower(adw.Describe(ls_obj + '.band')if ls_bind = 'detail' then ll_num += 1ls_objsll_num = ls_objif li_crosstab=0 then /一般处理ls_objtagll_num = adw.Describe(ls_obj + '_t.text')el

57、seif li_crosstab=1 then /交叉表处理li_pos=lu_string.of_lastpos(ls_obj,'_',len(ls_obj)/找出最后一次出现'_'的位置if li_pos=0 or (not isnumber(mid(ls_obj,li_pos+1) then /不是交叉列ls_objtagll_num = adw.Describe(ls_obj + '_t.text')elsels_temp=mid(ls_obj,li_pos)ls_crosstabcol=mid(ls_obj,1,li_pos - 1)/

58、取出交叉列名/messagebox('',ls_crosstabcol+','+ls_temp)ls_objtagll_num=adw.Describe( ls_crosstabcol + "_t"+ls_temp+".Text" )/取出交叉表的题头end if end if elseif (ls_bind = 'summary') then ll_sumnum += 1ls_sumll_sumnum = ls_objls_sumtagll_sumnum = adw.Describe(ls_obj + &

59、#39;.tag')elsell_headnum += 1ls_headll_headnum = ls_objls_headtagll_headnum = adw.Describe(ls_obj + '.tag')end ifend ifnext/得到数据窗口数据的列数与行数(行数应该是数据行数 + 2)ll_colnum = ll_numll_rownum = adw.rowcount() + 2string column_namestring ls_colnameinteger j,k/写题头for i=1 to ll_headnumls_value = ls_headtagiif ls_value<>'?' then ole_object.cells(1,(i - 1)*2+1).value = ls_valueend if column_name = ls_headils_value=this.uf_getdata(adw,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论