tempad
Readygo技术搜索引擎 >>防火墙 >> 导出excel的问题

导出excel的问题

Readygo技术搜索引擎 网络搜索 efish 2008-1-17 18:20:26

导出excel的问题

楼主breadjyh(新小鱼)2004-01-18 10:08:31 在 PowerBuilder / DataWindow 提问

直接利用datawindow.saveas()的方法导出excel同用ole的方法导出excel速度差距很大,能否说说saveas()是用的什么方法? 问题点数:0、回复次数:9Top

1 楼linleming(落日)回复于 2004-01-18 10:18:42 得分 0

upTop

2 楼ld2099(我是谁?)回复于 2004-01-18 10:24:36 得分 0

PowerBulider数据窗口转MicroSoft   Execl、Word程序源代码      
  一、f_cncharnum函数   f_cncharnum.srf  
  $PBExportHeader$f_cncharnum.srf  
  $PBExportComments$得到字符串中汉字或者双字节的个数  
  global   type   f_cncharnum   from   function_object  
  end   type  
   
  forward   prototypes  
  global   function   integer   f_cncharnum   (string   aString)  
  end   prototypes  
   
  global   function   integer   f_cncharnum   (string   aString);  
  //函数名:   f_cncharnum  
  //用途:   返回一个字符串中汉字的个数  
  //输入:   aString   -   string,   给定的字符串  
  //返回值:   li_num   -   Integer,   给定的字符串中汉字的个数  
  //注意:   1.   此方法基于汉字的国标汉字库区位编码的有效性,不符合此编码的系统此函数无效!  
  //   2.   若汉字串含有非汉字字符,如图形符号或ASCII码,则这些非汉字字符将保持不变.  
  //例如:   li_ret   =   f_cncharnum("摆渡人ferryman")   li_ret   =   3  
   
  string   ls_ch   //临时单元  
  string   ls_SecondSecTable   //存放所有国标二级汉字读音  
  integer   li_num   =   0   //返回值  
  integer   i,j  
   
  For   i   =   1   to   Len(aString)  
  ls_ch   =   Mid(aString,i,1)  
  If   Asc(ls_ch)   >=   128   then   //是汉字  
  li_num++  
  i   =   i+1  
  End   if  
  Next  
   
  Return   li_num  
   
  end   function  
   
   
  二、PBToExcel函数f_outputtoexcel_new.srf  
   
  $PBExportHeader$f_outputtoexcel_new.srf  
  global   type   f_outputtoexcel_new   from   function_object  
  end   type  
   
  forward   prototypes  
  global   function   integer   f_outputtoexcel_new   (datawindow   adw)  
  end   prototypes  
   
  global   function   integer   f_outputtoexcel_new   (datawindow   adw);  
  //函数名:f_outputtoexcel_new  
  //输入:   adw   -   datawindow,指定的数据窗口  
  //返回值:   Integer  
  constant   integer   ppLayoutBlank   =   12  
  OLEObject   ole_object  
  ole_object   =   CREATE   OLEObject  
   
  integer   li_ret  
   
  li_ret   =   ole_object.ConnectToObject("","Excel.Application")  
  IF   li_ret   <>   0   THEN  
  //如果Excel还没有打开,则新建。  
  li_ret   =   ole_object.ConnectToNewObject("Excel.Application")  
  if   li_ret   <>   0   then  
  MessageBox("OLE错误","OLE无法连接!错误号:"   +   string(li_ret))  
  return   0  
  end   if  
  ole_object.Visible   =   True  
  END   IF  
   
  pointer   oldpointer  
   
  oldpointer   =   SetPointer(HourGlass!)  
   
  ole_object.Workbooks.Add  
   
  long   ll_colnum,ll_rownum  
  string   ls_value  
   
  string   ls_objects,ls_obj,ls_objs  
  long   ll_pos,ll_len,ll_num   =   0  
   
  ls_objects   =   trim(adw.Describe("datawindow.Objects"))  
   
  do   while   (pos(ls_objects,"~t")   >   0)  
  ll_pos   =   pos(ls_objects,"~t")  
  ll_len   =   ll_pos   -   1  
  ls_obj   =   left(ls_objects,ll_len)  
  if   (adw.Describe(ls_obj   +   ".type")   =   "column"   or   &  
  adw.Describe(ls_obj   +   ".type")   =   "compute")   and   &  
  (adw.Describe(ls_obj   +   ".band")   =   "detail")   and   (ls_obj   <>   "asd")   then  
  ll_num   +=   1  
  ls_objs   =   ls_obj  
  ls_objtag   =   adw.Describe(ls_obj   +   ".tag")  
  end   if  
  ls_objects   =   right(ls_objects,len(ls_objects)   -   ll_pos)  
  loop  
   
  //得到数据窗口数据的列数与行数(行数应该是数据行数   +   1)  
  ll_colnum   =   ll_num  
  ll_rownum   =   adw.rowcount()   +   1  
   
  string   ls_colname  
  integer   i,j,k  
  for   i   =   1   to   ll_colnum  
  //得到标题头的名字  
  ls_value   =   ls_objtag  
  ole_object.cells(1,i).value   =   ls_value  
  next  
   
  string   column_name  
  for   i   =   2   to   ll_rownum  
  for   j   =   1   to   ll_colnum  
  column_name   =   ls_objs  
  if   adw.Describe(column_name   +   ".type")   =   "column"   then  
  ls_value   =   adw.Describe("Evaluate("LookupDisplay("+column_name+")","+string(i   -   1)+")")  
  end   if  
  if   adw.Describe(column_name   +   ".type")   =   "compute"   then  
  ls_value   =   adw.Describe("Evaluate(""   +   adw.Describe(column_name   +   ".expression")   +   "","+string(i   -   1)+")")  
  end   if  
  ole_object.cells(i,j).value   =   ls_value  
  next  
  next  
   
  SetPointer(oldpointer)  
   
  ole_object.disconnectobject()  
  DESTROY   ole_object  
   
  return   1  
  end   function  
   
  三、PBToWord函数f_outputtoword_new.srf  
   
  $PBExportHeader$f_outputtoword_new.srf  
  global   type   f_outputtoword_new   from   function_object  
  end   type  
   
  forward   prototypes  
  global   function   integer   f_outputtoword_new   (datawindow   adw)  
  end   prototypes  
   
  global   function   integer   f_outputtoword_new   (datawindow   adw);  
  //函数名:f_outputtoword_new  
  //输入:   adw   -   datawindow,指定的数据窗口  
  //返回值:   Integer  
  constant   integer   ppLayoutBlank   =   12  
  OLEObject   ole_object  
  ole_object   =   CREATE   OLEObject  
   
  integer   li_ret  
   
  li_ret   =   ole_object.ConnectToObject("","word.application")  
  IF   li_ret   <>   0   THEN  
  //如果Word还没有打开,则新建。  
  li_ret   =   ole_object.ConnectToNewObject("word.application")  
  if   li_ret   <>   0   then  
  MessageBox("OLE错误","OLE无法连接!错误号:"   +   string(li_ret))  
  return   0  
  end   if  
  ole_object.Visible   =   True  
  END   IF  
   
  long   ll_colnum,ll_rownum  
  constant   long   wdWord9TableBehavior   =   1  
  constant   long   wdAutoFitFixed   =   0  
  constant   long   wdCell   =   12  
  string   ls_value  
  pointer   oldpointer  
   
  oldpointer   =   SetPointer(HourGlass!)  
   
  string   ls_objects,ls_obj,ls_objs  
  long   ll_pos,ll_len,ll_num   =   0  
   
  ls_objects   =   trim(adw.Describe("datawindow.Objects"))  
   
  do   while   (pos(ls_objects,"~t")   >   0)  
  ll_pos   =   pos(ls_objects,"~t")  
  ll_len   =   ll_pos   -   1  
  ls_obj   =   left(ls_objects,ll_len)  
  if   (adw.Describe(ls_obj   +   ".type")   =   "column"   or   &  
  adw.Describe(ls_obj   +   ".type")   =   "compute")   and   &  
  (adw.Describe(ls_obj   +   ".band")   =   "detail")   and   (ls_obj   <>   "asd")   then  
  ll_num   +=   1  
  ls_objs   =   ls_obj  
  ls_objtag   =   adw.Describe(ls_obj   +   ".tag")  
  end   if  
  ls_objects   =   right(ls_objects,len(ls_objects)   -   ll_pos)  
  loop  
   
  //得到数据窗口数据的列数与行数(行数应该是数据行数   +   1)  
  ll_colnum   =   ll_num  
  ll_rownum   =   adw.rowcount()   +   1  
   
  ole_object.Documents.Add()  
  ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range,   ll_rownum,   ll_colnum)  
   
  string   ls_colname  
  integer   i,j,k  
   
  for   i   =   1   to   ll_colnum  
  //得到标题头的名字  
  ls_value   =   ls_objtag  
  ole_object.Selection.TypeText(ls_value)  
  for   k   =   1   to   f_cncharnum(ls_value)  
  ole_object.Selection.TypeBackspace()  
  next  
  ole_object.Selection.MoveRight(wdCell)  
  next  
   
  adw.setredraw(false)  
  ole_object.Selection.MoveLeft(wdCell)  
  string   column_name  
  for   i   =   2   to   ll_rownum  
  for   j   =   1   to   ll_colnum  
  column_name   =   ls_objs  
  if   adw.Describe(column_name   +   ".type")   =   "column"   then  
  ls_value   =   adw.Describe("Evaluate("LookupDisplay("+column_name+")","+string(i   -   1)+")")  
  end   if  
  if   adw.Describe(column_name   +   ".type")   =   "compute"   then  
  ls_value   =   adw.Describe("Evaluate(""   +   adw.Describe(column_name   +   ".expression")   +   "","+string(i   -   1)+")")  
  end   if  
  ole_object.Selection.MoveRight(wdCell)  
  ole_object.Selection.TypeText(ls_value)  
  for   k   =   1   to   f_cncharnum(ls_value)  
  ole_object.Selection.TypeBackspace()  
  next  
  next  
  next  
  adw.setredraw(true)  
   
  constant   long   wdFormatDocument   =   0  
   
  SetPointer(oldpointer)  
  //保存新建的文档  
  if   messagebox("保存","文档已经成功完成,是否保存?",Question!,YesNo!)   =   1   then  
  string   docname,   named  
  integer   value  
   
  value   =   GetFileSaveName("选择文件",docname,   named,   "DOC","Doc   Files   (*.DOC),   *.DOC")  
   
  IF   value   =   1   THEN  
  ole_object.ActiveDocument.SaveAs(docname,   0,False,"",True,"",False,False,False,   False,False)  
  end   if  
   
  end   if  
  //断开OLE连接  
  Ole_Object.DisConnectObject()  
  Destroy   Ole_Object  
   
  return   1  
  end   function  
  Top

3 楼breadjyh(新小鱼)回复于 2004-01-18 10:27:44 得分 0

楼上的方法在论坛中已经看过,不过还是先谢过,这种方法当数据量很大的时候在速度上不是很理想,而且很是耗资源,我是想同大家研究一下pb本身导出到excel中的方法Top

4 楼sinkiangscorpio(诸葛军师)回复于 2004-01-18 17:36:08 得分 0

dw_Quarter.SaveAsAscii("H:\Q2\RESULTS.TXT","&",""")Top

5 楼klbt(快乐白兔)回复于 2004-01-18 22:36:18 得分 0

saveas速度快Top

6 楼breadjyh(新小鱼)回复于 2004-01-20 10:30:43 得分 0

怎么没有人了吗Top

7 楼sinkiangscorpio(诸葛军师)回复于 2004-01-20 14:28:50 得分 0

你还需要什么呢Top

8 楼jxc(GameHeart)回复于 2004-01-30 10:54:12 得分 0

PB   中的saveas   只是保存基本的数据,没有处理反显等,速度肯定快了.Top

9 楼dengxueqiang(小金鱼)回复于 2004-01-30 15:21:20 得分 0

int li_value  
  string ls_path,ls_fname  
   
  li_value   =   GetFilesaveName("请选择导出文件",   &  
  +   ls_path,   ls_fname,   "XLS",   &  
  +   "Excel文件   (*.xls),   *.xls,"   &  
  +   "Text   Files   (*.TXT),*.TXT,"   &  
  +   "Word   文件   (*.doc),   *.doc,")  
  IF   li_value   <>   1   THEN   return   false  
   
  setpointer(hourglass!)  
   
  // 删除原文件  
  if   fileexists(ls_path)   then  
  if   messagebox("提示信息",   "原文件已经存在,   是否覆盖   ?",   Question!,   YesNo!)   =   2   then   return   false  
  if   not   filedelete(ls_path)   then  
  messagebox("提示信息",   "删除原文件失败,   该文件可能正在被使用   !")  
  return   false  
  end   if  
  end   if  
   
  if   ad_dw.saveasascii(ls_path)     =     -1     then    
  MessageBox("提示信息",   "导出数据出错.   不能写入文件   !",   Exclamation!)  
  return   false  
  end   if  
   
  messagebox("提示信息","数据导出成功   !",   Exclamation!)  
  return   trueTop

责任编辑: efish 参与评论 查找更多:
相关文章
高份请教:在DELPHI中如何判断电脑是否联上了I… 高份请教:在DELPHI中如何判断电脑是否联上了INTERNET,是否断线啦.
用钩子实现进程防杀 用钩子实现进程防杀
如何恢复已经删除的文件,急 如何恢复已经删除的文件,急
请教两个问题,专家请进! 请教两个问题,专家请进!
谁会写文件上传的代码 谁会写文件上传的代码
一份让我们良心不安的调查-----良心不安并不可怕,可… 一份让我们良心不安的调查-----良心不安并不可怕,可怕的是不安过后一切照旧
我做了一个收发e-mail的软件,怎样选择存放附件的路… 我做了一个收发e-mail的软件,怎样选择存放附件的路径?
WEBLOGIC下的WEB应用文件的放置问题 WEBLOGIC下的WEB应用文件的放置问题
我要做一个关于基于板卡的呼叫中心的服务器端的开发… 我要做一个关于基于板卡的呼叫中心的服务器端的开发,应该是多线程的,我应该看什么资料呢?
怎样通过程序就能够知道指定的ip地址能否ping通 怎样通过程序就能够知道指定的ip地址能否ping通
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎