pb9实现在两个工作簿之间进行工作表复制

news/2024/7/21 6:31:30 标签: 工作, object, excel, vba

   下面的函数f_excel_hb,可以实现“工作簿filename_s中的工作表sheetname_s以新的工作表名称sheetname_t,复制到工作簿filename_t的最后”

[cpp]  view plain copy
  1. public function boolean f_excel_hb (string filename_s, string filename_t, string sheetname_s, string sheetname_t);  
  2. //==========================================================  
  3. //  合并两个工作簿中的某个工作表   
  4. //==========================================================  
  5. //  作者:yyoinge 2011-10-12 18:00  
  6. //==========================================================  
  7. //  将工作簿filename_s中的工作表sheetname_s以新的  
  8. //  工作表名称sheetname_t,复制到工作簿filename_t的最后  
  9. //==========================================================  
  10. if not fileexists(filename_s) then  
  11.     messagebox('','工作簿【' + filename_s + '】(源)不存在')  
  12.     return false  
  13. end if  
  14. if not fileexists(filename_t) then  
  15.     messagebox('','工作簿【' + filename_t + '】(目标)不存在')  
  16.     return false  
  17. end if  
  18. long ll_val  
  19. //声明ole对象  
  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 then  
  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(filename_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  
  38. ole_object_s.displayalerts = false  
  39. int n,t  
  40. int li  
  41. boolean isexists=false  
  42. oleobject lworksheet  
  43. //判断源工作簿中的工作表是否存在  
  44. try     
  45.     lworksheet =  ole_object_s.Workbooks(filename_s).sheets(sheetname_s)  
  46.     isexists = true  
  47. catch( oleruntimeerror   er)   
  48.     isexists = false  
  49. end try   
  50. if isexists=false then  
  51.     messagebox('','工作簿【' + filename_s + '】中工作表不存在工作表[' + sheetname_s + ']')  
  52.     goto error  
  53. end if  
  54. //当目标工作簿中存在sheet名为sheetname_t的工作表时,为sheetname_t增加后缀(1),然后再重复进行判断,直到表名不存在  
  55. isexists = true  
  56. do while isexists  
  57.     try     
  58.         lworksheet =  ole_object_s.Workbooks(filename_t).sheets(sheetname_t)  
  59.         isexists = true  
  60.         sheetname_t += '(1)'  
  61.     catch( oleruntimeerror   er1)   
  62.         isexists = false  
  63.     end try   
  64. loop  
  65. //进行工作表合并(移到目标工作簿的最后)  
  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.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( oleruntimeerror   er2)  
  79.     messagebox('提示''无法保存工作簿【' + 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. 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;  
  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();  
  100. destroy ole_object_s;  
  101. return false  
  102.   
  103.   
  104. end function  

    其中用到的一个路径分割函数of_splitpath如下:
[cpp]  view plain copy
  1. public function string of_splitpath (string as, integer ai);//==========================================================  
  2. //  分割文件名  
  3. // ai:  1返回路径,2返回文件名(带后缀名),32返回文件名(不带后缀名)  
  4. //==========================================================  
  5. //  作者:yyoinge 2011-10-12 18:00  
  6. //==========================================================  
  7.   
  8. choose case ai  
  9.     case 1   
  10.         if posw(as, '.') = 0 then return as  
  11.         return leftw(as,lenw(as) - posw(reverse(as), '\') + 1)  
  12.     case 2   
  13.         if posw(as, '\') = 0 then return as  
  14.         return rightw(as,posw(reverse(as), '\') - 1)  
  15.     case 3   
  16.         if posw(as, '\') > 0 then as = rightw(as,posw(reverse(as), '\') - 1)  
  17.         return leftw(as, lastpos(as, '.') - 1)  
  18.     case else  
  19.         return as  
  20. end choose  
  21. end function  

    pb复制excel工作表的功能,可以帮助我们实现:将1个数据窗口导出到1个excel工作簿的多个工作表sheet中。实现的步骤大致如下:
    (1)将datawindow的数据,按照平均行数(每个sheet中需要保存的行数),依次复制到临时的datastore中。如:将1个有10行数据的datawindow,导出为每个sheet包含3行数据的多sheet工作簿,则需要依次将1-3行、4-6行、7-9行、10至10行分别复制到临时的datastore中。
    (2)然后将datastore中的数据saveas导出为单个单sheet的excel文件。
    (3)将第2次开始导出的excel文件(也就是上述例子中的4-6行开始的excel文件),依次合并到第1次导出的excel文件(1-3行)中,并删除导出的excel文件(1-3行对应的文件暂时不删除)。
    (4)待所有数据都导出,并复制到第1次导出的excel文件后,将第1次导出的excel文件改名并复制目标导出路径上,然后删除第1次导出的excel文件。

    具体源码可以参照  PB9将数据窗口导出到一个EXCEL文件的多个工作表中 。

    该源码使用的是从后到前的导出方法,也就是先导出10-10行,然后导出7-9行。。。最后导出1-3行,因为在该源码中,复制工作表时使用的方法是:

[cpp]  view plain copy
  1. ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(ole_object_s.workbooks(filename_t).Sheets(1) //将源工作表复制到目标工作簿的第1个工作表前面  

    而上述函数复制工作表的方法为: 
[cpp]  view plain copy
  1. int li  
  2. setnull(li)  
  3. 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)))   //将源工作表复制到目标工作簿的最后1个工作表后面  

    这边需要对copy方法进行说明,在VBA中,工作表复制的写法为:
[cpp]  view plain copy
  1. Sheets("工作表名称").Copy Before := Sheets(1) //将工作表“工作表名称”复制到第1个工作表前面  
  2. Sheets("工作表名称").Copy After := Sheets(1)  //将工作表“工作表名称”复制到第1个工作表后面  


    而在pb中对应的写法为: 
[cpp]  view plain copy
  1. int li setnull(li)  
  2. Sheets("工作表名称").Copy(Sheets(1), li) //将工作表“工作表名称”复制到第1个工作表前面  
  3. Sheets("工作表名称").Copy(li, Sheets(1)) //将工作表“工作表名称”复制到第1个工作表后面  




[cpp]  view plain copy
  1. <div style="TOP: 1694px"><pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"><pre>  

http://blog.csdn.net/yyoinge/article/details/6942254

http://www.niftyadmin.cn/n/506288.html

相关文章

Java面试题(上)

面向对象编程&#xff08;OOP&#xff09; Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点&#xff1a; 代码开发模块化&#xff0c;更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。 面向对象编程有很多…

VS中如何使用SQLite(C#版)

友情提示&#xff1a;本文所述代码下载地址 http://download.csdn.net/source/2299805 原文&#xff1a;http://blog.csdn.net/icycoffee/article/details/5351354 SQLite 是一个嵌入式的关系数据库系统&#xff0c;运用十分广泛。在一些数据处理量不大的应用程序中&#xff0c…

Quartz定时任务(纯java方式实现)

1.首先说一下Quartz的三个核心概念任务&#xff1a;就是执行的工作内容。Quartz提供Job接口来支持任务定义 触发器&#xff1a;定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能&#xff0c; 调度器&#xff1a;Quartz提供了Scheduler接口&#xff0…

C# 中 List 用法

C# 中 List 用法 List 类是 ArrayList 类的泛型等效类&#xff0c;某些情况下&#xff0c;用它比用数组和 ArrayList 都方便。 我们假设有一组数据&#xff0c;其中每一项数据都是一个结构。 public struct Item {public int Id;public string DisplayText; } 注意结构是不能给…

Quartz定时任务(Spring)

继上一篇的纯java方式实现 在Spring中如何实现呢&#xff1f;实体类和服务类与纯java实现一样&#xff0c;不同的是job这个类&#xff0c;需要继承QuartzJobBean类&#xff0c;下面附加上该类的代码片段 public class PlanJob extends QuartzJobBean {private PlanService pl…

数据库主键设计之思考

主键的必要性: 有些朋友可能不提倡数据库表必须要主键&#xff0c;但在我的思考中&#xff0c;觉得每个表都应该具有主键&#xff0c;不管是单主键还是双主键&#xff0c;主键的存在就代表着表结构的完整性&#xff0c;表的记录必须得有唯一区分的字段&#xff0c;主键主要是用…

Sturts2 实现单文件和多文件的上传

一、下图所示为效果图 二、先来看看一下我的项目结构 三、单文件上传 1.单文件上传页面:index.jsp <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath …

PB对DW数据窗口操作必学

/*******DataWindow Object 的几个有用的属性 *********/*dw_1.Object.DataWindow.Column.Count 属性记录的是 DataWindow 中的列数。 DataWindow 中的所有对象都有 Type 属性&#xff0c;通过访问他们的 Type 属性可以得知他们是 Column、Compute、Text 等等对象。动态改变 Da…