CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  DataWindow

数据窗口导出excel时的问题

楼主zblaoshu1979(周博)2006-04-05 11:06:02 在 PowerBuilder / DataWindow 提问

我用dw_1.SaveAs(docname,     excel!,     True),只能把保存成excel2.1的格式(需要把xls手动打开之后再保存才能使用),现在我要excel2000以上版本的格式,但是如果用   dw_1.SaveAs(docname,     excel8!,     True),我的汉字列就出现乱码,因为我有个身份证的列,我用别的方法来实现的时候,身份证列就变成了科学记数法了,这个问题怎么解决? 问题点数:50、回复次数:12Top

1 楼edp08(王二)回复于 2006-04-05 11:21:01 得分 30

//====================================================================  
  //   Script:   ue_savetoexcel()  
  //--------------------------------------------------------------------  
  //   Description:  
  // 所见即所得地保存数据窗口内容到EXCEL文件,并格式化  
  //--------------------------------------------------------------------  
  //   Returns: none  
  //--------------------------------------------------------------------  
  //   Author:   edp08 Date:   Sept.   24,   2002  
  //--------------------------------------------------------------------  
  //   Mender:   edp08 Date:   Mar.   31,   2003  
  //====================================================================  
  datastore   lds_data,   lds_col  
  OLEObject   ole_obj,   ole_book  
  long   ll_rc,   ll_cc,   i  
   
  CONSTANT   INTEGER   xlContinuous   =   1  
  CONSTANT   INTEGER   xlThin   =   2  
  CONSTANT   INTEGER   xlMedium   =   3  
  CONSTANT   INTEGER   xlThick   =   4  
  CONSTANT   INTEGER   xlEdgeLeft   =   7  
  CONSTANT   INTEGER   xlEdgeTop   =   8  
  CONSTANT   INTEGER   xlEdgeBottom   =   9  
  CONSTANT   INTEGER   xlEdgeRight   =   10  
  CONSTANT   INTEGER   xlInsideVertical   =   11  
  CONSTANT   INTEGER   xlInsideHorizontal   =   12  
   
  if   rowcount()     =   0   then   return    
   
  SetPointer(HourGlass!)  
  //格式化数据  
  ll_rc   =   of_getcontents(lds_data,   lds_col)    
  if   ll_rc   =   0   then   return  
   
  //取得用户指定的保存文件名  
  string   docname,   named  
  IF   GetFileSaveName("Save   as   Excel",   docname,   named,   "XLS",   "Excel   Files   (*.XLS),*.XLS")   =   1   THEN    
  //另存内容  
  if   lds_data.SaveAs(named,   Excel5!,   false)   <>   1   then  
  of_error("提示",   "输出失败!")  
  else  
  //连接到Excel,处理表头  
  ole_obj   =   CREATE   OLEObject  
  IF   ole_obj.ConnectToNewObject("excel.application")   <>   0   THEN  
  MessageBox('OLE错误',   'OLE无法连接!')  
  destroy   ole_obj  
  else  
  ole_obj.visible   =   true  
  ole_obj.Workbooks.Open(docname)  
  ole_obj.Selection.EntireRow.Insert  
  ole_book   =   ole_obj.Worksheets(1)  
  ll_cc   =   lds_col.rowcount(   )  
  for   i   =   1   to   ll_cc  
  //插入中文表头  
  ole_book.cells(1,   i).value   =   lds_col.object.coltitle[i]  
  //Decimal字段求和  
  if   left(lds_col.object.coltype[i],   3)   =   'DEC'   then  
  ole_book.cells(ll_rc+2,   i).FormulaR1C1   =   "=SUM(R[-"+string(ll_rc)+"]C:R[-1]C)"  
  end   if  
  next  
  //处理表头字体  
  ole_book.Range(ole_book.cells(1,   1),   ole_book.cells(1,   ll_cc)).Select  
  ole_obj.Selection.Font.Bold   =   True  
  ole_obj.Selection.Font.Name   =   "楷体_GB2312"  
  ole_obj.Selection.Font.Size   =   11  
  ole_obj.Selection.HorizontalAlignment   =   -4108  
  //  
  ole_book.Range(ole_book.Cells(2,   1),   ole_book.Cells(ll_rc+2,   ll_cc)).Select  
  ole_obj.Selection.Font.Size   =   10  
  //  
  //ole_book.Cells.Select  
  //ole_obj.Selection.Interior.ColorIndex   =   48  
  //ole_obj.Selection.Interior.Pattern   =   1  
  //  
  ole_book.Range(ole_book.Cells(1,   1),   ole_book.Cells(ll_rc+2,   ll_cc)).Select  
  for   i   =   xlEdgeLeft   to   xlInsideHorizontal  
  ole_obj.Selection.Borders(i).LineStyle   =   xlContinuous  
  next  
  ole_obj.Selection.Columns.AutoFit  
  //ole_obj.Selection.Interior.ColorIndex   =   2  
  //  
  //ole_obj.ActiveWindow.DisplayGridlines   =   False  
  //ole_obj.ActiveWindow.DisplayZeros   =   False  
  //ole_obj.ActiveSheet.DisplayAutomaticPageBreaks   =   True  
  ole_obj.ActiveWorkbook.Save  
  //ok!搞掂  
  ole_obj.disconnectobject(   )    
  destroy   ole_book  
  destroy   ole_obj  
  //ShellExecute(0,   'open',   named,   '',   '',   0)  
  end   if  
  end   if  
  end   if  
   
  ChangeDirectory(gs_AppPath)  
  destroy   lds_data  
  destroy   lds_col  
  SetPointer(Arrow!)  
   
  return    
  Top

2 楼hylaeion(☆霖湘凝☆)回复于 2006-04-05 13:11:37 得分 0

up,用ole,自己定义导出的格式~!Top

3 楼li_d_s(鄙视那些不懂Java却跑来乱骂的人,.NET没啥了不起)回复于 2006-04-05 13:49:43 得分 20

dw2xlsTop

4 楼hygougou(uoguogyh)回复于 2006-04-05 14:21:36 得分 0

///////////////////////////////////////////////////////////////////////////  
  //  
  // Parameters : ad_dw : datawindow  
  // as_file : file   name  
  // Returns : true/false : boolean  
  // Description : Save   the   datawindow   as   a   excel   file.  
  //  
  ///////////////////////////////////////////////////////////////////////////  
  // author : purplekite  
  // date : 2003-01-23  
  ///////////////////////////////////////////////////////////////////////////  
   
  SetPointer(HourGlass!)  
   
  //declare   the   local   variables  
  long i,   j,   li_pos  
  string ls_objects,   ls_obj,   ls_text,   ls_err,   ls_sql  
  datastore lds_saveas //导出数据窗  
  datastore lds_sort //获得根据   object.x   排序的   (band   =   detail   and   visible   =   1)   的   column/compute  
  boolean lb_return //返回值  
  string ls_pbver //pb   版本信息  
  environment   env //环境变量  
   
  getenvironment(env)  
  ls_pbver   =   string(env.pbmajorrevision)  
   
  //创建排序列   datastore  
  lds_sort   =   create   datastore  
  ls_sql   =   'column=(type=char(1)   name   =   ztext   dbname="ztext"   )'   +   '~r~n'   +   &  
  'column=(type=char(1)   name   =   zcol   dbname="zcol"   )'   +   '~r~n'   +   &  
  'column=(type=long   name   =   zx   dbname="zx"   )'   +   '~r~n'  
  ls_sql   =   'release   '   +   ls_pbver   +   ';~r~ntable('   +   ls_sql   +   ')'  
  lds_sort.create(ls_sql,   ls_err)  
  if   len(ls_err)   >   0   then  
  lb_return   =   false  
  goto   lab1  
  end   if  
   
  //准备数据====================================================  
  //all   controls  
  ls_objects   =   ad_dw.Describe("datawindow.objects")  
   
  //按~t位置作判断开始循环  
  do   while   (pos(ls_objects,"~t")   >   0)  
  li_pos   =   pos(ls_objects,"~t")  
  ls_obj   =   left(ls_objects,li_pos   -   1)  
  ls_objects   =   right(ls_objects,len(ls_objects)   -   li_pos)  
  //(column   or   compute   )   at   detail   and   visible  
  IF   (ad_dw.Describe(ls_obj+".type")   =   "column"   or   &  
    ad_dw.Describe(ls_obj+".type")   =   "compute"   )   AND   &  
    (ad_dw.Describe(ls_obj+".band")   =   "detail"   )   AND   &  
    (ad_dw.Describe(ls_obj+".visible")   =   "1"   )   THEN  
  ls_text   =   ad_dw.describe(ls_obj   +   '_t.text')  
  if   ls_text   <>   '!'   and   ls_text   <>   '?'   then  
  lds_sort.insertrow(0)  
  lds_sort.setitem(lds_sort.rowcount(),   'ztext',   ls_text)  
  lds_sort.setitem(lds_sort.rowcount(),   'zcol',   ls_obj)  
  lds_sort.setitem(lds_sort.rowcount(),   'zx',   long(ad_dw.describe(ls_obj   +   '.x')))  
  end   if  
  END   IF  
  loop  
   
  //the   last   control  
  ls_obj   =   ls_objects  
  IF   (ad_dw.Describe(ls_obj+".type")   =   "column"   or   &  
    ad_dw.Describe(ls_obj+".type")   =   "compute"   )   AND   &  
    (ad_dw.Describe(ls_obj+".band")   =   "detail"   )   AND   &  
    (ad_dw.Describe(ls_obj+".visible")   =   "1"   )   THEN  
  ls_text   =   ad_dw.describe(ls_obj   +   '_t.text')  
  if   ls_text   <>   '!'   and   ls_text   <>   '?'   then  
  lds_sort.insertrow(0)  
  lds_sort.setitem(lds_sort.rowcount(),   'ztext',   ls_text)  
  lds_sort.setitem(lds_sort.rowcount(),   'zcol',   ls_obj)  
  lds_sort.setitem(lds_sort.rowcount(),   'zx',   long(ad_dw.describe(ls_obj   +   '.x')))  
  end   if  
  END   IF  
  //如果没有列则跳出  
  if   lds_sort.rowcount()   <   1   then   goto   lab1  
  //根据   object.x   排序  
  lds_sort.setsort('zx   A')  
  lds_sort.sort()  
   
  //创建导出   datastore  
  lds_saveas   =   create   datastore  
  ls_sql   =   ''  
  for   i   =   1   to   lds_sort.rowcount()  
  ls_obj   =   lds_sort.getitemstring(i,   'zcol')  
  ls_sql   +=   'column=(type=char(1)   dbname="'   +   ls_obj   +   '"   )'   +   '~r~n'  
  next  
  ls_sql   =   'release   '   +   ls_pbver   +   ';~r~ntable('   +   ls_sql   +   ')'  
  lds_saveas.create(ls_sql,   ls_err)  
  if   len(ls_err)   >   0   then  
  lb_return   =   false  
  goto   lab1  
  end   if  
   
  //向   lds_saveas   中写数据  
  for   i   =   1   to   ad_dw.rowcount()  
  yield()//释放消息队列,   如果数据量较大,   可以使用这个函数  
  lds_saveas.insertrow(0)  
  for   j   =   1   to   lds_sort.rowcount()  
  ls_obj   =   lds_sort.getitemstring(j,   'zcol')  
  if   ad_dw.describe(ls_obj   +   '.type')   =   'column'   then  
  ls_text   =   ad_dw.describe('evaluate(~'LookUpDisplay('   +   ls_obj   +   ')~',   '   +   string(i)   +   ')')  
  else  
  ls_text   =   ad_dw.describe('evaluate(~''   +   ls_obj   +   '~','   +   string(i)   +   ')')  
  end   if  
  lds_saveas.setitem(i,   j,   ls_text)  
  next  
  next  
   
  lds_saveas.insertrow(1)  
  for   i   =   1   to   lds_sort.rowcount()  
  lds_saveas.setitem(1,   i,   lds_sort.getitemstring(i,   'ztext'))  
  next  
  //准备数据完毕====================================================  
   
  //saveas   datawindow  
  lb_return   =   (lds_saveas.saveas(as_file,   excel!,   false)   =   1)  
   
  lab1:  
  destroy   lds_sort  
  destroy   lds_saveas  
  SetPointer(Arrow!)  
  return   lb_return  
  Top

5 楼edp08(王二)回复于 2006-04-05 14:40:07 得分 0

楼上的方法导出后,在EXCEL中数据列求和会有问题  
   
  关于数据准备,我实现的方法有所不同Top

6 楼zblaoshu1979(周博)回复于 2006-04-05 15:29:34 得分 0

一楼,你是函数里面的  
  rowcount(),of_getcontents,of_error,ChangeDirectory都是什么函数?Top

7 楼hxy75(小潜)回复于 2006-04-05 15:33:49 得分 0

dw2xls,方便又实用,价格也不高Top

8 楼edp08(王二)回复于 2006-04-05 15:39:33 得分 0

rowcount()内部函数呵,  
   
  of_getcontents是所见即所得的取得要保存的数据窗口内容,你不需要,你用你的DW直接saveas即可,  
   
  of_error你用MESSAGEBOX,  
   
  ChangeDirectory是为了回到原来目录,也是内部函数呵  
  Top

9 楼zblaoshu1979(周博)回复于 2006-04-05 15:52:19 得分 0

hygougou(uoguogyh)    
  你的方法得到的还是excel2.1的报表,我想得到最近版本的excel的报表怎么做/Top

10 楼zblaoshu1979(周博)回复于 2006-04-05 16:11:59 得分 0

edp08()   你的函数和我直接dw_1.SaveAs(docname,     excel!,     True)的结果是一样的,不能解决我的问题,我的问题是:直接dw_1.SaveAs(docname,     excel!,     True)的格式已经满足我想要的了,但是生成是的excel2.1版本的excel,我想要得到2000以上版本的excelTop

11 楼zblaoshu1979(周博)回复于 2006-04-05 16:42:16 得分 0

我用dw2excel解决了这个问题,谢谢你们Top

12 楼edp08(王二)回复于 2006-04-05 17:29:18 得分 0

你没有明白我的意思,我是告诉你怎么操作导出后的东西  
   
   
  至于导出的格式不对,是因为你用了excel!而不是excel5!,难道你没看出来?  
  SaveAs(named,   Excel5!,   false)Top

相关问题

关键词

得分解答快速导航

  • 帖主:zblaoshu1979
  • edp08
  • li_d_s

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo