将PB的交叉报表完整转换成EXCEL

将DW数据窗口导出为EXCEL文件的方法(整理) 本文为摘自优快云论坛帖子收集整理后汇总版本:---2004年9月3日整理---原贴见:http://community.youkuaiyun.com/Expert/topic/3328/3328715.xml?temp=8.050799E-04鉴于现在很多朋友询问 pb 数据导出到excel 中的问题,导出去后格式和数据类型不对了,自己写了几个用户对象,希望能抛砖引玉,加强技术交流,得到大家 阅读详情

如何将PB的交叉报表转换成EXCEL形式(包括标题和合计的完整形式)

函数部分:(还用到了PFC的字串处理的一个函数和在本对象中的一个取值函数)
//====================================================================
// [PUBLIC] Function uf_data2excel 在 u_data2word inherited from nonvisualobject
//--------------------------------------------------------------------
// 说明:将数据倒入excel中,支持计算列及显示格式,要求在题头的计算列要写tag值
//--------------------------------------------------------------------
// 参数1:[value] datawindow adw
//  说明:数据窗口
//--------------------------------------------------------------------
// 返回: (INTEGER) 成功返回1,不成功返回0
//--------------------------------------------------------------------
// 作者: cwl  日期: 2002.03.18
//====================================================================
//变更日志:020515加入对交叉表倒出的支持(主要是修改了保存题头部分)

constant integer ppLayoutBlank = 12
OLEObject ole_object
ole_object = CREATE OLEObject 

integer li_ret,li_crosstab=0
long ll_colnum,ll_rownum
string ls_value
string ls_objects,ls_obj,ls_objs[],ls_objtag[]
long ll_pos,ll_len,ll_num = 0
//题头区
long ll_headnum
string ls_head[],ls_headtag[]
//合计区
long ll_sumnum,i=1,startpos=1,endpos,li_pos
string ls_sum[],ls_sumtag[],ls_bind,token[],list,ls_temp,ls_crosstabcol
n_cst_string lu_string //PFC string处理对象

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 = false//不可见
END IF

if adw.Object.DataWindow.Processing='4' then //交叉表处理
 adw.Object.DataWindow.Crosstab.StaticMode='true'//将数据静态化
 li_crosstab=1
end if

pointer oldpointer
oldpointer = SetPointer(HourGlass!)

//新增一个工作区
ole_object.Workbooks.Add

 

ls_objects = trim(adw.Describe('datawindow.Objects'))
list=ls_objects
EndPos = pos(list, '~t', StartPos)
//得到对象列表
Do while ( EndPos > 0 )
 token[i] = Mid(list, StartPos, EndPos - StartPos)
 i ++
 StartPos = EndPos + 1
 EndPos = pos(list, '~t', StartPos)
LOOP
token[i] = Mid(list, StartPos)
ll_rownum=UpperBound(token)

for i=1 to ll_rownum
 ls_obj = token[i]
 if ls_obj='title' then messagebox('',adw.Describe(ls_obj + '.type'))
 if lower(adw.Describe(ls_obj + '.type')) = 'column' or &
  lower(adw.Describe(ls_obj + '.type')) = 'compute' then
  ls_bind=lower(adw.Describe(ls_obj + '.band'))
  if ls_bind = 'detail' then
   ll_num += 1
   ls_objs[ll_num] = ls_obj
   if li_crosstab=0 then //一般处理
    ls_objtag[ll_num] = adw.Describe(ls_obj + '_t.text')
   elseif 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_objtag[ll_num] = adw.Describe(ls_obj + '_t.text')
    else
     ls_temp=mid(ls_obj,li_pos)
     ls_crosstabcol=mid(ls_obj,1,li_pos - 1)//取出交叉列名
//     messagebox('',ls_crosstabcol+',,,,'+ls_temp)
     ls_objtag[ll_num]=adw.Describe( ls_crosstabcol + "_t"+ls_temp+".Text" )//取出交叉表的题头
    end if
   end if
  elseif (ls_bind = 'summary') then
   ll_sumnum += 1
   ls_sum[ll_sumnum] = ls_obj
   ls_sumtag[ll_sumnum] = adw.Describe(ls_obj + '.tag')
  else
   ll_headnum += 1
   ls_head[ll_headnum] = ls_obj
   ls_headtag[ll_headnum] = adw.Describe(ls_obj + '.tag')
  end if

 end if
 
next

//得到数据窗口数据的列数与行数(行数应该是数据行数 + 2)
ll_colnum = ll_num
ll_rownum = adw.rowcount() + 2

string column_name
string ls_colname
integer j,k
//写题头
for i=1 to ll_headnum
 ls_value = ls_headtag[i]
 if ls_value<>'?' then
  ole_object.cells(1,(i - 1)*2+1).value = ls_value
 end if
 column_name = ls_head[i]
 ls_value=this.uf_getdata(adw,column_name,1)
 ole_object.cells(1,(i)*2).value = ls_value
next
//写结尾
for i=1 to ll_sumnum
 ls_value = ls_sumtag[i]
 if ls_value<>'?' then
  ole_object.cells(ll_rownum+1,(i - 1)*2+1).value = ls_value
 end if
 column_name = ls_sum[i]
 ls_value=this.uf_getdata(adw,column_name,1)
 ole_object.cells(ll_rownum+1,(i)*2).value = ls_value
next

//写标题
for i = 1 to ll_colnum
 //得到标题头的名字
 ls_value = ls_objtag[i]
 ole_object.cells(2,i).value = ls_value
next
//写数据
for i = 3 to ll_rownum
 for j = 1 to ll_colnum
  column_name = ls_objs[j]
  ls_value=this.uf_getdata(adw,column_name,i - 2)
  ole_object.cells(i,j).value = ls_value
 next
next

SetPointer(oldpointer)
ole_object.Visible = True
ole_object.disconnectobject()
DESTROY ole_object

return 1

------------------------

PFC的字串处理函数(可直接改成全局函数就可用了)
//====================================================================
// [PUBLIC] Function of_lastpos 在 n_cst_string inherited from n_ccu_base
//--------------------------------------------------------------------
// 说明:找出一字串在另一串中最后出现的位置
//--------------------------------------------------------------------
// 参数1:[value] string as_source
//  说明:源串
// 参数2:[value] string as_target
//  说明:目标串
// 参数3:[value] long al_start
//  说明:开始位置
//--------------------------------------------------------------------
// 返回: (LONG) 从右数起出现的位置,找不到则返回0
//--------------------------------------------------------------------

Long ll_Cnt, ll_Pos

//Check for Null Parameters.
IF IsNull(as_source) or IsNull(as_target) or IsNull(al_start) Then
 SetNull(ll_Cnt)
 Return ll_Cnt
End If

//Check for an empty string
If Len(as_Source) = 0 Then
 Return 0
End If

// Check for the starting position, 0 means start at the end.
If al_start=0 Then 
 al_start=Len(as_Source)
End If

//Perform find
For ll_Cnt = al_start to 1 Step -1
 ll_Pos = Pos(as_Source, as_Target, ll_Cnt)
 If ll_Pos = ll_Cnt Then
  //String was found
  Return ll_Cnt
 End If
Next

//String was not found
Return 0
--------------------------------

得到一个数据窗口列及计算列的准确显示值函数:
//====================================================================
// [PUBLIC] Function uf_getdata 在 u_data2word inherited from nonvisualobject
//--------------------------------------------------------------------
// 说明:得到一个数据窗口列及计算列的准确显示值
//--------------------------------------------------------------------
// 参数1:[value] datawindow dw_1
//  说明:
// 参数2:[value] string col
//  说明:对象名
// 参数3:[value] integer row
//  说明:行
//--------------------------------------------------------------------
// 返回: (STRING) 值
//--------------------------------------------------------------------
// 作者: cwl  日期: 2002.03.18
//====================================================================
string ls_edittype,ls_value,ls_format
integer id
ls_edittype=lower(dw_1.Describe(col+".Edit.Style"))//得到编缉风格
choose case ls_edittype
 case 'ddlb','dddw'//应该得到显示值
  ls_value=dw_1.describe(  "Evaluate('LookUpDisplay("+col+") ',"+string(row)+" )")
 case else
  id=long(dw_1.Describe(col+".id"))
  ls_format=dw_1.Describe(col+".Format")
  if mid(ls_format,1,1)='[' or ls_format='?' or ls_format='' then //不作格式处理
   if id=0 then //计算列
    ls_value=dw_1.Describe("Evaluate(~"" + dw_1.Describe(col + '.expression')&
     + "~","+string(row)+")")
   else
    ls_value=string(dw_1.object.data[row,id])
   end if
  else
   if id=0 then //计算列
    ls_value=string(dw_1.Describe("Evaluate('" + dw_1.Describe(col + '.expression')&
     + "',"+string(row)+")"),ls_format)
   else
    ls_value=string(dw_1.object.data[row,id],ls_format)
   end if
  end if
end choose
if isnull(ls_value) then ls_value=''
return ls_value
--------------------------

最简单的解决办法,把dw存成html文件,然后改扩展名为.xls,一切ok了

PB9报表设计与打印功能深度解析 本文还有配套的精品资源,点击获取 简介:PowerBuilder 9.03版本的PB9报表设计和打印功能为开发者提供了根据需求创建和定制报表模板的能力。此功能在处理大量数据的企业环境中尤为重要,比如电力公司等。开发者利用报表设计器,可以自由布局并调整报表字段,以满足复杂的打印需求,包括字体、大小、颜色、图表、图像以及页眉和页脚等的个性化设置。PB9报表的核心功能涵盖了报表设... 阅读详情

相关推荐

用PB交叉报表写的用户管理、权限分配

用PB交叉报表写的比较另类用户管理、权限分配,保证令你耳目一新。

pb中accrosstab表另存为excel

刚来信息科有两个月,熟悉了pb6.5环境和医院系统的数据库一些表,领导交代要把医生工作量另存为excel,刚开始觉得很容易,痛快答应了,研究了代码之后,觉得无非就是数据窗口saveas()就可以了,可是代码写好之后发现另存的excel跟窗体的数据不一样,所有的合计都没有另存到ex

773

dw2xls导出crosstab+grid美化

部分dw2xls版本不支持导出crosstab,这个就是把crosstab改变为grid;另外可以对grid进行美化(后者不是原创)

如何将PB的交叉报表转换成EXCEL形式

如何将PB的交叉报表转换成EXCEL形式 如何将PB的交叉报表转换成EXCEL形式,用的办法是写一个通用的转换函数 主函数部分:(还用到了PFC的字串处理的一个函数和在本对象中的一个取值函数) //==================================================================== // [PUBLIC] F...

u010561878的博客 854

【SIP基础】SIP协议基本呼叫流程

SIP呼叫流程下图显示了一个SIP会话的基本呼叫流程。 下面是上述呼叫流程的详细解释: Alice发送INVITE请求到代理服务器,INVITE请求负责发起会话。 代理服务器立即发送Trying 100给请求者(Alice),表示试图响应INVITE请求,以防止重传该INVITE请求。 代理服务器搜索Bob所在位置服务器的地址,得到的地址后,将转发INVITE请求到Bob。 此后,Bob回应180

VVSIP官网博客 1万+

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

PB的datawindow导出到excel文件(支持计算列和显示格式)

PB的datawindow导出到excel文件(支持计算列和显示格式)[ seeyou 发表于 2005-8-30 10:40:00 ] //====================================================

3150

PB中 把DW导出到Excel,与Excel通讯

//==============================================================================// 事件: cb_export::clicked()//------------------------------------------------------------------------------// 描述: 把收费单的内

Sunday_hl的专栏 3043

jenkins安装、打包、部署

一个可以让小白部署发布项目的软件;git 配置 一定要配置git的命令路径jenkins启动命令,一定要加这一段 -Dhudson.util.ProcessTree.disable=true一定要配置jenkins的节点,BUILD_ID和DONTKILLME 否则会导致打包后,会将运行的java程序进程也杀死创建任务SSH中执行服务器B的命令的时候,cd /opt;一定要cd 打开那个目录,否则文件无法传输过去。

学海无涯,我用JAVA 5217

第二十届全国大学生智能汽车竞赛极速光电组:MicroPython与恩智浦RT1021的硬件编程实战指南

本文为参加第二十届全国大学生智能汽车竞赛极速光电组的同学提供了一份详尽的MicroPython与恩智浦RT1021硬件编程实战指南。文章深入剖析了选择MicroPython与RT1021这对组合的优势,详细讲解了从开发环境搭建、基础硬件控制(如GPIO、PWM、编码器、CCD)到系统集成(平衡控制、循迹算法)与多任务调试的全过程,旨在帮助参赛者降低嵌入式开发门槛,高效备赛。

wdx0123456的博客 843

【菁菁报表]】交叉报表的制作过程

事故情况统计表1   制作步骤如下:   1、启动报表设计器,点击“新建交叉表”按钮。 2、为报表指定数据源,点击“报表”菜单下的“设置数据源”子菜单,弹出如下窗口: 点击“生产连接字符串”按钮,出现下图 选择Microsoft Jet 4.0 OLE DB Provider,点击“下一步”按钮,如下图所示   选择范例数据库Northwind.mdb 3、为报表生

dragon_wangzhen的专栏 1954

100G SR4 光模块设计

目前100G SR4 光模块主要采用COB 封装技术,在光电芯片键合(bonding)阶段,首先使用银胶将光芯片、电芯片精准固定在电路板规定位置上,该工序即为元件键合(die bonding);然后采用打线机进行金线键合(wire bonding),完成光模块内部的电气连接。在光路耦合阶段,采用8路阵列透镜组完成光路90°弯折及聚焦,并采用有源耦合的工艺进行光路的最终确认,该设计方案工艺简单、高效,借助全自动贴片机、打线机和耦合台就可实现100G SR4 光模块的大批量生产。

Flyin_Group的博客 1373

【PB】提取动态交叉报表动态标题名和动态列值

//提取动态交叉报表动态标题名和动态列值: String ls_Str, ls_Str1, ls_Name, ls_Name_Text, ls_Text Long ll_Cnt, ll_CntTmp, i, ll_Row dwobject ldwo environment env GetEnvironment(env) ll_Cnt = Long(dw_2.Describe

5480

基于STM32L4XX、HAL库的ESP32-C3-WROOM-02-N4 WIFI模块驱动程序设计

支持802.11 b/g/n Wi-Fi (2.4GHz)RISC-V 32位单核处理器,主频高达160MHz。封装尺寸:18mm × 20mm × 3mm。工作温度范围:-40°C ~ 85°C。// 设置WiFi模式为STA。支持Bluetooth 5 (LE)// 发送AT指令测试通信。// 检查响应是否包含OK。内置4MB SPI Flash。// 连接TCP服务器。// 发送HTTP请求。// 初始化UART。// 建立TCP连接。低功耗设计,适合IoT应用。

zhusl6688的博客 384

基于MATLAB的导弹轨迹和撞击位置仿真

本文将介绍如何使用MATLAB进行导弹轨迹和撞击位置的仿真,提高导弹的精确打击能力。首先,我们需要确定导弹的初始位置和速度,以及导弹所受到的外部环境因素如重力、空气阻力等。在MATLAB中,可以通过ODE求解器来模拟导弹的运动轨迹。最后,我们通过控制器输出的控制信号来控制导弹的姿态。通过对导弹的运动轨迹和姿态进行仿真,可以更好地预测和规划导弹的运动轨迹,提高其精确打击能力。在实际作战中,为了提高导弹精确打击能力,需要对导弹的撞击位置进行预测和规划。我们可以通过控制导弹的姿态来实现撞击目标的精确命中。

CyberLynxO的博客 1982

pb 交叉报表合计放前面

要点:将一计算列放在动态列前面,计算列的值是合计值,待retrieve后再将后面的合计值隐藏。如果是子复合窗口的子窗口,要先将staticmode设置为yes,示例如下:  dwc_child.modify(datawindow.crosstab.staticmode=yes) dwc_child.Modify("grand_sum_jine.Visible=0")dwc_

比目鱼的专栏 3033

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

常用的几种交互表存储过程的实现方法

第一种:通用的针对单表用的交叉表存储过程if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N[dbo].[p_qry])  and  OBJECTPROPERTY(id,  NIsProcedure)  =  1)  drop  procedure  [dbo].[p_qry]

荣植华的专栏 2761

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

交叉报表处理实例

两种比较特殊的交叉数据报表处理 --示例数据:CREATE TABLE tb(ID varchar(10),NGNO char(1),QTY int)INSERT tb SELECT 200505,A,10UNION ALL SELECT 200505,B,20UNION ALL SELECT 200505,C,30UNION ALL SELECT 200506,B

zjcxc(邹建)的Blog - SQL Server 4199

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

交叉报表

if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[tabone]) and OBJECTPROPERTY(id, NIsUserTable) = 1)drop table [dbo].[tabone]GOCREATE TABLE [dbo].[tabone] ( [id] [int] IDENTIT

hgxl的专栏 688

PB两层学习总结

  经过一周时间的学习,我对PB两层结构的有了一定认识与了解,PB语言简洁,容易上手,比较适合快速开发,并且直接对数据库进行操作,易于呈现。现已掌握了基本的对数据库增删改查的操作,总结如下: 1. PB开发数据库应用程序,在应用程序中运用数据窗口的过程: 1)使用数据窗口画板创建数据窗口对象; 2)在窗口上放置数据窗口控件; 3) 通过属性设置或是编码将数据库窗口控件与

jilinxianzh的专栏 622
上一篇: SQL交叉表实例
下一篇: JSF(Java Server Face)与在Web UI实现托拽式快速开发的应用
am2000
博客等级 码龄26年 51粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值